ArDos / дозиметр, продолжение темы, часть №2

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Enjoy - Интересный обзор получился)) У меня только вопрос, вы мелодию тревоги поменяли или что-то сломалось??
Вообще физический выключатель не обязательно ставить, прибор же можно программно выключить) На неисправном счётчике можно попробовать занизить напряжение питания, чувствительность конечно немного упадет, но возможно получится его заставить ещё поработать)

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

 Mambavamba14, ничего не менял, да и ломаться там нечему... Видимо так случайно вышло. Главное, что всё работает. На сбросы не обращаю внимания - свою функцию радиометр полностью выполняет, за что вам большое спасибо!

 P.S. Без физического выключателя как-то неполноценно и неспокойно мне :)

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Enjoy - Я имею ввиду в прошивке сломалось) По всей видимости так оно и есть... Так а вы не пробовали загрубить коэффициент поправки на фон? Вот так например:

const float coef_back_mass[MASS_BACK] PROGMEM = { //массив коэффициентов поправки на текущий фон(1.00..10.00)
  6.00, //0-й порог
  5.00, //1-й порог
  3.00, //2-й порог
  2.50, //3-й порог
  2.00, //4-й порог
  1.75, //5-й порог
  1.50  //6-й порог
};
Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

 В скетче ничего не трогал, что касаемо мелодии (возможно неоднократное нажатие на кнопку для сброса тревоги дало такой эффект(?)), а вот коэффициент поправки на фон нужно будет попробовать, спасибо.

 P.S. Попробовал изменить коэф. поправки уже на Полыни, где и СБМ-20 другой стоит. Проблема всё та же. Может работа OLED'а жрет производительность и алгоритм страдает от этого каким-то боком - я не знаю, но вот такая бяка есть. Но по сути задачу свою ArDos выполняет даже со сбросом :)

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Enjoy - Ды нет, это тут не причем. Проблему нашёл, исправил и перезалил.

А так? Нет, производительность тут не причем. Слишком большая разница в импульсах при ерф, судя по графику, в какие-то моменты слишком много импульсов, в какие-то вообще нет... Попробуйте поставить электролит(10-47мкФ) и керамику(0.1мкФ) по питанию как можно ближе ко входу питания мк, может от преобразователя шумы проскакивают...

const float coef_back_mass[MASS_BACK] PROGMEM = { //массив коэффициентов поправки на текущий фон(1.00..10.00)
  7.00, //0-й порог
  6.00, //1-й порог
  3.00, //2-й порог
  2.50, //3-й порог
  2.00, //4-й порог
  1.75, //5-й порог
  1.50  //6-й порог
};

 

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

 По умолчанию так и делаю: 47-100 мк + 0.1 мк (от ВЧ наводок) в керамике на выводы питания, как можно ближе к МК. К тому же в двух экземплярах разных конструктивных исполнений, с разными счетчиками сброс почти идентичный...

 P.S. Сколько слушал на видео в инете работу радиометров на основе СБМ-20, никогда не слышал равномерных импульсов - всегда хаотично и порой с большим интервалом между пролетами квантов.

evrojox
Offline
Зарегистрирован: 09.07.2018

Enjoy пишет:
P.S. Сколько слушал на видео в инете работу радиометров на основе СБМ-20, никогда не слышал равномерных импульсов - всегда хаотично и порой с большим интервалом между пролетами квантов.

полностью согласен. Может 1 за 30 сёк прилететь, потом 5 за 2сек.

evrojox
Offline
Зарегистрирован: 09.07.2018

Enjoy пишет:
P.S. Сколько слушал на видео в инете работу радиометров на основе СБМ-20, никогда не слышал равномерных импульсов - всегда хаотично и порой с большим интервалом между пролетами квантов.

полностью согласен. Может 1 за 30 сёк прилететь, потом 5 за 2сек.

evrojox
Offline
Зарегистрирован: 09.07.2018

Enjoy пишет:
P.S. Сколько слушал на видео в инете работу радиометров на основе СБМ-20, никогда не слышал равномерных импульсов - всегда хаотично и порой с большим интервалом между пролетами квантов.

полностью согласен. Может 1 за 30 сёк прилететь, потом 5 за 2сек.

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Enjoy - Само собой, распад вероятностное событие) Так что, последние коэффициенты помогли?

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

Mambavamba14, коэффициенты изменил ещё раз, сбросов стало меньше, но всё же есть...

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

А так?

const float coef_back_mass[MASS_BACK] PROGMEM = { //массив коэффициентов поправки на текущий фон(1.00..10.00)
  8.00, //0-й порог
  6.00, //1-й порог
  3.00, //2-й порог
  2.50, //3-й порог
  2.00, //4-й порог
  1.75, //5-й порог
  1.50  //6-й порог
};
Jeep64
Jeep64 аватар
Offline
Зарегистрирован: 04.05.2019

Enjoy, не могли бы вы установить вашу первую прошивку Mod for OLED 128*64 I2C by Lazy_Dragon и сравнить показания на вашем источнике радиации. Интересно большая ли будет разница в показаниях на прошивке от mambavamba14?

 

/* ArDOs   v105 без режима сна
 *  Mod for OLED 128*64 I2C by Lazy_Dragon
***Дозиметр на Ардуино
***IDE Arduino 1.8.5
  ветка форума arduino.ru/forum/proekty/delaem-dozimetr
  сайт srukami.inf.ua/ardos.html
*/
#include <util/delay.h> //уже есть
#include <EEPROM.h>//уже есть
#include <OLED_I2C.h>


//настройки /////////////начало
OLED myGLCD(SDA, SCL); //подключение дисплея
#define contrast 65 //контрастность дисплея
byte treviga_1 = 30; //первая ступень тревоги
byte treviga_2 = 60; //вторая ступень тревоги
byte ton_BUZZ = 70; //тональность буззера
#define  ADC_value 186  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)
#define k_delitel 501 //коефициент дельтеля напряжения, зависит от вашего делителя.
byte puls = 2; //тонкая настройка длинны импульса высоковольтного транса
byte scrin_GRAF = 1; //скорость построения графика в секундах
bool buzz_ON = 1;  //включить индикацию бузером (1)
bool podsvetka = 0; //подсветка
bool Lcd_Inv = 0; //разрешение или запрет сна
float opornoe = 1.10; //делить на opornoe/10
#define son_t 40 //время засыпания в секундах
#define save_DOZ 20 //как часто сохранять накопленную доху например каждые 20мкР
//настройки //////////////конец

extern uint8_t SmallFont[], MediumNumbers[], TinyFont[], BigNumbers[];
extern uint8_t logo_bat[], logo_rag[], logo_tr_OLED[], logo_tr[], gif_chast_1[], gif_chast_2[];
volatile int shet = 0;
unsigned long t_milis = 0, gr_milis = 0, lcd_milis = 0, toch_milis = 0;
unsigned long spNAK_milis = 0, time_doza = 75000;
int hv_adc, hv_400, shet_s = 0, fon = 0, shet_gr = 0, shet_n = 0;
int speed_nakT = 0, speed_nak = 0, time_sh_l = 0, MIN, HOUR;
int doza_vr = 0, val_dr_pr = 0, val_dr_OK = 0;
byte mass_p[84];
byte mass_toch[181], m = 0, n_menu = 0, sys_menu = 0, mass_36[37];
byte val_kl = 0, val_ok = 0, menu = 0, zam_180p = 0, zam_36p = 0, gif_x = 0;
float VCC = 0.0, doz_v = 0.0, stat_percent = 99.0;
bool tr = 0, poisk = 1, fonarik = 0, g_fl = 0;
//-------------------------------------------------------------
void setup() {
  Serial.begin(57600);
  ACSR |= 1 << ACD; //отключаем компаратор
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  pinMode(3, INPUT_PULLUP); //кнопка
  pinMode(4, INPUT_PULLUP); //кнопка
  pinMode(7, INPUT_PULLUP); //кнопка
  DDRB |= (0 << 0); PORTB &= ~(1 << 0); //пин пустой 8
  DDRC |= (0 << 4); PORTC &= ~(1 << 4); //пин пустой А4
  DDRC |= (0 << 5); PORTC &= ~(1 << 5); //пин пустой А5
  DDRB |= (1 << 1);//пин фонаря
  DDRC |= (1 << 3);//A3 дисплей GND
  DDRC |= (1 << 2);//A2 дисплей Light
  PORTC &= ~(1 << 3); //A3 дисплей GND
  PORTC  |= (1 << 2); //A2 дисплей Light
  eeprom_readS ();
  eeprom_readD ();
  lcd_init();
  attachInterrupt(0, Schet, FALLING);//прерываниям пин 2
  DDRB |= (1 << 5); //пины на выход
  DDRD |= (1 << 5);
  DDRD |= (1 << 6);
  DDRD |= (1 << 6);//пин бузера
  nakachka();
}
//-------------------------------------------------------------
void loop() {
  if (menu == 0) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      _delay_ms(500);//антидребезг
      menu = 3;
      shet = 0; zam_180p = 0; fon = 0;
      stat_percent = 99.0;
      if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
        val_kl++;
        if (val_kl == 6) {
          val_kl = 0;
          fonarik = !fonarik;
        }
      }
    }
  }
  if (fonarik == 0) { //фонарик
    PORTB &= ~(1 << 1);//пин фонаря
  } else if (fonarik == 1) {
    PORTB |= (1 << 1);//пин фонаря
  }
  if (podsvetka == 1) {
    PORTC &= ~(1 << 2); //A2 дисплей Light
  }
  if (podsvetka == 0) {
    PORTC |= (1 << 2); //A2 дисплей Light
  }
 if (millis() - lcd_milis >= 300) { //скорость отрисоаки дисплея
    lcd_milis = millis();
    if (menu == 0) {
      lcd_poisk();//вывод на дисплей режима поиск
      poisk_f();  //вызов функции счёта и набора массива
    }
    if (menu == 1) {
      lcd_menu();//вывод на дисплей меню
      poisk_f(); //вызов функции счёта и набора массива________________________________  
    }
    if (menu == 2) {
      lcd_sys();//вывод на дисплей системного меню
      poisk_f();  //вызов функции счёта и набора массива________________________________
    }
    if (menu == 3) {
      zamer_180s();//вывод на дисплей замер 180сек
    }
  }
  generator();//накачка по обратной связи с АЦП
  if (shet_s != shet) {
    signa ();//подача сигнала о частичке
  }
  if (!(PIND & (1 << PIND3))) { //нажатие ок
    _delay_ms(500);//антидребезг
    OK();
  }
  if (menu == 1) {
    if (!(PIND & (1 << PIND4))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      if (n_menu == 0) {
        treviga_1++;
      }
      if (n_menu == 1) {
        treviga_2++;
      }
      if (n_menu == 2) {
        podsvetka = !podsvetka;
      }
      if (n_menu == 3) {
        Lcd_Inv = !Lcd_Inv;
      }
      if (n_menu == 4) {
        scrin_GRAF++;
        if (scrin_GRAF > 10) {
          scrin_GRAF = 1;
        }
      }
      if (n_menu == 5) {
        buzz_ON = !buzz_ON;
      }
      if (n_menu == 6) {
        menu = 0;
      }
      if (n_menu == 7) {
        eeprom_wrS ();
        menu = 0;
      }
    }
  }
  if (menu == 2) {
    if (!(PIND & (1 << PIND4))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      if (sys_menu == 0) {
        opornoe = opornoe + 0.01;
        if (opornoe < 0.98) {
          opornoe = 1.20;
        }
        if (opornoe > 1.20) {
          opornoe = 0.98;
        }
      }
      if (sys_menu == 1) {
        puls++;
        if (puls < 1) {
          puls = 10;
        }
        if (puls > 10) {
          puls = 1;
        }
      }
      if (sys_menu == 2) {
        time_doza = 0;//сброс накопленной дозы
        doz_v = 0;//сброс накопленной дозы
        eeprom_wrD();
        myGLCD.clrScr();
        myGLCD.setFont(SmallFont);
        myGLCD.print("SBROS OK", CENTER, 24);
        myGLCD.update();
        _delay_ms(1000);
      }
      if (sys_menu == 3) {
        menu = 0;
      }
      if (sys_menu == 4) {
        eeprom_wrS ();
        menu = 0;
      }
    }
  }
  if (menu == 1) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      _delay_ms(500);//антидребезг
      if (n_menu == 0) {
        treviga_1--;
      }
      if (n_menu == 1) {
        treviga_2--;
      }
      if (n_menu == 2) {
        podsvetka = !podsvetka;
      }
      if (n_menu == 3) {
        Lcd_Inv = !Lcd_Inv;
      }
      if (n_menu == 4) {
        scrin_GRAF--;
        if (scrin_GRAF < 1) {
          scrin_GRAF = 10;
        }
      }
      if (n_menu == 5) {
        buzz_ON = !buzz_ON;
      }
      if (n_menu == 6) {
        menu = 0;
      }
      if (n_menu == 7) {
        eeprom_wrS ();
        menu = 0;
      }
    }
  }
  if (menu == 2) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      _delay_ms(500);//антидребезг
      if (sys_menu == 0) {
        opornoe = opornoe - 0.01;
        if (opornoe < 0.98) {
          opornoe = 1.20;
        }
        if (opornoe > 1.20) {
          opornoe = 0.98;
        }
      }
      if (sys_menu == 1) {
        puls--;
        if (puls < 1) {
          puls = 10;
        }
        if (puls > 10) {
          puls = 1;
        }
      }
      if (sys_menu == 2) {
        time_doza = 0;//сброс накопленной дозы
        doz_v = 0;//сброс накопленной дозы
        eeprom_wrD();
        myGLCD.clrScr();
        myGLCD.setFont(SmallFont);
        myGLCD.print("SBROS OK", CENTER, 24);
        myGLCD.update();
        _delay_ms(1000);
      }
      if (sys_menu == 3) {
        menu = 0;
      }
      if (sys_menu == 4) {
        eeprom_wrS ();
        menu = 0;
      }
    }
  }
}
//-------------------------------------------------------------
void OK () { //нажатие ОК
  if (!(PIND & (1 << PIND3))) { //удержаиние OK
    val_ok++;
    if (val_ok == 2) {
      val_ok = 0;
      menu = 2;
    }
  }
  if (menu == 2) {
    sys_menu++;
    if (sys_menu > 4) {
      sys_menu = 0;
    }
  }
  if (menu == 1) {
    n_menu++;
    if (n_menu > 7) {
      n_menu = 0;
    }
  }
  if (menu == 0) {
    menu = 1;
  }
  if (menu == 3) {
    menu = 1;
  }
}
//--------------------------------------------------------------
void gif_nabor() {
  myGLCD.setFont(SmallFont);
  myGLCD.drawLine(0, 50, 127, 50); myGLCD.drawLine(0, 63, 127, 63);
  for (int i = 127 - zam_180p * 0.72; i < 127; i++) {
    myGLCD.drawLine(i, 50, i, 63);
  }
  g_fl = !g_fl;
  if (g_fl == 0) {
    myGLCD.drawBitmap(gif_x, 53, gif_chast_1, 8, 8);
  } else {
    myGLCD.drawBitmap(gif_x, 53, gif_chast_2, 8, 8);
  }
  if (zam_180p < 180) {
    gif_x = gif_x + 1;
    if (gif_x >= 123 - zam_180p * 0.72) {
      gif_x = 0;
    }
    myGLCD.print("ANALIZ", CENTER, 40);
  }

  if (zam_180p >= 180) {
    myGLCD.print("OBNOVLENIE", CENTER, 40);
  }
}
//--------------------------------------------------------------
void zamer_180s() {
  myGLCD.clrScr();
  myGLCD.setFont(TinyFont);
  myGLCD.print("ACCURACY", 93, 10);
  myGLCD.setFont(SmallFont);
  myGLCD.printNumF(stat_percent, 1, 93, 18, '.', 4); myGLCD.print("%", 117, 18);
  myGLCD.setFont(BigNumbers);
  myGLCD.drawRect(0, 0, 88, 30);
  if (fon >= 1000) {
    float mZV = float(fon) / 1000;
    myGLCD.printNumF(mZV, 1, 4, 4, '.', 4, '0');
    myGLCD.setFont(SmallFont); myGLCD.print("mR/h", 62, 19);
  }
  if (fon < 1000) {
    myGLCD.printNumI(fon, 4, 4, 4, '0');
    myGLCD.setFont(SmallFont); myGLCD.print("uR/h", 62, 19);
  }

  gif_nabor();
  battery();
  myGLCD.update();
  if (millis() - toch_milis >= 1000) {
    toch_milis = millis();
    for (int i = 0; i < 180; i++) { //сдвигаем
      mass_toch[i] = mass_toch[i + 1];
    }
    mass_toch[179] = shet;
    shet = 0;
    if (zam_180p < 180) { //первый набор массива
      zam_180p++;
      int fon_vr1 = 0;
      for (int i = 180 - zam_180p; i < 180; i++) {
        fon_vr1 = fon_vr1 + mass_toch[i];
      }
      fon = fon_vr1 * (18.0 / zam_180p);
    }
    if (zam_180p >= 180) { //набор массива
      int fon_vr1 = 0;
      for (int i = 0; i < 180; i++) {
        fon_vr1 = fon_vr1 + mass_toch[i];
      }
      fon = fon_vr1 / 10;
    }
    if (zam_180p <= 36) {
      stat_percent = stat_percent - 2.0;
    }
    if (zam_180p > 36 && zam_180p <= 72) {
      stat_percent = stat_percent - 0.3;
    }
    if (zam_180p > 72 && zam_180p <= 100) {
      stat_percent = stat_percent - 0.2;
    }
    if (zam_180p > 100 && zam_180p <= 180) {
      stat_percent = stat_percent - 0.1;
    }
    if (stat_percent < 5) {
      stat_percent = 5.0;
    }
  }
  if (!(PIND & (1 << PIND7))) { //нажатие <<<
    _delay_ms(500);//антидребезг
    menu = 0;
    shet = 0; fon = 0; zam_36p = 0;
    for (int i = 0; i < 18; i++) { //чистим
      mass_36[i] = 0;
    }
    if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
      val_kl++;
      if (val_kl == 6) {
        val_kl = 0;
        fonarik = !fonarik;
      }
    }
  }
}
//--------------------------------------------------------------
void lcd_poisk() {//вывод на дисплей режима поиск
  if (shet < treviga_1 && fon < treviga_1) {//проверяем тревогу
    tr = 0;
  }
  if (shet > treviga_1 || fon > treviga_1) {//проверяем тревогу
    tr = 1;
  }

  myGLCD.clrScr();
  if (tr == 1) { //опасно
    myGLCD.drawBitmap(91, 29, logo_tr_OLED, 32, 32);
  }
  else myGLCD.drawCircle(107, 45, 2);
  myGLCD.setFont(BigNumbers);
  myGLCD.drawRect(0, 0, 88, 41);
  myGLCD.drawRect(0, 30, 88, 63);
  if (fon >= 1000) {
    float mZV = float(fon) / 1000;
    myGLCD.printNumF(mZV, 1, 4, 4, '.', 4, '0');
    myGLCD.setFont(SmallFont); myGLCD.print("mR/h", 62, 19);
  }
  if (fon < 1000) {
    myGLCD.printNumI(fon, 4, 4, 4, '0');
    myGLCD.setFont(SmallFont); myGLCD.print("uR/h", 62, 19);
  }

  time_d ();
  myGLCD.setFont(TinyFont);
  myGLCD.print("ACCURACY", 93, 10);
  myGLCD.printNumI(HOUR, 2, 34);
  if (HOUR >= 9) {
    myGLCD.print("h", 15, 34);
  }
  if (HOUR < 9) {
    myGLCD.print("h", 7, 34);
  }
  myGLCD.printNumI(MIN, 20, 34);
  if (MIN >= 9) {
    myGLCD.print("m", 28, 34);
  }
  if (MIN < 9) {
    myGLCD.print("m", 25, 34);
  }
  myGLCD.setFont(SmallFont);
  if (doz_v < 1000) {
    myGLCD.printNumF(doz_v, 1, 35, 33, '.', 6); myGLCD.print("uR", 72, 33);
  }
  if (doz_v >= 1000) {
    myGLCD.printNumF(doz_v / 1000.0, 2, 35, 33, '.', 6); myGLCD.print("mR", 72, 33);
  }
  myGLCD.printNumF(100 - (zam_36p * 2.2), 1, 93, 18, '.', 4); myGLCD.print("%", 117, 18);


  battery();
  for (int i = 0; i < 5; i++) {
    myGLCD.drawLine(1, (4 * i) + 46, 4, (4 * i) + 46);
  }
  for (int i = 0; i < 82; i ++) { //печатаем график
    if (mass_p[i] > 0) {
      if (mass_p[i] <= 20) {
        myGLCD.drawLine(i + 5, 63, i + 5, 63 - mass_p[i]);
      }
      if (mass_p[i] > 20) {
        myGLCD.drawLine(i + 5, 63, i + 5, 63 - 20);
      }
    }
  }
  myGLCD.update();
}
//-------------------------------------------------------------
void lcd_menu() { //вывод на дисплей меню
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("OPASN.1", 8, 0); myGLCD.printNumI(treviga_1, 75, 0); myGLCD.print("uR/h", RIGHT, 0);
  myGLCD.print("OPASN.2", 8, 8); myGLCD.printNumI(treviga_2, 75, 8); myGLCD.print("uR/h", RIGHT, 8);
  myGLCD.print("PODSV.", 8, 16); myGLCD.printNumI(podsvetka, 75, 16);
  myGLCD.print("INVERT", 8, 24); myGLCD.printNumI(Lcd_Inv, 75, 24); myGLCD.print("on/off", RIGHT, 24);//usr
  myGLCD.print("POISK R", 8, 32); myGLCD.printNumI(scrin_GRAF, 75, 32); myGLCD.print("SEK", RIGHT, 32);
  myGLCD.print("ZVUK", 8, 40); myGLCD.printNumI(buzz_ON, 75, 40);
  myGLCD.print("OUT", 8, 48);
  myGLCD.print("SAVE", 8, 56);
  myGLCD.print(">", 0, n_menu * 8);
  myGLCD.update();
}
//-------------------------------------------------------------
void lcd_sys() { //вывод на дисплей меню
  VCC_read();
  speed_nakachka ();//скорость накачки имлульсы/сек
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("OPORN", 8, 0); myGLCD.printNumF(opornoe, 2, 44, 0); myGLCD.print("VCC", 75, 0); myGLCD.printNumF(VCC, 2, RIGHT, 0);
  hv_400 = hv_adc * opornoe * k_delitel / 255; //считем высокео перед выводом
  myGLCD.print("NAKAH", 8, 10); myGLCD.printNumI(puls, 75, 10); myGLCD.printNumI(hv_400, RIGHT, 10);
  myGLCD.print("DOZA", 8, 20); myGLCD.print(">>", 75, 20); myGLCD.print("SBROS", RIGHT, 20);
  myGLCD.print("OUT", 8, 30);
  myGLCD.print("SAVE", 8, 40);
  myGLCD.print(">", 0, sys_menu * 10);
  myGLCD.print("SPEED N", 0, 56); myGLCD.printNumI(speed_nak, 50, 56); myGLCD.print("imp/sek", RIGHT, 56);
  myGLCD.update();
}
//-------------------------------------------------------------
void poisk_f() {//режим поиска
  if (poisk == 1) {
    if (millis() - gr_milis >= scrin_GRAF * 1000) { //счет для графика
      gr_milis = millis();
      val_ok = 0;//сброс удержания системного меню
      shet_gr = shet - shet_n;
      if (shet_gr < 0) {
        shet_gr = 1;
      }
      mass_p[m] = shet_gr ;
      shet_n = shet;
      if (m < 82) {
        m++;
      }
      if (m == 82) {
        for (int i = 0; i < 83; i++) {
          mass_p[i] = mass_p[i + 1];
        }
        mass_p[82] = shet_gr;
      }
    }
    if (millis() - toch_milis >= 1000) {
      toch_milis = millis();
      for (int i = 0; i < 36; i++) { //сдвигаем
        mass_36[i] = mass_36[i + 1];
      }
      mass_36[36] = shet;
      if (zam_36p < 36) { //первый набор массива
        zam_36p++;
        fon = fon + shet;
      }
      if (zam_36p >= 36) { //набор массива
        int fon_vr1 = 0;
        for (int i = 0; i < 36; i++) {
          fon_vr1 = fon_vr1 + mass_36[i];
        }
        fon = fon_vr1;
      }
      shet = 0;
      /*
        for (int i = 0; i < 36; i++) {
          Serial.print( mass_36[i]); Serial.print(",");
          }
          Serial.print(","); Serial.print(fon); Serial.println(" ");
      */
      doz_v = doz_v + fon / 100.0 / 36.0;
      time_doza = time_doza + 1;
      if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
        eeprom_wrD ();
        doza_vr = doz_v;
      }
    }
  }
}
//-------------------------------------------------------------
void signa () { //индикация каждой частички звуком светом
  shet_s = shet;
  if ((buzz_ON == 1) && (shet_s > 0))  {//включаем бузер
    PORTB |= (1 << 5); //светодиод
    int d = 30;
    while (d > 0) {
      PORTD |= (1 << 6);
      _delay_us(ton_BUZZ);
      PORTD &= ~(1 << 6);
      _delay_us(ton_BUZZ);
      d--;
    }
    PORTB &= ~(1 << 5);//светодиод
  }
  generator();//накачка по обратной связи с АЦП
}
//-------------------------------------------------------------
void Schet() { //прерывание от счетчика на пин 2
  //detachInterrupt(0);
  shet++;
  //attachInterrupt(0, Schet, FALLING);
}
//-------------------------------------------------------------
void generator() {//накачка по обратной связи с АЦП
  hv_adc  = Read_HV();
  if (hv_adc < ADC_value) { //Значение АЦП при котором на выходе 400В
    int c = puls;
    PORTD |= (1 << 5); //пин накачки
    while (c > 0) {
      asm("nop");
      c--;
    }
    PORTD &= ~(1 << 5);//пин накачки
    speed_nakT++;
  }
}
//-------------------------------------------------------------
void VCC_read() { // Чтение напряжения батареи
  ADCSRA = 0b11100111;
  ADMUX = 0b01101110;//Выбор внешнего опорного+BG
  _delay_ms(5);
  while ((ADCSRA & 0x10) == 0);
  ADCSRA |= 0x10;
  byte resu = ADCH;
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  VCC = (opornoe * 255.0) / resu;
}
//-------------------------------------------------------------
byte Read_HV () 
{
ADCSRA = 0b11100111;
ADMUX = 0b11100110;
for (int i = 0; i < 10; i++) 
  {
    while ((ADCSRA & 0x10) == 0);
    ADCSRA |= 0x10;
  }
int result = 0;
for (int i = 0; i < 10; i++) 
  {
    while ((ADCSRA & 0x10) == 0);
    ADCSRA |= 0x10;
    result += ADCH;
  }
result /= 10;
byte result2 = result;
return result2;
}
//-------------------------------------------------------------

void lcd_init() {
  myGLCD.begin();
  myGLCD.setBrightness(contrast);
  myGLCD.invert(Lcd_Inv);
  myGLCD.clrScr();
  myGLCD.drawBitmap(0, 0, logo_rag, 84, 48);
  myGLCD.setFont(SmallFont);
  myGLCD.print("Arduino+", CENTER, 32);
  myGLCD.print("Dosimetr v1.03", CENTER, 40);
  myGLCD.update();
  delay(1000);
}
//-------------------------------------------------------------
void eeprom_wrS () { //запись настроек в память
  EEPROM.write(0, 222);
  EEPROM.write(1, treviga_1);
  EEPROM.write(2, podsvetka);
  EEPROM.write(3, Lcd_Inv);
  EEPROM.write(4, scrin_GRAF);
  EEPROM.write(5, buzz_ON);
  EEPROM.write(6, puls);
  EEPROM.write(7, opornoe * 100);
  EEPROM.write(8, treviga_2);
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("Save OK", CENTER, 24);
  myGLCD.update();
  _delay_ms(1000);
}
//-------------------------------------------------------------
void eeprom_wrD () { //запись настроек в память время накопления дозы
  byte hi = time_doza >> 8;
  byte low = time_doza;
  EEPROM.write(9, hi);
  EEPROM.write(10, low);
  hi = int(doz_v) >> 8;
  low = int(doz_v);
  EEPROM.write(11, hi);
  EEPROM.write(12, low);
}
//-------------------------------------------------------------
void eeprom_readD () { //чтание настроек из памяти время накопления дозы
  byte hi  = EEPROM.read(9);
  byte low  = EEPROM.read(10);
  time_doza = (hi << 8) | low;
  hi  = EEPROM.read(11);
  low  = EEPROM.read(12);
  doz_v = (hi << 8) | low;

}
//-------------------------------------------------------------
void eeprom_readS () { //чтание настроек из памяти
  if (EEPROM.read(0) == 222) {
    treviga_1 = EEPROM.read(1);
    podsvetka = EEPROM.read(2);
    Lcd_Inv = EEPROM.read(3);
    scrin_GRAF = EEPROM.read(4);
    buzz_ON = EEPROM.read(5);
    puls = EEPROM.read(6);
    opornoe = EEPROM.read(7) / 100.0;
    treviga_2 = EEPROM.read(8);
  }
  _delay_ms(10);
}
//-------------------------------------------------------------
void nakachka() {//первая накачка
  byte n = 0;
  while (n < 30) {
    PORTD |= (1 << 5);//дергаем пин
    int c = puls;
    while (c > 0) {
      asm("nop");
      c--;
    }
    PORTD &= ~(1 << 5);//дергаем пин
    n++;
    _delay_us(100);
  }
}
//-------------------------------------------------------------
void speed_nakachka () { //скорость накачки имлульсы/сек
  if (millis() - spNAK_milis >= 1000) {
    spNAK_milis = millis();
    speed_nak = speed_nakT;
    speed_nakT = 0;
  }
}
//-------------------------------------------------------------
void time_d() {
  HOUR = time_doza / 3600;
  MIN = (time_doza / 60) % 60;
}
//-------------------------------------------------------------
void battery() { //батарейка
  VCC_read();
  myGLCD.drawBitmap(99, 0, logo_bat, 24, 8);
  myGLCD.setFont(TinyFont);
  myGLCD.printNumF(VCC, 2, 103, 2);
}

 

 

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Jeep64 - При низких скоростях счета разницы не будет, до 200имп/с счёт линейный.

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

Wik пишет:

     Всем привет! Давно пользую прибор. И что хочу сказать - наличие коэффициентов, конечно, ускоряет работу прибора при резком повышении фона, но вот стабильность на околофоновых значения хромает. Частые сбросы, скачки фона из за этих самых сбросов, иногда даже срабатывает сигнализация, хотя фон в основном 10-15 мкр, а порог сигнализации 40 мкр. Но это не мешает прыгать цифрам во время сбросов точности, и набора статистики с ноля. Без этих коэффициентов существует только старые прошивки, они значительно стабильнее в этом плане, но, увы нет тех плюшек, что присутствуют в последних прошивках.

     Очень хотелось бы увидеть прошивку, работающую по алгоритмам как v 1.7.1, но со всеми новшествами последней.

 

Не я один такой. Причина всё же НЕ в железе...

Коэффициенты немного сейчас загрубил, но увлекаться не стал, иначе будет дубовый прибор. Сбросы есть, но не так часто, так что нормально.

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

Jeep64 пишет:

Enjoy, не могли бы вы установить вашу первую прошивку Mod for OLED 128*64 I2C by Lazy_Dragon и сравнить показания на вашем источнике радиации. Интересно большая ли будет разница в показаниях на прошивке от mambavamba14?

Jeep64, я изначально использовал эту прошивку и она мне не понравилась, т.к. в режиме "поиск" показания были очень нестабильны и фоновые очень завышал, а в режиме длительного замера "анализ" наоборот были занижены... Так что тут даже сравнивать нечего. Разница если и будет, то явно не в пользу древней прошивки! Смело загружать актуальный скетч от Mambavamba14 и пользоваться :)

evrojox
Offline
Зарегистрирован: 09.07.2018

Добрый вечер коллеги. Как то ранее я подымал вопрос про олед ssd1315 вместо 1306. 1315 подглючивал. Сегодня получил новый. Заодно пропаял тот что был у меня. Естественно протестил. Корректно работают оба. Только разница в размерах. 1306 0.96дюймов, а 1315 аж 1.3, что делает его более читаемым. Пару страниц назад я выкладывал фото сравнения.

evrojox
Offline
Зарегистрирован: 09.07.2018

После сказанного мной выше, Enjoy,Jeep64, надеюсь место под замену хватит.

evrojox
Offline
Зарегистрирован: 09.07.2018

Можете закидать меня тапками, но функционал и все остальное без эстетики ни что. Можно выкинуть на рынок шикарный дозиметр, но страшный как черт. А можно полное гавно, но броское в глаза. Вопрос, какой купят.? Это старый приём маркетинга. Ещё Леонардо да Винчи, затем Фибоначчи вывели Золотое сечение. Пропорции когда взгляду это эстетично. Вспомните нокиа 3310. В чем её популярность? Надёжность? Да. Приём, и тд. Но были ли модели круче? Были. Прошёл все. Менял мобилы как дышал. Так в чем же 3310 была не оспарима. Да в том что по мимо схемотехников её создавали грамотные дизайнеры. Там все подченено золотому сечению. Пропорции экрана, смещеные в бок клавиши навигации. Плохое о ней скажет тот у кого её не было, а сименс а35 был пределом мечты. К чему я это? Мы делаем дозики для себя, чтобы быть в безопасности. Но глядя на труды наших рук иногда берет гордость, красиво черт возьми. А иногда... Да, работают и те и другие. Но с корпусом 150х80 экран 20х30 как корове седло. Это сугубо моё мнение. Там бы 50х70 экранчик. Ну есть во мне эстет. А если честно, то на сбм 20 можно без проблем сделать 100х60х15мм. Главное экраном гармонию не испортить. "Некрасивые самолеты не летают"
Широко известна "крылатая фраза" авиаконструктора А.Н. Туполева (хотя, иногда ее приписывают А.С. Яковлеву и даже О.К. Антонову):

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

Evrojox, так делайте эстетику! Кто ж вам запрещает!?? Покажите здесь готовое устройство... Мы порадуемся за вас.
Я же в условиях войны ничего не собираюсь менять, а тем более в уже готовом работающем устройстве!

толстый
Offline
Зарегистрирован: 10.02.2020

evrojox пишет:
"Некрасивые самолеты не летают" Широко известна "крылатая фраза" авиаконструктора А.Н. Туполева (хотя, иногда ее приписывают А.С. Яковлеву и даже О.К. Антонову):

"Полетит даже табуретка, если к ней приделать достаточно мощный двигатель"(неизвестный инженер-конструктор реактивных двигателей) :)

evrojox
Offline
Зарегистрирован: 09.07.2018

Ну вот, хоть оживился форум. А то тишина.. А если серьёзно, то каждый делает как он хочет и может. И у каждого своя эстетика. Просто как было понять что меня услышали. Я ведь не только для себя заказывал 1315.зато теперь знаю что он работает и меня точно прочли...

evrojox
Offline
Зарегистрирован: 09.07.2018

Enjoy у вас законченное изделие, красиво оформленные. Мне корпуса ни когда не у давались. И против вас не чего не имел. Свое изделие выложу, но позже. Есть причины пока не спешить. Зато я точно теперь уверен что кто захочет повторить на олед не пропустит информацию. Есть 3 типа людей. Одни читают вдумчиво весь форум, другие первую и последнию страницу, затем куча вопросов хотя все разлложено по полочкам, третьи бегло смотрят тему в поиске инфы. И любой намёк на срач обязательно замечают. Так устроен мозг. Это для них. Хотел спрасить что за корпус у вас и его размеры. А так-же про фальш морду.

Cennmax
Cennmax аватар
Offline
Зарегистрирован: 06.09.2019

Всем привет. Корпус дозиметра для 3D принтера кто-нибудь повторял? Чёт как-то не входит в корпус плата, по оси Х меньше, чем плата.
Столько печатать и облом.

Jeep64
Jeep64 аватар
Offline
Зарегистрирован: 04.05.2019

Подскажите будет ли работать на LGT8F328Pнано в место ардуины? Может пробовал кто?

http://aliexpress.ru/item/33003833124.html?spm=a2g2w.cart.0.0.79564aa64QkShx&mp=1&_ga=2.99391646.127868852.1668530069-493059422.1665510034&sku_id=12000030818836022

Пишут что полностью совместима.

Да, EEPROM у них нет. “ (simulate E2PROM) “ В флеше область выделяют.

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Jeep64 - Без изменения кода - маловероятно.

Cennmax - Если вы про корпус который идет вместе с прошивкой - то он был рассчитан под заводские платы от alexadresat.

Cennmax
Cennmax аватар
Offline
Зарегистрирован: 06.09.2019

mambavamba14 пишет:

Jeep64 - Без изменения кода - маловероятно.

Cennmax - Если вы про корпус который идет вместе с прошивкой - то он был рассчитан под заводские платы от alexadresat.

Блин, Ну заводские или нет, какая разница? Размеры же платы одинаковые.

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Jeep64 - Совместимы по распиновке, но аппаратно, хотя и большая часть регистров совпадает. У неё например нету еепром.

Cennmax - Имелось ввиду, что с неё снимались размеры насколько я помню. Можно просто подрезать лишний текстолит, плата же не на см выпирает)

Cennmax
Cennmax аватар
Offline
Зарегистрирован: 06.09.2019

Как вариант

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

 Evrojox, корпус как-то брал на радио рынке "на всякий случай", вот пригодился :) Размеры: длина - 110мм., ширина - 65мм., высота - 27мм. В программе FrontDesigner 3.0 по реальным размерам сделал макет "морды", пошел в местный фотосалон и там распечатал на фотобумаге, заламинировал. Вырезал скальпелем отверстия и окно для OLED'a. Прозрачную подложку под дисплей положил и наклеил уже готовую фальш-панель. Готово!

 По теме эстетичности. Думаю, не зачтётся за флуд, но вот на днях переделал "Мастер-1". Преобразователь на 74HC14, мозг - Attiny85 (на форумах гуляет эта схема, но преобразователь там на MC34063). Фото...

  

evrojox
Offline
Зарегистрирован: 09.07.2018

9zip.ru вы про неё? Там ещё в пульте есть на сбт-9.

evrojox
Offline
Зарегистрирован: 09.07.2018

Дали вторую жизнь старому дозику. Корпус не плох. Этот проект я не собирал, 85 нет, а заказывать не стал. Собирал с просторов нета дозик от domosed (был такой и в первой части данного форума, публиковал первую версию, на ютуб вторая) , от самоделки от Сергея, из готовых модулей. Всё на олед. И ардос приглянулся из за олед. По функционалу скажу так, ардос вне конкуренции, затем согласно списка. А главное в ардос для меня тревога, режим сна и отключаемый дисплей. У остальных полного набора моих хотелок нет.

Serhoo
Offline
Зарегистрирован: 02.10.2020

mambavamba14 пишет:

Serhoo, Вот, попробуйте:

//-------------------------------Режим замера----------------------------------------------------------
uint8_t measur_menu(void) //режим замера
{
  uint32_t buff = 0;
  boolean anim = 0; //анимация окончания замера

  alarm_measur = 1; //запрещаем оповещение окончания замера
  next_measur = 1; //поднимаем флаг продолжения замера

  scr = 0; //разрешаем обновления экрана

  while (1) {
    if (_data_update()) { //обработка данных
      _error_messege(); //обработка ошибок
      _measur_massege(); //оповещение об окончании замера

      switch (check_keys()) {
        case DOWN_KEY_HOLD: //удержание кнопки вниз
          fast_light(); //быстрое включение подсветки
          break;

        case DOWN_KEY_PRESS: //клик кнопки вниз
          if (measur) measur_stop(); //если идет замер, спрашиваем нужно ли остановить замер
          else {
            measur = 0; //выключаем замер
            time_switch = 0; //сбрасываем таймер
            next_measur = 1; //сбрасываем флаг следующего замера
            alarm_measur = 1; //разрешаем оповещение оканчания замера
            first_froze = 0; //сбрасываем счетчик 1-го замера
            second_froze = 0; //сбрасываем счетчик 2-го замера
          }
          break;

        case UP_KEY_PRESS: //клик кнопки вверх
          if (measur) measur_stop(); //если идет замер, спрашиваем нужно ли остановить замер
          break;

        case UP_KEY_HOLD: //удержание кнопки вверх
          FLASH_SWITCH; //быстрое включение фонарика
          break;

        case SEL_KEY_PRESS: //клик кнопки выбора
          if (!measur) {
            measur = 1; //включаем замер
            next_measur = 0; //сбрасываем флаг следующего замера
            alarm_measur = 0; //разрешаем оповещение оканчания замера
            first_froze = 0; //сбрасываем счетчик 1-го замера
            second_froze = 0; //сбрасываем счетчик 2-го замера
          }
          else if (next_measur && measur == 1) {
            measur = 2;
            next_measur = 0;
            time_switch = 0;
            alarm_measur = 0;
            anim = 0;
          }
          break;

        case SEL_KEY_HOLD: //удержание кнопки выбора
          if (measur) measur_stop(); //если идет замер, спрашиваем нужно ли остановить замер
          else return MENU_PROGRAM; //выходим в меню
          break;
      }

      if (!scr) {
        scr = 1; //устанавливаем флаг

        clrScr(); //очистка экрана
        task_bar(M_MEASUR_BETA); //отрисовываем фон

        switch (measur) {
          case 0: //результат
            buff = (first_froze < second_froze) ? second_froze - first_froze : 0; //рассчитываем результат замера

            if (next_measur) {
              switch (anim) {
                case 0:
                  print(M_RESULT, CENTER, 24); //результат
                  _init_couts_per_cm2((float)buff / pgm_read_byte(&diff_measuring[mainSettings.measur_pos])); //результат ч/см2*м
                  break;
                case 1:
                  print(M_BACK_OK, CENTER, 24); //ок - замер фона
                  _init_rads_unit(1, buff * (pumpSettings.geiger_time / (pgm_read_byte(&diff_measuring[mainSettings.measur_pos]) * 60)), 1, 4, 1, 8, 0, 54, 16); //результат мкр/ч
                  break;
              }
              anim = !anim;
            }
            else print(M_RESULT, CENTER, 24); //результат

            _init_accur_percent(_init_accur(buff)); //отрисовка точности

            print(M_BACK_I, LEFT, 32); //строка 1 фон
            print("bvg", 66, 32, 1);          //строка 1 имп
#if (TYPE_CHAR_FILL > 44)
            printNumI(first_froze, 28, 32, 6, TYPE_CHAR_FILL); //строка 1
#else
            printNumI(first_froze, 28, 32, 6, 32); //строка 1
#endif

            print(M_SAMP_I, LEFT, 40); //строка 2 обр
            print("bvg", 66, 40, 1);          //строка 2 имп
#if (TYPE_CHAR_FILL > 44)
            printNumI(second_froze, 28, 40, 6, TYPE_CHAR_FILL); //строка 2
#else
            printNumI(second_froze, 28, 40, 6, 32); //строка 2
#endif

            break;

          case 1: //1-й замер
            if (next_measur) {
              switch (anim) {
                case 0: print(M_BACK, CENTER, 24); break; //замер фона
                case 1: print(M_SAMP_OK, CENTER, 24); break; //ок - зам. образца
              }
              anim = !anim;
            }
            else print(M_BACK, CENTER, 24); //замер фона
            setFont(MediumNumbers); //установка шрифта
            printNumI(first_froze, 5, 8, 5, TYPE_CHAR_FILL); //строка 1
            break;

          case 2: //2-й замер
            setFont(MediumNumbers); //установка шрифта
            printNumI(second_froze, 5, 8, 5, TYPE_CHAR_FILL); //строка 1
            print(M_SAMP, CENTER, 24); //замер образца
            break;
        }

        if (measur) { //если идет замер
          printNumI(pgm_read_byte(&diff_measuring[mainSettings.measur_pos]), 50, 40, 2, 32); //минут всего
          print(M_MIN, RIGHT, 40);            //строка 1 мин
#if (TYPE_CHAR_FILL > 44)
          printNumI(((pgm_read_byte(&diff_measuring[mainSettings.measur_pos]) * 60 - time_switch) / 60), 0, 40, 2, TYPE_CHAR_FILL); //минут
#else
          printNumI(((pgm_read_byte(&diff_measuring[mainSettings.measur_pos]) * 60 - time_switch) / 60), 0, 40, 2, 32); //минут
#endif
          print(M_TIME, 12, 40);            //строка 2
          printNumI((pgm_read_byte(&diff_measuring[mainSettings.measur_pos]) * 60 - time_switch) % 60, 18, 40, 2, 48); //секунд

          drawLine(4, 1, map(time_switch, 0, pgm_read_byte(&diff_measuring[mainSettings.measur_pos]) * 60, 5, 82), 0x30); //шкала пройденого времени
        }

        showScr(); //вывод буфера на экран
      }
    }
  }
  return INIT_PROGRAM;
}

 

mambavamba14 - не компилируется на последней прошивке помогите плиз?

GerkOn2
GerkOn2 аватар
Offline
Зарегистрирован: 03.01.2022

Cennmax пишет:

Всем привет. Корпус дозиметра для 3D принтера кто-нибудь повторял? Чёт как-то не входит в корпус плата, по оси Х меньше, чем плата.
Столько печатать и облом.

Я повторял было тоже самое, нужно было плату подтачивать, потом печатал корпус увеличив по всем осям на 1% и так все детали. Тогда садилось все без проблем. Возможно у модели не учтена усадка пластика.

evrojox
Offline
Зарегистрирован: 09.07.2018

Мож кто подскажет как определить проницаемость феррита гантельки?

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

    Измерил потребление своих ArDos'ов.

 Полынь-101... Arduino Pro Mini, OLED. Сон: 1,8 mA. Полное: 7 mA

 В белом корпусе... Arduino Nano, OLED. Без выпаянного стаба. Сон: 4,2 mA. Полное: 9 mA

 Сделал высокоомный вольтметр из стрелочного китайского тестера по приведенной ранее схеме на операционнике LM358. Теперь подстроил уже более точно высокое напряжение преобразователей. Но даже мультиметром с входным сопротивлением 10М довольно точно можно настроить преобразователь, увеличив временно ограничение накачки в скетче. У меня разница составила всего 5-7 Вольт.

 

evrojox
Offline
Зарегистрирован: 09.07.2018

Мож кому интересно. Выкладывал прототип вольтметра.,сейчас он в корпусе. https://arduino.ru/forum/proekty/ardos-dozimetr-chast-%E2%84%961?page=32

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Serhoo - Я честно говоря не помню что там должно быть, но попробуйте:

//-------------------------------Режим замера----------------------------------------------------------
uint8_t measur_menu(void) //режим замера
{
  boolean anim = 0; //анимация окончания замера

  _measur_reset(); //сброс режима замера

  while (1) {
    if (_data_update()) { //обработка данных
      _error_messege(); //обработка ошибок
      _measur_massege(); //оповещение об окончании замера

      switch (check_keys())
      {
#ifdef PCD8544
        case DOWN_KEY_HOLD: //удержание кнопки вниз
          fast_light(); //быстрое включение посветки
          break;
#endif

        case DOWN_KEY_PRESS: //клик кнопки вниз
          if (measur) _measur_stop(); //если идет замер, спрашиваем нужно ли остановить замер
          else _measur_reset(); //сброс режима замера
          break;

        case UP_KEY_PRESS: //клик кнопки вверх
          if (measur) _measur_stop(); //если идет замер, спрашиваем нужно ли остановить замер
          break;

        case UP_KEY_HOLD: //удержание кнопки вверх
          FLASH_SWITCH; //быстрое включение фонарика
          break;

        case SEL_KEY_PRESS: //клик кнопки выбора
          if (!measur) {
            measur = 1; //включаем замер
            next_measur = 0; //сбрасываем флаг следующего замера
            alarm_measur = 0; //разрешаем оповещение оканчания замера
            first_froze = 0; //сбрасываем счетчик 1-го замера
            second_froze = 0; //сбрасываем счетчик 2-го замера
          }
          else if (next_measur && measur == 1) {
            measur = 2;
            next_measur = 0;
            time_switch = 0;
            alarm_measur = 0;
            anim = 0;
          }
          break;

        case SEL_KEY_HOLD: //удержание кнопки выбора
          if (measur) _measur_stop(); //если идет замер, спрашиваем нужно ли остановить замер
          else return MENU_PROGRAM; //выходим в меню
          break;
      }

      if (!scr) {
        scr = 1; //устанавливаем флаг

        clrScr(); //очистка экрана
        _print_task_bar(M_MEASUR_BETA); //отрисовываем фон

        switch (measur) {
          case 0: //результат
            if (next_measur) {
              switch (anim) {
                case 0:
                  print(M_RESULT, CENTER, 24); //результат
                  _print_couts_per_cm2(_measur_get_imp_per_min(measur_imp)); //результат ч*см2/м
                  break;
                case 1:
                  print(M_BACK_OK, CENTER, 24); //ок - замер фона
                  _print_rads_unit(1, measur_back, 1, 4, 1, 8, 0, 54, 16); //результат мкр/ч
                  break;
              }
              anim = !anim;
            }
            else print(M_RESULT, CENTER, 24); //результат

            _print_accur_percent(_get_accur(measur_imp)); //отрисовка точности

            print(M_BACK_I, LEFT, 32); //строка 1 фон
            print("bvg", 66, 32, 1);          //строка 1 имп
#if (TYPE_CHAR_FILL > 44)
            printNumI(first_froze, 28, 32, 6, TYPE_CHAR_FILL); //строка 1
#else
            printNumI(first_froze, 28, 32, 6, 32); //строка 1
#endif

            print(M_SAMP_I, LEFT, 40); //строка 2 обр
            print("bvg", 66, 40, 1);          //строка 2 имп
#if (TYPE_CHAR_FILL > 44)
            printNumI(second_froze, 28, 40, 6, TYPE_CHAR_FILL); //строка 2
#else
            printNumI(second_froze, 28, 40, 6, 32); //строка 2
#endif

            break;

          case 1: //1-й замер
            if (next_measur) {
              switch (anim) {
                case 0: print(M_BACK, CENTER, 24); break; //замер фона
                case 1: print(M_SAMP_OK, CENTER, 24); break; //ок - зам. образца
              }
              anim = !anim;
            }
            else print(M_BACK, CENTER, 24); //замер фона
            setFont(MediumNumbers); //установка шрифта
            printNumI(first_froze, 5, 8, 5, TYPE_CHAR_FILL); //строка 1
            break;

          case 2: //2-й замер
            setFont(MediumNumbers); //установка шрифта
            printNumI(second_froze, 5, 8, 5, TYPE_CHAR_FILL); //строка 1
            print(M_SAMP, CENTER, 24); //замер образца
            break;
        }

        if (measur) { //если идет замер
          printNumI(pgm_read_byte(&diff_measuring[mainSettings.measur_pos]), 50, 40, 2, 32); //минут всего
          print(M_MIN, RIGHT, 40);            //строка 1 мин
#if (TYPE_CHAR_FILL > 44)
          printNumI(((pgm_read_byte(&diff_measuring[mainSettings.measur_pos]) * 60 - time_switch) / 60), 0, 40, 2, TYPE_CHAR_FILL); //минут
#else
          printNumI(((pgm_read_byte(&diff_measuring[mainSettings.measur_pos]) * 60 - time_switch) / 60), 0, 40, 2, 32); //минут
#endif
          print(M_TIME, 12, 40);            //строка 2
          printNumI((pgm_read_byte(&diff_measuring[mainSettings.measur_pos]) * 60 - time_switch) % 60, 18, 40, 2, 48); //секунд

          drawLine(4, 1, map(time_switch, 0, pgm_read_byte(&diff_measuring[mainSettings.measur_pos]) * 60, 5, 82), 0x30); //шкала пройденого времени
        }

        showScr(); //вывод буфера на экран
      }
    }
  }
  return INIT_PROGRAM;
}

 

Serhoo
Offline
Зарегистрирован: 02.10.2020

mambavamba- Спасибо скомпилировалось, нужно показания замера фона и образца в ипмульсах а не в см2/м, все как надо.

laz
Offline
Зарегистрирован: 17.12.2019

Всем добрый день, подскажите версия РАДОН 4.2.3. Меню: Отладка , ИМП ... выше 9.8 кнопками поднять не могу это правильно ?

laz
Offline
Зарегистрирован: 17.12.2019

Всем добрый день, подскажите версия РАДОН 4.2.3. Меню: Отладка , ИМП ... выше 9.8 кнопками поднять не могу это правильно ?

laz
Offline
Зарегистрирован: 17.12.2019

Всем добрый день, подскажите версия РАДОН 4.2.3. Меню: Отладка , ИМП ... выше 9.8 кнопками поднять не могу это правильно ?

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

laz - Да, так и должно быть. Новые значения ИМП не равно старым значениям, теперь это длительность импульса в микросекундах. 9.8 это примерно 30 старых единиц.

laz
Offline
Зарегистрирован: 17.12.2019

Добрый вечер, проявился вопрос. При работе дозиметра 1час-полтора , я так понимаю идёт сброс , в этот момент у меня фон показывает когда 45 мКр; когда 75 мКр. И так же есть проблема как пост 632 низкий заряд конвектора и перегруз иногда , все проверено соплей нет , напряжение ВВ мерил осликом на конденсаторе 407, да и так у меня на двух дозиметрах. Ещё если прислушаться идёт треск На плате даже без СБМ.Что то проект молчит . Все он уже закрыт. Жаль … 

evrojox
Offline
Зарегистрирован: 09.07.2018

С наступающим Новым Годом. Пусть он будет мягким и пушисты

evrojox
Offline
Зарегистрирован: 09.07.2018

Понадобился мне для нового дозика вольтметр с очень много омным входом. Старый с 330 мом не стал справляться. Требования просты.Вход 5 гом. напряжение измерения 2кв. Подобный есть у Шодан. Микрон гига вольт. Но надо было проще. Решение было простым. Позаимствовать часть схемы от вышеуказанного вольтметра, то есть оу с обвязкой, а вместо мк использовать вольтметр от своего старого вольтметра. ссылку на прототип я давал чуть выше. Единственное что требовалось это изменить кооф делителя на 1000 к 1. Замена резистора 2.7 на 5 мом. Но зная что все имеет погрешность поставил 6 мом. а вот для калибровки на выход оу поставил делитель из много оборотника 10 ком . Если кому интересно но не понятно нарисую схему. в проге не умею так что от руки , фото выложу. 

evrojox
Offline
Зарегистрирован: 09.07.2018

Думаю понятно куда и как я поставил делитель. К огрызку проводника с право и на землю.Бусенку не ставил так как работать будет от акума. Сейчас жду лак пластик 71 для покрытия платы.

evrojox
Offline
Зарегистрирован: 09.07.2018
evrojox
Offline
Зарегистрирован: 09.07.2018

кстати. схема вольтметра Enjoy позволяет использовать делитель и помощней

Cennmax
Cennmax аватар
Offline
Зарегистрирован: 06.09.2019

Братва привет. От аккумулятора nokia уже работает дозиметр 3 день, без остановки. Это нормально? Потребляемый ток померить лень