ArDos / дозиметр, часть №1

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

Да и если у вас новый проэкт, хотелось бы экран другой по симпатичней не  Nokia

OfficialGalkin
OfficialGalkin аватар
Offline
Зарегистрирован: 29.06.2019

Экран другой. На нокии маловато разрешение.

Sergei H.
Offline
Зарегистрирован: 17.11.2018

https://www.dropbox.com/s/ztkx1vq70pf8bq2/ardosv1_03.lay6?dl=0 Печатка под ардуино нано.Может кому надо.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Sergei H., если ещё не вытравили -  добавьте подтяжки на кнопки и супрессор в преобразователь. Конденсатор на высокой стороне не менее 100n (0.1mF) x 630V. А вообще за основу лучше было брать плату alexadresat, печатка srukami скорее тестовая. Плюс на ней отсутствуют вибра, фонарик, усилитель бузера и контроллер заряда.

edcase
edcase аватар
Offline
Зарегистрирован: 30.01.2019

Подскажите - это нормально , когда на одном месте фон колеблется 16.....24 микрорентген в час   /СБМ_20 без  свинцового экрана/   ???

 

 

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Да, разброс показаний при ЕРФ может быть весьма заметным.

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

Внимание! Проект более не поддерживается в виду нецелесообразности схемотехники!!!

Всем доброго дня!

Вот хочу поделиться своим вариантом исполнения дозиметра.

Все необходимые файлы, библиотеки и схемы в архиве по ссылке https://yadi.sk/d/iBOguU24BpG5RA (последняя версия v1.7/1.7.1 от 21.04.20)

Трансформатор используется от CCFL подсветки ноутбуков(но можно намотать и свой).

По вопросам писать на почту mambavamba14@yandex.ru

//Версия программы v1.7.1 manual 21.04.20
//Основана на проекте https://github.com/project37cat/gca01
//Желательна установка лёгкого ядра https://alexgyver.github.io/package_GyverCore_index.json
//Используется дисплей 5110, внешние прирывания и таймеры

#include <GyverButton.h>
#include <GyverWDT.h>
#include <EEPROMex.h>
#include <LCD5110_SSVS.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <util/delay.h>

LCD5110 LCD(6, 7, 8, 9); //обьявляем дисплей с указанием пинов подключения (CLK, DIN, DC, RST)

#define BUILD " v_1.7.1" //версия сборки прошивки

extern uint8_t SmallFont[]; //указываем наличие массива со шрифтом SmallFont в библиотеке
extern uint8_t RusFont[]; //указываем наличие массива со шрифтом RusFont в библиотеке
extern uint8_t MediumNumbers[]; //указываем наличие массива со шрифтом MediumNumbers в библиотеке

//------Картинки и иконки----------------
extern const uint8_t logo_img[168];
extern const uint8_t setings_img[168];
extern const uint8_t font_img[168];
extern const uint8_t rad_img[128];
extern const uint8_t bat_img[24];
extern const uint8_t bat_crg[24];
extern const uint8_t bat_crgf[24];
extern const uint8_t crg_bat_0_img[256];
extern const uint8_t crg_bat_1_img[256];
extern const uint8_t crg_bat_2_img[256];
extern const uint8_t crg_bat_3_img[256];
extern const uint8_t crg_bat_4_img[256];
extern const uint8_t low_bat_img[128];
extern const uint8_t beep_img[8];
extern const uint8_t beep_off_img[8];
extern const uint8_t beep_waint_img[8];
extern const uint8_t buzz_img[8];
extern const uint8_t buzz_off_img[8];
extern const uint8_t mode1_img[112];
extern const uint8_t mode2_img[112];
extern const uint8_t mode3_img[112];
extern const uint8_t scan_img[8];
extern const uint8_t scan1_img[4];
extern const uint8_t scan2_img[4];
extern const uint8_t scan3_img[4];
extern const uint8_t scan4_img[4];
extern const uint8_t scan5_img[4];
extern const uint8_t scan6_img[4];
extern const uint8_t scan7_img[4];
extern const uint8_t scan8_img[4];

//------Назначаем кнопки----------------
GButton Left(13);
GButton Up(12);
GButton Right(10);
GButton Down(5);
GButton Ok(4);

#define COEF_LIGHT 10 //коэфициент корректировки яркости подсветки (10..50)
uint8_t GEIGER_TIME = 150;  //время измерения, для СБМ-20 36 секунд (1..250)
uint8_t save_DOZ = 20; //как часто сохранять накопленную дозу например каждые 20мкР

boolean SLEEP_DISABLE = 0; //флаг запрет ухода в сон (1 - сон вкл. 0 - сон выкл.)
uint8_t TIME_BRIGHT = 30; //время до отключения подсветки (5..250)
uint8_t TIME_SLEEP = 60; //время до ухода в сон(должно быть больше чем время подсветки) (10..250)

//пределитель Timer1 для пищалки
#define TMR1_PRESCALER  256

//пищалка старт/стоп
#define TIMER1_START       (bitSet(TIMSK1,OCIE1A))
#define TIMER1_STOP        (bitClear(TIMSK1,OCIE1A))

#define DDR_REG(portx)  (*(&portx-1))

//пин пищалки
#define BUZZ_BIT   1 // A1
#define BUZZ_PORT  PORTC

#define BUZZ_CLR   (bitClear(BUZZ_PORT, BUZZ_BIT))
#define BUZZ_SET   (bitSet(BUZZ_PORT, BUZZ_BIT))
#define BUZZ_OUT   (bitSet((DDR_REG(BUZZ_PORT)), BUZZ_BIT))

#define BUZZ_INIT  BUZZ_CLR; BUZZ_OUT

//пин сигнала зарядки A2
#define CRG_BIT   2 // A2
#define CRG_PORT  PORTC

#define CRG_SET   (bitSet(CRG_PORT, CRG_BIT))
#define CRG_INP   (bitClear((DDR_REG(CRG_PORT)), CRG_BIT))
#define CRG_OUT   (bitRead(PINC, CRG_BIT))

#define CRG_INIT  CRG_SET; CRG_INP

//пин сигнала окончания зарядки A3
#define CRGF_BIT   3 // A3
#define CRGF_PORT  PORTC

#define CRGF_SET   (bitSet(CRGF_PORT, CRGF_BIT))
#define CRGF_INP   (bitClear((DDR_REG(CRGF_PORT)), CRGF_BIT))
#define CRGF_OUT   (bitRead(PINC, CRGF_BIT))

#define CRGF_INIT  CRGF_SET; CRGF_INP

//пин кнопки ОК D4
#define OK_BIT   4 // D4
#define OK_PORT  PIND

#define OK_OUT   (bitRead(OK_PORT, OK_BIT))

//пин детектора 1
#define DET_1_BIT   2 // D2
#define DET_1_PORT  PORTD

#define DET_1_SET   (bitSet(DET_1_PORT, DET_1_BIT))
#define DET_1_INP   (bitClear((DDR_REG(DET_1_PORT)), DET_1_BIT))

#define DET_1_INIT  DET_1_SET; DET_1_INP

//пин детектора 2
#define DET_2_BIT   3 // D3
#define DET_2_PORT  PORTD

#define DET_2_SET   (bitSet(DET_2_PORT, DET_2_BIT))
#define DET_2_INP   (bitClear((DDR_REG(DET_2_PORT)), DET_2_BIT))

#define DET_2_INIT  DET_2_SET; DET_2_INP

//пин подсветки
#define LIGHT_BIT   3 // D11
#define LIGHT_PORT  PORTB

#define LIGHT_CLR   (bitClear(LIGHT_PORT, LIGHT_BIT))
#define LIGHT_SET   (bitSet(LIGHT_PORT, LIGHT_BIT))
#define LIGHT_OUT   (bitSet((DDR_REG(LIGHT_PORT)), LIGHT_BIT))

#define LIGHT_INIT  LIGHT_CLR; LIGHT_OUT

volatile uint16_t rad_buff[250]; //массив секундных замеров для расчета фона

uint16_t wdt_period; //период тика wdt
uint8_t TIME_FACT; //секундные интервалы

volatile uint32_t rad_sum; //сумма импульсов за все время
volatile uint32_t rad_back; //текущий фон
volatile uint32_t rad_max; //максимальный фон
volatile uint32_t rad_dose; //доза
volatile uint32_t rad_scan; //поиск

volatile uint32_t time_millis; //счетчик реального времени
uint32_t time_save; //время из памяти
uint32_t rad_dose_save; //доза из памяти
uint32_t time_save_old; //предыдущее значение времени
uint32_t rad_dose_save_old; //предыдущее значение дозы

//счетчики времени
uint8_t time_min; //минуты
uint8_t time_hrs; //часы
uint8_t time_days; //дни

uint8_t scr_mode; //режим
uint8_t rad_mode; //режим отображения дозы(мкР/мкЗв)

uint8_t crg; //анимация зарядки
uint8_t bat; //текущий заряд батареи
uint16_t bat_max; //начальный максимальный заряд батареи

volatile boolean scr = 0; //флаг обновления экрана
volatile boolean bat_update = 0; //флаг обновления батареи
volatile boolean alarm = 0; //флаг тревоги
volatile boolean alarm_disable = 0; //флаг запрета тревоги
volatile boolean alarm_wait = 0; //флаг ожидания выключения запрета
boolean buzz_disable = 0; //флаг запрет треска пищалкой
boolean knock_disable = 0; //флаг запрет треска кнопками

uint32_t timer = 0; //время отсчета таймера

uint8_t alarm_level = 50; //уровень тревоги uR/h  (40..250 с шагом 10)

boolean light_lcd = true; //подсветка дисплея
uint8_t contrast = 70; //контрастность дисплея
boolean inverce = false; //инверсия дисплея
uint8_t brightness = 4; // яркость 1-5

uint16_t buff[84]; //буфер графика

uint16_t cnt_pwr; //счетчик ухода в сон

volatile uint16_t cnt_puls; //количество циклов таймера 1 для пищалки
volatile boolean buzz_on; //флаг активности бузера
uint16_t TIMER1_PRELOAD; //частота таймера 1 для пищалки

uint8_t stat_bat(void);
uint8_t check_keys(void);
void low_pwr(void);
void crg_bat(void);
void alarm_warning(void);
void graf(void);
void graf_update(void);
void graf_lcd(uint8_t r, uint8_t p);
void menu(void);
void setings_update(void);
void setings_read(void);

//--------------------------------------Инициализация---------------------------------------------------
void setup(void) //инициализация
{
  DET_1_INIT;
  DET_2_INIT;
  BUZZ_INIT;
  LIGHT_INIT;
  CRG_INIT;
  CRGF_INIT;

  if (!OK_OUT) EEPROM.write(100, 0); //если зажата кнопка ок при запуске, сбрасываем настройки

  if (EEPROM.read(100) != 100) {
    wdt_calibrate();  //если настройки были сброшены, калибруем таймер и восстанавливаем из переменных
    setings_update();
    EEPROM.write(100, 100);
  }
  else {
    setings_read();  //иначе загружаем настройки из памяти
    statistic_read();
  }

  LCD.InitLCD(contrast); //инициализируем дисплей
  LCD.invert(inverce); // инверсия содержимого дисплея

  crg_bat(); //проверяем идет ли зарядка акб

  PRR |= lowByte(_BV(15) | _BV(7) | _BV(2) | _BV(1)); //отключаем все лишнее
  ACSR |= (1 << ACD); // выкл компаратор

  LCD.drawBitmap(26, 0, rad_img, 32, 32);//заставка
  LCD.drawBitmap(0, 32, logo_img, 84, 16);//выводим лого
  LCD.setFont(RusFont); //установка шрифта

  TIMSK1 = 0; //отключаем прерывания Timer1
  TCCR1A = 0; //отключаем шим OC1A/OC1B
  TCCR1B = 0b00000100; //пределитель: 16000000/1024=15625Гц

  TIME_FACT = 100000 / wdt_period; //расчитываем период для секунд

  Watchdog.enable(INTERRUPT_MODE, WDT_PRESCALER_2); //разрешаем прерывания по wdt

  EICRA = 0b00000010; //настраиваем внешнее прерывание по спаду импульса на INT0 INT1
  EIMSK = 0b00000011; //разрешаем внешнее прерывание INT0 INT1

  if (light_lcd) { // включаем подсветку с заданой яркостью, если была включена настройками
    for (int i = 0; i <= brightness * COEF_LIGHT; i++)
    {
      light_pwm(i);
      _delay_ms(5);
    }
  }

  for (uint32_t t = millis() + 700; t > millis() && !check_keys();); //ждём

  LCD.clrScr(); // Очистка экрана

}
//-------------------------------Детектирование частиц--------------------------------------------------------
ISR(INT0_vect) //внешнее прерывание INT0 на пине D2  - считаем импульсы от счетчика 1
{
  if (rad_buff[0] != 65535) rad_buff[0]++; //нулевой элемент массива - текущий секундный замер
  if (++rad_sum > 999999UL * 3600 / GEIGER_TIME) rad_sum = 999999UL * 3600 / GEIGER_TIME; //сумма импульсов

  if (!buzz_disable) buzz_pulse(500, 10); //щелчок пищалкой
}
//-------------------------------Детектирование частиц------------------------------------------------------
ISR(INT1_vect) //внешнее прерывание INT1 на пине D3  - считаем импульсы от счетчика 2
{
  if (rad_buff[0] != 65535) rad_buff[0]++; //нулевой элемент массива - текущий секундный замер
  if (++rad_sum > 999999UL * 3600 / GEIGER_TIME) rad_sum = 999999UL * 3600 / GEIGER_TIME; //сумма импульсов

  if (!buzz_disable) buzz_pulse(500, 10); //щелчок пищалкой
}
//-------------------------прерывание по переполнению wdt - 17.5мс------------------------------------
ISR(WATCHDOG) //прерывание по переполнению wdt - 17.5мс
{
  volatile static uint8_t tmr;

  time_millis += wdt_period; //прибавляем перид wdt

  if (++tmr >= TIME_FACT) //расчет показаний один раз в секунду
  {
    tmr = 0;

    volatile uint32_t tmp_buff = 0;

    for (volatile uint8_t i = 0; i < GEIGER_TIME; i++) tmp_buff += rad_buff[i]; //расчет фона мкР/ч
    if (tmp_buff > 999999) tmp_buff = 999999; //переполнение
    rad_back = tmp_buff;

    if (rad_back > rad_max) rad_max = rad_back; //фиксируем максимум фона

    if (rad_back >= alarm_level) alarm = 1; //превышение фона
    else {
      alarm = 0;  //иначе ждем понижения фона
      if (alarm_wait) alarm_disable = 0;
      alarm_wait = 0;
    }

    graf_update(); //обновляем график

    for (volatile uint8_t k = GEIGER_TIME - 1; k > 0; k--) rad_buff[k] = rad_buff[k - 1]; //перезапись массива
    rad_buff[0] = 0; //сбрасываем счетчик импульсов

    rad_dose = (rad_sum * GEIGER_TIME / 3600); //расчитаем дозу

    bat_update = 0; //устанавливаем флаг для обновления батареи

    if (cnt_pwr < TIME_SLEEP) scr = 0; //устанавливаем флаг для обновления экрана
  }
}
//-----------------------------------------счетчик реального времени---------------------------------------------
void real_time(void)
{
  uint32_t time = time_millis / 100000;

  time_days = time / 60 / 60 / 24;

  time_hrs = (time / 60 / 60) % 24;

  time_min = (time / 60) % 60;
}
//-------------------------режим пониженного энергопотребления----------------------------------------------------
void low_pwr(void)
{
  static uint8_t sleep;
  static uint8_t light;

    if (cnt_pwr < TIME_SLEEP)if (buzz_on)waint_pwr(); else save_pwr();

  if (cnt_pwr == TIME_SLEEP)sleep_pwr();

  else if (cnt_pwr == TIME_SLEEP - 1) {
    LCD.enableSleep();
    sleep = 1;
    buzz_disable = 1;
  }

  else if (cnt_pwr == TIME_BRIGHT) {
    if (light_lcd)light_pwm(0);
    light = 1;
  }

  else if (!cnt_pwr) {
    if (sleep) {
      LCD.disableSleep();
      if (light_lcd)light_pwm(brightness * COEF_LIGHT);
      sleep = 0;
      light = 0;
      buzz_disable = EEPROM.readByte(5);
      scr = 0;
    }
    if (light) {
      if (light_lcd)light_pwm(brightness * COEF_LIGHT);
      light = 0;
    }
  }
}
//-------------------------------------Ожидание----------------------------------------------------------------
void waint_pwr(void)
{
  SMCR = (0x0 << 1) | (1 << SE);  //устанавливаем режим сна idle

  MCUCR = (0x03 << 5); // выкл bod
  MCUCR = (0x02 << 5);

  asm ("sleep");  //С этого момента спим.
}
//-------------------------------------Энергосбережение--------------------------------------------------------
void save_pwr(void)
{
  SMCR = (0x7 << 1) | (1 << SE);  //устанавливаем режим сна EXTPWR

  MCUCR = (0x03 << 5); // выкл bod
  MCUCR = (0x02 << 5);

  asm ("sleep");  //С этого момента спим.
}
//-------------------------------------------Сон---------------------------------------------------------------
void sleep_pwr(void)
{
  SMCR = (0x6 << 1) | (1 << SE);  //устанавливаем режим сна standby

  MCUCR = (0x03 << 5); // выкл bod
  MCUCR = (0x02 << 5);

  asm ("sleep");  //С этого момента спим.
}
//--------------------------------------прерывание Timer1------------------------------------------------------
ISR(TIMER1_COMPA_vect) //прерывание Timer1 - сигнал для пищалки
{
  TCNT1 = TIMER1_PRELOAD; //устанавливаем частоту

  volatile static uint8_t mt;

  if (--cnt_puls <= 0) {
    BUZZ_CLR;  //если циклы кончились, выключаем таймер
    TIMER1_STOP;
    buzz_on = false;
    return;
  }

  switch (mt) {
    case 0: BUZZ_SET; mt = 1; break;
    case 1: BUZZ_CLR; mt = 0; break;
  }
}
//-----------------------------------Аналог tone(), с блекджеком и ...-----------------------------------------
void buzz_pulse(uint16_t freq, uint8_t time) //запускаем функцию (частота в гц; длительность в мс)
{
  cnt_puls = time / float(1.00 / freq * 1000);
  TIMER1_PRELOAD = (65536 - (F_CPU / TMR1_PRESCALER) / freq);
  buzz_on = true;
  TIMER1_START;
}
//--------------------------------------аналог analogWright()----------------------------------------
void light_pwm(uint8_t pwm) //шим заполнение(0-255) D11
{
  if(pwm) {
    bitSet(TCCR2A, COM2A1);
    OCR2A = pwm;
    }
  else {
    bitClear(TCCR2A, COM2A1);
    LIGHT_CLR;
  }
}
//------------------------------------------функция millis()--------------------------------------------------
uint32_t get_millis(void) //функция millis()
{
  return time_millis / 100;
}
//-----------------------------------------проверка кнопок----------------------------------------------------
uint8_t check_keys(void) //проверить клавиатуру
{
  static uint8_t btn;

  if (cnt_pwr > TIME_SLEEP - 1) {
    if (!OK_OUT) {
      cnt_pwr = 0;  //проверяем не пора ли проснуться
      btn = 1;
    } return 0;
  }
  if (btn) {
    if (!OK_OUT)return 0;  //защита от случайного нажатия после выхода из сна
    else btn = 0;
  }

  Right.tick(get_millis());
  if (Right.isClick()) {
    if (!knock_disable) buzz_pulse(2000, 30); //щелчок пищалкой
    cnt_pwr = 0; return 1; //вернем номер кнопки 1
  }
  Up.tick(get_millis());
  if (Up.isClick()) {
    if (!knock_disable) buzz_pulse(2000, 30); //щелчок пищалкой
    cnt_pwr = 0; return 2; //вернем номер кнопки 2
  }
  Down.tick(get_millis());
  if (Down.isClick()) {
    if (!knock_disable) buzz_pulse(2000, 30); //щелчок пищалкой
    cnt_pwr = 0; return 3; //вернем номер кнопки 3
  }
  Left.tick(get_millis());
  if (Left.isClick()) {
    if (!knock_disable) buzz_pulse(2000, 30); //щелчок пищалкой
    cnt_pwr = 0; return 4; //вернем номер кнопки 4
  }
  Ok.tick(get_millis());
  if (Ok.isHold()) {
    cnt_pwr = 0; return 6; //вернем номер кнопки 6
  }
  if (Ok.isClick()) {
    if (!knock_disable) buzz_pulse(2000, 30); //щелчок пищалкой
    cnt_pwr = 0; return 5; //вернем номер кнопки 5
  }
  return 0; //0-кнопка не нажата
}
//-------------------------------тревога----------------------------------------------------------
void alarm_warning(void) //выводим предупреждение
{
  if (alarm && !alarm_disable) { //если тревога не запрещена

    uint8_t n = 0;
    uint8_t i = 0;
    uint32_t rad_alrm = 0;

    cnt_pwr = 0; //обнуляем счетчик
    low_pwr(); //просыпаемся если спали

    uint8_t bd = buzz_disable;  //запомнить настройку звуковой индикации импульсов
    buzz_disable = 1; //запретить звуковую индикацию импульсов

    uint32_t timer_sound = get_millis();
    uint16_t waint = 0;

    scr = 0;

    while (1)
    {
      if (!scr)
      {
        scr = 1;

        LCD.clrScr(); // Очистка экрана
        LCD.setFont(RusFont); //установка шрифта
        LCD.drawBitmap(26, 0, rad_img, 32, 32);
        LCD.print("Nhtdjuf!", CENTER, 32); //Тревога!

        if (rad_back > rad_alrm) rad_alrm = rad_back; //максимум

        LCD.setFont(SmallFont); //установка шрифта

        switch (rad_mode)
        {
          case 0: //мкР
            LCD.print(String(rad_alrm) + " uR/h", CENTER, 40); //фон
            break;
          case 1: //мкЗв
            LCD.print(String(float(rad_alrm / 100.00), 2) + " uSv/h", CENTER, 40); //фон
            break;
        }
      }

      //==================================================================
      if (get_millis() > timer_sound + waint) { //пиликаем волшебную мелодию
        switch (i) {
          case 0: buzz_pulse(1100, 100); i++; waint = 150; timer_sound = get_millis(); break;
          case 1: buzz_pulse(1100, 100); i++; waint = 150; timer_sound = get_millis(); break;
          case 2: buzz_pulse(1100, 100); i++; waint = 150; timer_sound = get_millis(); break;
          case 3: buzz_pulse(1100, 100); i++; waint = 150; timer_sound = get_millis(); break;
          case 4: buzz_pulse(3000, 200); i++; waint = 250; timer_sound = get_millis(); break;
          case 5: buzz_pulse(3000, 200); i++; waint = 250; timer_sound = get_millis(); break;
          case 6: buzz_pulse(1100, 100); i++; waint = 150; timer_sound = get_millis(); break;
          case 7: buzz_pulse(1100, 100); i++; waint = 150; timer_sound = get_millis(); break;
          case 8: buzz_pulse(1100, 100); i = 0; waint = 550; timer_sound = get_millis(); break;
        }
      }
      //==================================================================

      if (check_keys()) //если нажата любая кнопка отключаем тревогу
      {
        LCD.clrScr(); // Очистка экрана
        LCD.setFont(RusFont); //установка шрифта
        LCD.print("Nhtdjuf", CENTER, 16); //Тревога
        LCD.print("jnrk.xtyf!", CENTER, 24); //Отключена!
        n = 0;
        for (uint32_t t = get_millis() + 1000; t > get_millis() && !check_keys();); //ждём
        LCD.clrScr(); // Очистка экрана
        buzz_disable = bd;
        alarm_disable = 1;
        alarm_wait = 1;
        scr = 0;
        return;
      }
    }
  }
}
//-----------------------------------Чтение ацп А0-----------------------------------------------
uint16_t AnalogRead() { // Чтение ацп А0
  ADCSRA = 0b11100111;
  ADMUX = 0b01100000;//Выбор внешнего опорного+A0
  uint16_t result = 0;
  for (int i = 0; i < 10; i++)
  {
    while ((ADCSRA & 0x10) == 0);
    ADCSRA |= 0x10;
    result += ADC >> 6;
  }
  result /= 10;
  ADCSRA &= ~ (1 << ADEN); // выкл ацп
  return result; //read 10 bit value
}
//-----------------------------------Заряд батареи-----------------------------------------------
uint8_t stat_bat(void) //заряд батареи
{
  if (!bat_update) { //если прошла секунда
    bat_update = 1;

    if (!SLEEP_DISABLE && cnt_pwr < TIME_SLEEP) cnt_pwr++; // если сон не запрещен

    uint16_t adc_result = AnalogRead(); //состояние батареи

    if (adc_result > 580) { //мин.напр. 3v макс.нап. 4,2v
      if (adc_result < bat_max)bat_max = adc_result; //ищем наименьшее значение заряда
      else if (!bat_max)bat_max = adc_result; //если 0, то это первое включение
      if (bat_max > 780)bat = 24; //если батарея заряжена
      else { //иначе расчитывает указатель заряда батареи
        bat = map(bat_max, 580, 780, 3, 23);
        bat = constrain(bat, 3, 23);
      }
    }
    else bat = 0;
    //--------------------------------------------------------------------------------------
    if (get_millis() > timer && bat < 5) { //Если таймер истек и заряд ниже 3v, то выводим предупреждение

      uint8_t bd = buzz_disable;  //запомнить настройку звуковой индикации импульсов
      buzz_disable = 1; //запретить звуковую индикацию импульсов

      uint8_t i = 0;
      uint16_t waint = 0;
      uint32_t timer_sound = get_millis();

      LCD.clrScr(); // Очистка экрана
      LCD.drawBitmap(26, 0, low_bat_img, 32, 32);
      LCD.setFont(RusFont); //установка шрифта
      LCD.print("<fnfhtz", CENTER, 32); //Батарея
      LCD.print("hfphz;tyf!", CENTER, 40); //разряжена!

      for (uint32_t t = get_millis() + 1000; t > get_millis() && !check_keys();) { //ждём
        //--------------------------------------------------------------------------------------
        if (millis() > timer_sound + waint) { //пиликаем волшебную мелодию
          switch (i) {
            case 0: buzz_pulse(3000, 200); i++; waint = 200; timer_sound = get_millis(); break;
            case 1: buzz_pulse(2000, 200); i++; waint = 200; timer_sound = get_millis(); break;
            case 2: buzz_pulse(1000, 200); i = 0; waint = 600; timer_sound = get_millis(); break;
          }
        }
        //--------------------------------------------------------------------------------------
      }
      timer = get_millis() + 30000; //длительность следующей проверки 30000ms
      LCD.clrScr(); // Очистка экрана
      buzz_disable = bd;
      //--------------------------------------------------------------------------------------
      if (!bat) statistic_update(); //если батарея разряжена
    }
    else if (cnt_pwr > TIME_SLEEP - 1 && !bat) { //если спим и батарея разрядилась

      cnt_pwr = 0; //обнуление счетчика сна
      low_pwr(); //просыпаемся

      uint8_t i = 0;
      uint16_t waint = 0;
      uint32_t timer_sound = get_millis();

      LCD.clrScr(); // Очистка экрана
      LCD.drawBitmap(26, 0, low_bat_img, 32, 32);
      LCD.setFont(RusFont); //установка шрифта
      LCD.print("<fnfhtz", CENTER, 32); //Батарея
      LCD.print("hfphz;tyf!", CENTER, 40); //разряжена!

      for (uint32_t t = get_millis() + 1000; t > get_millis();) { //ждём
        //--------------------------------------------------------------------------------------
        if (millis() > timer_sound + waint) { //пиликаем волшебную мелодию
          switch (i) {
            case 0: buzz_pulse(3000, 200); i++; waint = 200; timer_sound = get_millis(); break;
            case 1: buzz_pulse(2000, 200); i++; waint = 200; timer_sound = get_millis(); break;
            case 2: buzz_pulse(1000, 200); i = 0; waint = 600; timer_sound = get_millis(); break;
          }
        }
        //--------------------------------------------------------------------------------------
      }
      LCD.clrScr(); // Очистка экрана
      statistic_update();
    }
  }
}
//------------------------------------зарядка в выключенном состоянии---------------------------
void crg_bat(void)
{
  if (!CRGF_OUT || !CRG_OUT) { //если идет зарядка или зарядка окончена

    uint32_t time_m = 0;
    uint16_t k = 0;
    uint8_t n = 0;

    while (OK_OUT && !(CRGF_OUT && CRG_OUT)) //продолжаем инициализацию у-ва по нажатию кнопки ОК
    {

      if (time_m < millis()) { //если пришло время

        if (!CRGF_OUT) n = 4; //если зарядка окончена
        if (!CRG_OUT) if (++n > 4)n = 0; //если идет зарядка

        LCD.clrScr(); // Очистка экрана
        time_m = millis() + 1000; //перезагружаем таймер

        switch (n) {
          case 0: LCD.drawBitmap(10, 8, crg_bat_0_img, 64, 32); break;
          case 1: LCD.drawBitmap(10, 8, crg_bat_1_img, 64, 32); break;
          case 2: LCD.drawBitmap(10, 8, crg_bat_2_img, 64, 32); break;
          case 3: LCD.drawBitmap(10, 8, crg_bat_3_img, 64, 32); break;
          case 4: LCD.drawBitmap(10, 8, crg_bat_4_img, 64, 32); break;
        }
      }
    }
    LCD.clrScr(); // Очистка экрана
  }
}
//-------------------------обновление графика----------------------------------------------------
void graf_update(void)
{
  static uint8_t cnt;
  static uint16_t tm;
  static uint16_t graf;

  graf += rad_buff[0]; //считаем количество частиц для графика
  rad_scan += rad_buff[0]; //считаем общее количество частиц

  if (++cnt >= tm) //расчет показаний в зависимости от фона
  {

    for (uint8_t i = 0; i < 83; i++) {
      buff[i] = buff[i + 1]; //сдвигаем массив
    }
    buff[83] = graf; //новое значение в последнюю ячейку
    graf = 0; //сброс
    cnt = 0; //сброс
  }
  if (rad_back > 2000)tm = 2000; //ускоряем движение графика с увеличением фона
  else tm = rad_back;
  tm = map(tm, 0, 2000, 15, 1);
}
//-------------------------инициализация графика------------------------------------------------------
void graf_init(void)
{
  if (scr_mode == 2) //если режим поиск
  {
    LCD.clrRow(4); //очистка строки 4
    LCD.clrRow(5); //очистка строки 5

    for (uint8_t i = 0; i < 84; i++) {
      graf_lcd(buff[i], i); //инициализируем график
    }
  }
}
//------------------------отрисовка графика---------------------------------------------------------
void graf_lcd(uint8_t r, uint8_t p)
{
  if (r > 14)r = 14;
  if (p < 5)LCD.drawBitmap(0, 32, scan_img, 4, 16);
  switch (r) {
    case 0: LCD.drawBitmap(p, 40, scan1_img, 1, 8); break; //0
    case 1: LCD.drawBitmap(p, 40, scan2_img, 1, 8); break; //1
    case 2: LCD.drawBitmap(p, 40, scan3_img, 1, 8); break; //2
    case 3: LCD.drawBitmap(p, 40, scan4_img, 1, 8); break; //3
    case 4: LCD.drawBitmap(p, 40, scan5_img, 1, 8); break; //4
    case 5: LCD.drawBitmap(p, 40, scan6_img, 1, 8); break; //5
    case 6: LCD.drawBitmap(p, 40, scan7_img, 1, 8); break; //6
    case 7: LCD.drawBitmap(p, 40, scan8_img, 1, 8); break; //7
    case 8: LCD.drawBitmap(p, 40, scan8_img, 1, 8); LCD.drawBitmap(p, 32, scan1_img, 1, 8); break; //8
    case 9: LCD.drawBitmap(p, 40, scan8_img, 1, 8); LCD.drawBitmap(p, 32, scan2_img, 1, 8); break; //9
    case 10: LCD.drawBitmap(p, 40, scan8_img, 1, 8); LCD.drawBitmap(p, 32, scan3_img, 1, 8); break; //10
    case 11: LCD.drawBitmap(p, 40, scan8_img, 1, 8); LCD.drawBitmap(p, 32, scan4_img, 1, 8); break; //11
    case 12: LCD.drawBitmap(p, 40, scan8_img, 1, 8); LCD.drawBitmap(p, 32, scan5_img, 1, 8); break; //12
    case 13: LCD.drawBitmap(p, 40, scan8_img, 1, 8); LCD.drawBitmap(p, 32, scan6_img, 1, 8); break; //13
    case 14: LCD.drawBitmap(p, 40, scan8_img, 1, 8); LCD.drawBitmap(p, 32, scan7_img, 1, 8); break; //14
  }
}
//-----------------------------------Статистика-----------------------------------------
void statistic(void) //статистика
{
  uint8_t n = 0;

  while (1) {

    if (!scr) {
      scr = 1;

      uint32_t dose = rad_dose_save;
      uint32_t time = time_save;

      float vcc_bat = (AnalogRead() / 204.00); //состояние батареи

      LCD.clrScr(); // Очистка экрана
      LCD.setFont(RusFont); //установка шрифта
      LCD.invertText(true);
      LCD.print("  cnfnbcnbrf  ", CENTER, 0); //статистика
      LCD.invertText(false);

      LCD.setFont(SmallFont); //установка шрифта

      switch (rad_mode)
      {
        case 0: //мкР
          LCD.print(String(dose) + " uR", CENTER, 8); //доза:
          break;
        case 1: //мкЗв
          LCD.print(String(float(dose / 100.00), 2) + " uSv", CENTER, 8); //доза:
          break;
      }

      LCD.print(String(time / 60 / 60 / 24) + "d " + String((time / 60 / 60) % 24) + "h " + String((time / 60) % 60) + "m", CENTER, 16); //время:
      LCD.print("vcc bat: ", LEFT, 24); //напряжение акб
      LCD.printNumF(vcc_bat, 2, 54, 24, 46, 4, 48);
      LCD.print("v", RIGHT, 24); //напряжение акб

      LCD.print("build:", LEFT, 32); //версия сборки прошивки
      LCD.print(BUILD, RIGHT, 32); //версия сборки прошивки
      LCD.setFont(RusFont); //установка шрифта

      switch (n) {
        case 0:
          LCD.invertText(true);
          LCD.print(" ds[jl ", LEFT, 40); //выход
          LCD.invertText(false);
          LCD.print(" c,hjc ", RIGHT, 40); //сброс
          break;

        case 1:
          LCD.print(" ds[jl ", LEFT, 40); //выход
          LCD.invertText(true);
          LCD.print(" c,hjc ", RIGHT, 40); //сброс
          LCD.invertText(false);
          break;
      }
    }

    switch (check_keys()) {

      case 4: //left key
        if (n > 0) n--;
        scr = 0;
        break;
      case 1: //right key
        if (n < 1) n++;
        scr = 0;
        break;

      case 5: //select key
        switch (n) {
          case 1:
            time_save = 0;
            rad_dose_save = 0;
            EEPROM.updateLong(13, time_save);
            EEPROM.updateLong(17, rad_dose_save);
            LCD.clrScr(); // Очистка экрана
            LCD.print("Cnfnbcnbrf", CENTER, 16); //Статистика
            LCD.print("c,hjityf!", CENTER, 24); //сброшена!
            for (uint32_t t = get_millis() + 1000; t > get_millis() && !check_keys(););
            n = 0;
            scr = 0;
            break;

          case 0:
            scr = 0;
            return;
        }
    }
  }
}
//------------------------------------Меню------------------------------------------------------
void menu(void)
{
  uint8_t n = 0;

  cnt_pwr = 0; //обнуляем счетчик
  low_pwr(); //просыпаемся если спали

  scr = 0;

  while (1) {

    alarm_warning(); //если фон превышен и тревога не запрещена, выводим сообщение

    if (!scr)
      //+++++++++++++++++++   вывод информации на экран  +++++++++++++++++++++++++
    {
      scr = 1;

      LCD.clrScr(); // Очистка экрана
      LCD.drawBitmap(0, 0, setings_img, 84, 12);
      LCD.setFont(RusFont); //установка шрифта

      switch (n) {
        case 0: //Подсветка
          LCD.invertText(true);
          LCD.print("Gjlcdtnrf&", LEFT, 16); //Подсветка:
          LCD.invertText(false);
          if (!light_lcd) LCD.print("DSRK", RIGHT, 16); else LCD.printNumI(brightness, RIGHT, 16);
          LCD.print("Rjynhfcn&", LEFT, 24); //Контраст:
          LCD.printNumI(contrast, RIGHT, 24);
          LCD.print("Bydthcbz&", LEFT, 32); //Инверсия:
          if (inverce) LCD.print("DRK", RIGHT, 32); else LCD.print("DSRK", RIGHT, 32);
          LCD.print("Cj[h/Ljps&", LEFT, 40); //Сохр.Дозы:
          LCD.printNumI(save_DOZ, RIGHT, 40);
          break;

        case 1: //Контраст
          LCD.print("Gjlcdtnrf&", LEFT, 16); //Подсветка:
          if (!light_lcd) LCD.print("DSRK", RIGHT, 16); else LCD.printNumI(brightness, RIGHT, 16);
          LCD.invertText(true);
          LCD.print("Rjynhfcn&", LEFT, 24); //Контраст:
          LCD.invertText(false);
          LCD.printNumI(contrast, RIGHT, 24);
          LCD.print("Bydthcbz&", LEFT, 32); //Инверсия:
          if (inverce) LCD.print("DRK", RIGHT, 32); else LCD.print("DSRK", RIGHT, 32);
          LCD.print("Cj[h/Ljps&", LEFT, 40); //Сохр.Дозы:
          LCD.printNumI(save_DOZ, RIGHT, 40);
          break;

        case 2: //Инверсия
          LCD.print("Gjlcdtnrf&", LEFT, 16); //Подсветка:
          if (!light_lcd) LCD.print("DSRK", RIGHT, 16); else LCD.printNumI(brightness, RIGHT, 16);
          LCD.print("Rjynhfcn&", LEFT, 24); //Контраст:
          LCD.printNumI(contrast, RIGHT, 24);
          LCD.invertText(true);
          LCD.print("Bydthcbz&", LEFT, 32); //Инверсия:
          LCD.invertText(false);
          if (inverce) LCD.print("DRK", RIGHT, 32); else LCD.print("DSRK", RIGHT, 32);
          LCD.print("Cj[h/Ljps&", LEFT, 40); //Сохр.Дозы:
          LCD.printNumI(save_DOZ, RIGHT, 40);
          break;

        case 3: //Яркость
          LCD.print("Gjlcdtnrf&", LEFT, 16); //Подсветка:
          if (!light_lcd) LCD.print("DSRK", RIGHT, 16); else LCD.printNumI(brightness, RIGHT, 16);
          LCD.print("Rjynhfcn&", LEFT, 24); //Контраст:
          LCD.printNumI(contrast, RIGHT, 24);
          LCD.print("Bydthcbz&", LEFT, 32); //Инверсия:
          if (inverce) LCD.print("DRK", RIGHT, 32); else LCD.print("DSRK", RIGHT, 32);
          LCD.invertText(true);
          LCD.print("Cj[h/Ljps&", LEFT, 40); //Сохр.Дозы:
          LCD.invertText(false);
          LCD.printNumI(save_DOZ, RIGHT, 40);
          break;

        case 4: //Щелчки
          LCD.invertText(true);
          LCD.print("Otkxrb&", LEFT, 16); //Щелчки:
          LCD.invertText(false);
          if (buzz_disable) LCD.print("DSRK", RIGHT, 16); else LCD.print("DRK", RIGHT, 16);
          LCD.print("Pd/Ryjgjr&", LEFT, 24); //Зв.Кнопок:
          if (knock_disable) LCD.print("DSRK", RIGHT, 24); else LCD.print("DRK", RIGHT, 24);
          LCD.print("Nhtdjuf&", LEFT, 32); //Тревога:
          if (alarm_disable) LCD.print("DSRK", RIGHT, 32); else LCD.print("DRK", RIGHT, 32);
          LCD.print("Gjhju&", LEFT, 40); //Порог:
          LCD.printNumI(alarm_level, RIGHT, 40);
          break;

        case 5: //Зв.Кнопок
          LCD.print("Otkxrb&", LEFT, 16); //Щелчки:
          if (buzz_disable) LCD.print("DSRK", RIGHT, 16); else LCD.print("DRK", RIGHT, 16);
          LCD.invertText(true);
          LCD.print("Pd/Ryjgjr&", LEFT, 24); //Зв.Кнопок:
          LCD.invertText(false);
          if (knock_disable) LCD.print("DSRK", RIGHT, 24); else LCD.print("DRK", RIGHT, 24);
          LCD.print("Nhtdjuf&", LEFT, 32); //Тревога:
          if (alarm_disable) LCD.print("DSRK", RIGHT, 32); else LCD.print("DRK", RIGHT, 32);
          LCD.print("Gjhju&", LEFT, 40); //Порог:
          LCD.printNumI(alarm_level, RIGHT, 40);
          break;

        case 6: //Тревога
          LCD.print("Otkxrb&", LEFT, 16); //Щелчки:
          if (buzz_disable) LCD.print("DSRK", RIGHT, 16); else LCD.print("DRK", RIGHT, 16);
          LCD.print("Pd/Ryjgjr&", LEFT, 24); //Зв.Кнопок:
          if (knock_disable) LCD.print("DSRK", RIGHT, 24); else LCD.print("DRK", RIGHT, 24);
          LCD.invertText(true);
          LCD.print("Nhtdjuf&", LEFT, 32); //Тревога:
          LCD.invertText(false);
          if (alarm_disable) LCD.print("DSRK", RIGHT, 32); else LCD.print("DRK", RIGHT, 32);
          LCD.print("Gjhju&", LEFT, 40); //Порог:
          LCD.printNumI(alarm_level, RIGHT, 40);
          break;

        case 7: //Порог
          LCD.print("Otkxrb&", LEFT, 16); //Щелчки:
          if (buzz_disable) LCD.print("DSRK", RIGHT, 16); else LCD.print("DRK", RIGHT, 16);
          LCD.print("Pd/Ryjgjr&", LEFT, 24); //Зв.Кнопок:
          if (knock_disable) LCD.print("DSRK", RIGHT, 24); else LCD.print("DRK", RIGHT, 24);
          LCD.print("Nhtdjuf&", LEFT, 32); //Тревога:
          if (alarm_disable) LCD.print("DSRK", RIGHT, 32); else LCD.print("DRK", RIGHT, 32);
          LCD.invertText(true);
          LCD.print("Gjhju&", LEFT, 40); //Порог:
          LCD.invertText(false);
          LCD.printNumI(alarm_level, RIGHT, 40);
          break;

        case 8: //Сон
          LCD.invertText(true);
          LCD.print("Cjy&", LEFT, 16); //Сон:
          LCD.invertText(false);
          if (SLEEP_DISABLE) LCD.print("DSRK", RIGHT, 16); else LCD.printNumI(TIME_SLEEP, RIGHT, 16);
          LCD.print("Gjlcdtnrf&", LEFT, 24); //Подсветка:
          LCD.printNumI(TIME_BRIGHT, RIGHT, 24);
          LCD.print("Cxtn&", LEFT, 32); //Счёт:
          LCD.printNumI(GEIGER_TIME, RIGHT, 32);
          LCD.setFont(SmallFont); //установка шрифта
          LCD.print(">", RIGHT, 40); //Да
          LCD.setFont(RusFont); //установка шрифта
          LCD.print("C,hjcYfcnhjtr", LEFT, 40); //Сброс Настроек
          break;

        case 9: //Тайм-аут подсветки
          LCD.print("Cjy&", LEFT, 16); //Сон:
          if (SLEEP_DISABLE) LCD.print("DSRK", RIGHT, 16); else LCD.printNumI(TIME_SLEEP, RIGHT, 16);
          LCD.invertText(true);
          LCD.print("Gjlcdtnrf&", LEFT, 24); //Подсветка:
          LCD.invertText(false);
          LCD.printNumI(TIME_BRIGHT, RIGHT, 24);
          LCD.print("Cxtn&", LEFT, 32); //Счёт:
          LCD.printNumI(GEIGER_TIME, RIGHT, 32);
          LCD.setFont(SmallFont); //установка шрифта
          LCD.print(">", RIGHT, 40); //Да
          LCD.setFont(RusFont); //установка шрифта
          LCD.print("C,hjcYfcnhjtr", LEFT, 40); //Сброс Настроек
          break;

        case 10: //Счёт
          LCD.print("Cjy&", LEFT, 16); //Сон:
          if (SLEEP_DISABLE) LCD.print("DSRK", RIGHT, 16); else LCD.printNumI(TIME_SLEEP, RIGHT, 16);
          LCD.print("Gjlcdtnrf&", LEFT, 24); //Подсветка:
          LCD.printNumI(TIME_BRIGHT, RIGHT, 24);
          LCD.invertText(true);
          LCD.print("Cxtn&", LEFT, 32); //Счёт:
          LCD.invertText(false);
          LCD.printNumI(GEIGER_TIME, RIGHT, 32);
          LCD.setFont(SmallFont); //установка шрифта
          LCD.print(">", RIGHT, 40); //Да
          LCD.setFont(RusFont); //установка шрифта
          LCD.print("C,hjcYfcnhjtr", LEFT, 40); //Сброс Настроек
          break;

        case 11: //Сброс настроек
          LCD.print("Cjy&", LEFT, 16); //Сон:
          if (SLEEP_DISABLE) LCD.print("DSRK", RIGHT, 16); else LCD.printNumI(TIME_SLEEP, RIGHT, 16);
          LCD.print("Gjlcdtnrf&", LEFT, 24); //Подсветка:
          LCD.printNumI(TIME_BRIGHT, RIGHT, 24);
          LCD.print("Cxtn&", LEFT, 32); //Счёт:
          LCD.printNumI(GEIGER_TIME, RIGHT, 32);
          LCD.setFont(SmallFont); //установка шрифта
          LCD.invertText(true);
          LCD.print(">", RIGHT, 40); //Да
          LCD.invertText(false);
          LCD.setFont(RusFont); //установка шрифта
          LCD.invertText(true);
          LCD.print("C,hjcYfcnhjtr", LEFT, 40); //Сброс Настроек
          LCD.invertText(false);
          break;
      }
    }
    //+++++++++++++++++++++  опрос кнопок  +++++++++++++++++++++++++++
    switch (check_keys())
    {
      case 1: //right key //прибавляем значения
        switch (n)
        {
          case 0: if (!light_lcd) {
              light_lcd = 1;
              light_pwm(brightness * COEF_LIGHT);
            } else if (brightness < 5) {
              brightness ++;
              light_pwm(brightness * COEF_LIGHT);
            } break;
          case 1: if (contrast < 127) contrast++; LCD.setContrast(contrast); break;
          case 2: inverce = true; LCD.invert(inverce); break;
          case 3: if (save_DOZ < 250) save_DOZ++; break;
          case 4: buzz_disable = 0; break;
          case 5: knock_disable = 0; break;
          case 6: alarm_disable = 0; break;
          case 7: if (alarm_level < 250) alarm_level += 10; break;
          case 8: if (SLEEP_DISABLE) SLEEP_DISABLE = 0; else if (TIME_SLEEP < 250) TIME_SLEEP += 5; break;
          case 9: if (TIME_BRIGHT < TIME_SLEEP - 5) TIME_BRIGHT += 5; break;
          case 10: if (GEIGER_TIME < 250) GEIGER_TIME++; break;
          case 11: setings_reset(); break;
        }
        scr = 0;
        break;
      case 2: //up key вверх
        if (n > 0) n--;
        scr = 0;
        break;
      case 3: //down key //вниз
        if (n < 11) n++;
        scr = 0;
        break;
      case 4: //left key //убавляем значения
        switch (n)
        {
          case 0: if (brightness > 1) {
              brightness --;
              light_pwm(brightness * COEF_LIGHT);
            } else if (light_lcd) {
              light_lcd = 0;
              light_pwm(0);
            } break;
          case 1: if (contrast > 0) contrast--; LCD.setContrast(contrast); break;
          case 2: inverce = false; LCD.invert(inverce); break;
          case 3: if (save_DOZ > 1) save_DOZ--; break;
          case 4: buzz_disable = 1; break;
          case 5: knock_disable = 1; break;
          case 6: alarm_disable = 1; break;
          case 7: if (alarm_level > 40) alarm_level -= 10; break;
          case 8: if (TIME_SLEEP > 10) {
              TIME_SLEEP -= 5;
              if (TIME_BRIGHT == TIME_SLEEP) TIME_BRIGHT -= 5;
            } else SLEEP_DISABLE = 1; break;
          case 9: if (TIME_BRIGHT > 5) TIME_BRIGHT -= 5; break;
          case 10: if (GEIGER_TIME > 5) GEIGER_TIME--; break;
        }
        scr = 0;
        break;
      case 5: //select key //выход из настроек
        setings_save();
        scr = 0;
        return;
      case 6: //hold select key
        statistic(); //статистика
        break;
    }
  }
}
//---------------------------------калибровка wdt---------------------------------------
void wdt_calibrate(void) //калибровка wdt
{
  LCD.InitLCD();
  LCD.setFont(RusFont); //установка шрифта
  LCD.print("yfcnhjqrb", CENTER, 8); //настройки
  LCD.print("gj evjkxfyb.", CENTER, 16); //по умолчанию
  LCD.print("ecnfyjdktys", CENTER, 24); //установлены
  LCD.setFont(SmallFont); //установка шрифта
  LCD.print("Load...", CENTER, 40); //установлены
  for (uint32_t t = millis() + 1000; t > millis();); //ждем
  
  uint32_t timeout = millis()+8000;
  
  while (wdt_period < 1600 || wdt_period > 1850) {
    WDTCSR |= (1 << WDCE) | (1 << WDE); // разрешаем вмешательство
    WDTCSR = 0x40; // таймаут ~ 17 мc
    asm ("wdr"); // сбросили пса
    uint32_t startTime = micros(); // засекли время
    while (!(WDTCSR & (1 << WDIF))); // ждем таймаута
    wdt_period = (micros() - startTime) / 10;
    WDTCSR |= (1 << WDCE) | (1 << WDE); // разрешаем вмешательство
    WDTCSR = 0; // выкл wdt
    if(millis()>timeout){
      LCD.clrScr(); // Очистка экрана
      LCD.setFont(RusFont); //установка шрифта
      
      LCD.invertText(true);
  LCD.print("JIB<RF!", CENTER, 0); //ОШИБКА!
      LCD.invertText(false);
      
  LCD.print("c,jq hf,jns", CENTER, 16); //сбой работы
  LCD.print("nfqvthf!", CENTER, 24); //таймера!
  LCD.setFont(SmallFont); //установка шрифта
  LCD.print("log: "+String(wdt_period), CENTER, 32); //log:
  
  for (uint32_t t = millis() + 3000; t > millis();); //ждем
  
  return;
    }
  }
  EEPROM.updateInt(110, wdt_period);
  LCD.clrScr(); // Очистка экрана
}
//------------------------------------Чтение настроек----------------------------------------------
void setings_read(void) //чтение настроек
{
  light_lcd = EEPROM.readByte(1);
  contrast = EEPROM.readByte(2);
  inverce = EEPROM.readByte(3);
  alarm_disable = EEPROM.readByte(4);
  buzz_disable = EEPROM.readByte(5);
  knock_disable = EEPROM.readByte(6);
  brightness = EEPROM.readByte(7);
  alarm_level = EEPROM.readByte(8);
  SLEEP_DISABLE = EEPROM.readByte(9);
  TIME_BRIGHT = EEPROM.readByte(10);
  TIME_SLEEP = EEPROM.readByte(11);
  GEIGER_TIME = EEPROM.readByte(12);
  save_DOZ = EEPROM.readByte(13);
  wdt_period = EEPROM.readInt(110);
}
//-------------------------------------Обновление настроек--------------------------------------------
void setings_update(void) //обновление настроек
{
  EEPROM.updateByte(1, light_lcd);
  EEPROM.updateByte(2, contrast);
  EEPROM.updateByte(3, inverce);
  EEPROM.updateByte(4, alarm_disable);
  EEPROM.updateByte(5, buzz_disable);
  EEPROM.updateByte(6, knock_disable);
  EEPROM.updateByte(7, brightness);
  EEPROM.updateByte(8, alarm_level);
  EEPROM.updateByte(9, SLEEP_DISABLE);
  EEPROM.updateByte(10, TIME_BRIGHT);
  EEPROM.updateByte(11, TIME_SLEEP);
  EEPROM.updateByte(12, GEIGER_TIME);
  EEPROM.updateByte(13, save_DOZ);
}
//--------------------------------------Чтение статистики----------------------------------------------
void statistic_read(void) //чтение настроек
{
  time_save = EEPROM.readLong(13);
  rad_dose_save = EEPROM.readLong(17);
}
//-------------------------------------Обновление статистики--------------------------------------------
void statistic_update(void) //обновление статистики
{
  static uint8_t rad_dose_old;

  if (rad_dose_old + save_DOZ < rad_dose)
  {
    time_save += (time_millis / 100000) - time_save_old;
    rad_dose_save += rad_dose - rad_dose_save_old;

    time_save_old = time_millis / 100000;
    rad_dose_save_old = rad_dose;

    EEPROM.updateLong(13, time_save);
    EEPROM.updateLong(17, rad_dose_save);

    rad_dose_old = rad_dose;
  }
}
//---------------------------------------Сохранить настройки--------------------------------------------
void setings_save(void) //сохранить настройки
{
  uint8_t n;

  if (light_lcd == EEPROM.readByte(1) && contrast == EEPROM.readByte(2) && inverce == EEPROM.readByte(3) && alarm_disable == EEPROM.readByte(4) &&
      buzz_disable == EEPROM.readByte(5) && knock_disable == EEPROM.readByte(6) && brightness == EEPROM.readByte(7) && alarm_level == EEPROM.readByte(8) &&
      SLEEP_DISABLE == EEPROM.readByte(9) && TIME_BRIGHT == EEPROM.readByte(10) && TIME_SLEEP == EEPROM.readByte(11) && GEIGER_TIME == EEPROM.readByte(12)&& 
      save_DOZ == EEPROM.readByte(13))
    return;

  else {

    LCD.clrScr(); // Очистка экрана
    LCD.setFont(RusFont); //установка шрифта
    LCD.print("Cj[hfybnm", CENTER, 8); //Сохранить
    LCD.print("yfcnhjqrb?", CENTER, 16); //настройки?

    while (1) {
      switch (n) {
        case 0:
          LCD.invertText(true);
          LCD.print("  ytn  ", LEFT, 32); //нет
          LCD.invertText(false);
          LCD.print("  lf  ", RIGHT, 32); //да
          break;

        case 1:
          LCD.print("  ytn  ", LEFT, 32); //нет
          LCD.invertText(true);
          LCD.print("  lf  ", RIGHT, 32); //да
          LCD.invertText(false);
          break;
      }

      switch (check_keys()) {

        case 4: //left key
          if (n > 0) n--;
          break;
        case 1: //right key
          if (n < 1) n++;
          break;

        case 5: //select key
          switch (n) {
            case 1:
              setings_update();
              graf_init();
              LCD.clrScr(); // Очистка экрана
              LCD.print("Yfcnhjqrb", CENTER, 16); //Настройки
              LCD.print("Cj[hfytys!", CENTER, 24); //Сохранены!
              for (uint32_t t = get_millis() + 1000; t > get_millis() && !check_keys(););
              return;

            case 0:
              setings_read();
              graf_init();
              return;
          }
      }
    }
  }
}
//-----------------------------------Сброс на заводские настройки---------------------------------
void setings_reset(void) //сброс на заводские настройки
{
  uint8_t n;

  LCD.clrScr(); // Очистка экрана
  LCD.setFont(RusFont); //установка шрифта
  LCD.print("Ecnfyjdbnm", CENTER, 0); //Установить
  LCD.print("Yfcnhjqrb", CENTER, 8); //настройки
  LCD.print("gj evjkxfyb.?", CENTER, 16); //по умолчанию?

  while (1) {
    switch (n) {
      case 0:
        LCD.invertText(true);
        LCD.print("  ytn  ", LEFT, 32); //нет
        LCD.invertText(false);
        LCD.print("  lf  ", RIGHT, 32); //да
        break;

      case 1:
        LCD.print("  ytn  ", LEFT, 32); //нет
        LCD.invertText(true);
        LCD.print("  lf  ", RIGHT, 32); //да
        LCD.invertText(false);
        break;
    }

    switch (check_keys()) {

      case 4: //left key
        if (n > 0) n--;
        break;
      case 1: //right key
        if (n < 1) n++;
        break;

      case 5: //select key
        switch (n) {
          case 1:
            EEPROM.write(100, 0);
            LCD.clrScr(); // Очистка экрана
            LCD.print("Yfcnhjqrb", CENTER, 0); //Настройки
            LCD.print("C,hjitys!", CENTER, 8); //Сброшены!
            LCD.print("Nht,etncz", CENTER, 24); //Требуется
            LCD.print("Gthtpfuheprf!", CENTER, 32); //Перезагрузка!
            for (uint32_t t = get_millis() + 1000; t > get_millis() && !check_keys(););
            scr = 0;
            return;

          case 0:
            scr = 0;
            return;
        }
    }
  }
}
//----------------------------------Главная-------------------------------------------------------------
void loop(void) //главная
{
  for (;;) {
    low_pwr(); //отключение дисплея и подсветки, уход в сон для экономии энергии
    alarm_warning(); //если фон превышен и тревога не запрещена, выводим сообщение
    stat_bat(); //обновление состояния батареи
    if (!scr) //обновление дисплея
    {
      scr = 1; //сброс флага

      real_time(); //счет и обновление времени
      statistic_update(); //обновление статистики

      LCD.clrRow(0); //очистка строки 0
      LCD.clrRow(1); //очистка строки 1

      LCD.drawBitmap(0, 0, font_img, 84, 14); //устанавлваем фон

      if (!CRGF_OUT) LCD.drawBitmap(57, 0, bat_crgf, 24, 8); //если зарядка окончена
      else if (!CRG_OUT) {
        LCD.drawBitmap(57, 0, bat_crg, 24, 8);  //если идет зарядка
        LCD.drawBitmap(57, 0, bat_crgf, crg, 8);
        if (++crg >= 25)crg = 5;
      }
      else LCD.drawBitmap(57, 0, bat_img, bat, 8); //отображаем состояние батареи
      LCD.setFont(RusFont); //установка шрифта

      switch (scr_mode)
      {
        case 0: LCD.drawBitmap(0, 0, mode1_img, 56, 16); break;  //режим текущего фона
        case 1: LCD.drawBitmap(0, 0, mode2_img, 56, 16); break;  //режим накопленной дозы
        case 2: LCD.drawBitmap(0, 0, mode3_img, 56, 16); break;  //режим поиска
      }

      if (alarm_disable) //если тревога запрещена
      {
        if (alarm_wait) LCD.drawBitmap(76, 8, beep_waint_img, 8, 8); //если ждем понижения фона
        else LCD.drawBitmap(76, 8, beep_off_img, 8, 8);
      }
      else LCD.drawBitmap(76, 8, beep_img, 8, 8);

      if (!buzz_disable && !knock_disable) LCD.drawBitmap(62, 8, beep_img, 8, 8); //если щелчки и зв.кнопок включен
      else if (!buzz_disable) LCD.drawBitmap(62, 8, buzz_img, 8, 8); //если щелчки включены и зв.кнопок выключен
      else if (!knock_disable) LCD.drawBitmap(62, 8, beep_waint_img, 8, 8); //если щелчки выключены и зв.кнопок включен
      else LCD.drawBitmap(62, 8, buzz_off_img, 8, 8); //иначе выключено все

      //+++++++++++++++++++   вывод информации на экран  +++++++++++++++++++++++++

      switch (scr_mode)
      {
        case 0: //режим измерения текущего фона

          LCD.clrRow(2); //очистка строки 2
          LCD.clrRow(3); //очистка строки 3
          LCD.clrRow(4); //очистка строки 4
          LCD.clrRow(5); //очистка строки 5

          switch (rad_mode)
          {
            case 0: //мкР
              if (rad_back < 10000) { //мкР
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumI(rad_back, 1, 16, 4, 48); //строка 1
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("vrH/x", 52, 24);       //строка 1 мкР/ч
              }
              else if (rad_back < 100000) { //мР
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_back) / 1000, 1, 1, 16, 46, 4, 48); //строка 1
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("vH/x", 52, 24);       //строка 1 мР/ч
              }
              else if (rad_back < 1000000) { //Р
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_back) / 1000000, 2, 1, 16, 46, 4, 48); //строка 1
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("H/x", 52, 24);       //строка 1 Р/ч
              }
              //макс
              if (rad_max < 10000) { //мкР
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumI(rad_max, 1, 32, 4, 48); //строка 2
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("vrH/x", 52, 40);       //строка 1 мкР/ч
                LCD.print("vfrc", 55, 32);       //строка 2 Макс.
              }
              else if (rad_max < 100000) { //мР
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_max) / 1000, 1, 1, 32, 46, 4, 48); //строка 2
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("vH/x", 55, 40);       //строка 1 мР/ч
                LCD.print("Vfrc", 55, 32);       //строка 2 Макс.
              }
              else if (rad_max < 1000000) { //Р
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_max) / 1000000, 2, 1, 32, 46, 4, 48); //строка 2
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("H/x", 58, 40);       //строка 1 мкР/ч
                LCD.print("Vfrc", 55, 32);       //строка 2 Макс.
              }
              break;

            case 1: //мкЗв
              if (rad_back < 1000) { //мкЗв
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_back) / 100, 2, 1, 16, 46, 4, 48); //строка 1
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("vrP/x", 52, 24);       //строка 1 мкЗ/ч
              }
              else if (rad_back < 1000000) { //мЗв
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_back) / 100000, 1, 1, 16, 46, 4, 48); //строка 1
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("vP/x", 52, 24);       //строка 1 мЗ/ч
              }
              //макс
              if (rad_max < 1000) { //мкЗв
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_max) / 100, 2, 1, 32, 46, 4, 48); //строка 1
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("vrP/x", 52, 40);       //строка 1 мкЗ/ч
                LCD.print("vfrc", 55, 32);       //строка 2 Макс.
              }
              else if (rad_max < 1000000) { //мЗв
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_max) / 100000, 1, 1, 32, 46, 4, 48); //строка 2
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("vP/x", 55, 40);       //строка 1 мЗ/ч
                LCD.print("Vfrc", 55, 32);       //строка 2 Макс.
              }
              break;
          }
          break;

        case 1: //режим накопленной дозы

          LCD.clrRow(2); //очистка строки 2
          LCD.clrRow(3); //очистка строки 3
          LCD.clrRow(4); //очистка строки 4
          LCD.clrRow(5); //очистка строки 5

          switch (rad_mode)
          {
            case 0: //мкР
              if (rad_dose < 100000) { //мкР
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumI(rad_dose, 1, 16, 5, 48); //строка 1
                LCD.printNumI(time_days, 1, 32, 2, 48); //строка 2
                LCD.printNumI(time_hrs, 37, 32, 2, 48); //строка 2
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("l", 25, 40);            //строка 2
                LCD.print("vrH", 62, 24);          //строка 1 мкР
                LCD.print("&", 63, 40);              //строка 2
                LCD.printNumI(time_min, 70, 40, 2, 48); //строка 2
              }
              else if (rad_dose < 100000000) { //мР
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumI(rad_dose / 1000, 1, 16, 5, 48); //строка 1
                LCD.printNumI(time_days, 1, 32, 2, 48); //строка 2
                LCD.printNumI(time_hrs, 37, 32, 2, 48); //строка 2
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("l", 25, 40);            //строка 2
                LCD.print("vH", 62, 24);          //строка 1 мР
                LCD.print("&", 63, 40);              //строка 2
                LCD.printNumI(time_min, 70, 40, 2, 48); //строка 2
              }

              break;
            case 1: //мкЗв
              if (rad_dose < 100000) { //мкЗ
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_dose) / 100, 1, 1, 16, 46, 5, 48); //строка 1
                LCD.printNumI(time_days, 1, 32, 2, 48); //строка 2
                LCD.printNumI(time_hrs, 37, 32, 2, 48); //строка 2
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("l", 25, 40);            //строка 2
                LCD.print("vrP", 62, 24);            //строка 1 мкЗв
                LCD.print("&", 63, 40);              //строка 2
                LCD.printNumI(time_min, 70, 40, 2, 48); //строка 2
              }
              else if (rad_dose < 100000000) { //мЗв
                LCD.setFont(MediumNumbers); //установка шрифта
                LCD.printNumF(float(rad_dose) / 100000, 1, 1, 16, 46, 5, 48); //строка 1
                LCD.printNumI(time_days, 1, 32, 2, 48); //строка 2
                LCD.printNumI(time_hrs, 37, 32, 2, 48); //строка 2
                LCD.setFont(RusFont); //установка шрифта
                LCD.print("l", 25, 40);            //строка 2
                LCD.print("vP", 62, 24);            //строка 1 мЗв
                LCD.print("&", 63, 40);              //строка 2
                LCD.printNumI(time_min, 70, 40, 2, 48); //строка 2
              }
              break;
          }
          break;

        case 2: //режим сканирования

          LCD.clrRow(2); //очистка строки 2
          LCD.clrRow(3); //очистка строки 3

          LCD.setFont(MediumNumbers); //установка шрифта
          LCD.printNumI(rad_scan, 6, 16, 6, 48); //строка 1

          graf_init(); //строим график
          break;
      }
    }
    //+++++++++++++++++++++  опрос кнопок  +++++++++++++++++++++++++++
    switch (check_keys())
    {
      case 1: //right key //выбор режима
        if (scr_mode < 2) {
          scr_mode++;  //вперёд
          scr = 0;
        }
        break;
      case 2: //up key
        if (++rad_mode > 1)rad_mode = 0; //изменение едениц мкР/мЗв
        scr = 0;
        break;
      case 3: //down key //сброс
        switch (scr_mode)
        {
          case 0: //сбрасываем фон и макс. фон
            for (uint8_t i = 0; i < GEIGER_TIME; i++) rad_buff[i] = 0;
            rad_back = 0;
            rad_max = 0;
            break;
          case 1://сбрасываем дозу и время
            rad_dose_save += rad_dose - rad_dose_save_old;
            rad_dose_save_old = 0;
            rad_sum = 0;
            rad_dose = 0;

            time_save += (time_millis / 100000) - time_save_old;
            time_save_old = 0;
            time_days = time_hrs = time_min = time_millis = 0;
            break;
          case 2://сбрасываем счетчик частиц и график
            rad_scan = 0;
            for (uint8_t i = 0; i < 84; i++) buff[i] = 0;
            graf_init();
            break;
        }
        scr = 0;
        break;
      case 4: //left key //выбор режима
        if (scr_mode > 0) {
          scr_mode--;  //назад
          scr = 0;
        }
        break;
      case 5: //select key //меню
        menu(); //меню
        break;
      case 6: //hold select key //статистика
        statistic(); //статистика
        break;
    }
  }
}

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

mambavamba14, несколько мыслей по оптимизации. КТ815 заменить на такой же полевичок, как у нас в АрДосе (желательно с супрессором), повысит эффективность преобразователя. Диоды на высокой стороне нужны ультрафасты, можно и 4007, но с индексом UF. Высоковольтную ёмкость тоже на порядок выше бы, тем более что она работает на два счётчика. Счётчикам поставить каждому свой анодный десятимегаомный резистор (увеличивая ёмкость при параллельном соединении мы немного снижаем срок жизни счётчика за счёт увеличения ёмкости, плюс при прилёте частицы в один счётчик напряжение просаживается и на втором. В идеале, конечно, считать импульсы независимо на разных пинах.

Обратную связь по напряжению добавить не думали? Лучше по пробою, как в наните.

Посмотрите на рецепт цепей питания от DiHalt'a - его схема позволит с помощью микроконтроллера полностью обесточивать схему (до долей микроампера). Полтора миллиампера для маленького аккумулятора немалый ток, а защита в китайских зарядных модулях отключит акк уже где-то в пределах двух вольт, что ему явно на пользу не пойдёт.

Планирую подобное добавить и в этот проект, но не ранее, чем разберусь со счётом и скоростью реакции.

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

Спасибо за советы, в проектирование печатной платы обязательно учту))

На счет обратной связи думал, пока если честно не знаю, не вижу(знаю) просто в ней какого-то смысла.

Полное отключение питания тоже сделаю уже на печатке, толь вчера вечером об нем думал))

А акб хотел нормальный ставить, хотя бы на 1000, но в макете места просто больше не осталось)

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Контроль высокого желателен. Во-первых характеристика СГ линейна в пределах +-50В, во вторых завышенное напряжение сокращает срок жизни СГ. Можно, конечно, между двумя высоковольтными диодами поставить супрессор на 400 вольт, но это снизит эффективность. Довелось заменить уже не один счётчик в радиометрах без контроля высокого (преобразователи на блокингах), где было завышенное напряжение - более 500 вольт. Беда в том, чтобез электростатического вольтметра (или Микрона ГигаВольт) этого не определишь, все самопальные делители на сотни мегаом вносят сильно большое искажение в результат замера.

Да, ещё. На входы А3 и А2 желательно поставить в разрыв сопротивления по килоому. На фото, если не ошибаюсь, родные резисторы модуля удалены. Лишними точно не будут, а в случае непредвиденных ахтунгов ( © Айзон ) защитят порт.

OfficialGalkin
OfficialGalkin аватар
Offline
Зарегистрирован: 29.06.2019

Ну не на 2-х вольтах. У меня все акб которые есть с защитой, отрубаются на 3-3.2 вольта. У меня сейчас дозиметр потребляет 30 миллиампер. Еще думаю отклбчение дозиметра программно при низком зарядк. 
еще схему включения сделать на транзисторе, что бы микроконтроллер сам поддерживал питание и можно было заблокировать клавиши включая клавишу выключения для носки в кармане. 

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

OfficialGalkin, платки как на фото, с которыми я экспериментировал, при 2,5в на акке вполне себе продолжали работать. По транзистору - сходите по ссылке DiHalt'a (всё уже придумано до нас :) ).

bwn
Offline
Зарегистрирован: 25.08.2014

tekagi пишет:
OfficialGalkin, платки как на фото, с которыми я экспериментировал, при 2,5в на акке вполне себе продолжали работать. .

Поддержу, на акках от треплофонов, только на одном срабатывала на 2,8в, остальные 2,5 и ниже. Можно оставить как последний рубеж, но лучше мониторить дополнительно. ИМХО.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Специально только что подпаял на выход подобной зарядно-защитной платки светодиод с резистором и кинул на лабораторник. Отсечка 2,4 вольта. Строго по даташиту на используемую в ней микру DW01KA.

Птулхианин
Offline
Зарегистрирован: 19.12.2019

vasunomad пишет:

Птулхианин пишет:

Привет всем!

А может кто заказывал изготовление платы ArDos’а у Китайцев? Я бы прикупил такую платку. ЛУТ не моё.  Можно конечно на макетке сколхозить, но хочется сделать «по фэн-шую» :-).

А где можно скачать самую актуальную схему, разводку платы и прошивку к этому всему? Делать буду на Arduino Nano + красный экран Nokia + СМБ-20.

Если Вам не горит на днях закажу. Без суеты сделаю. Но там выходит размер за дешевые параметры и поэтому будет не совсем копеечная. И главный вопрос - Вы на территории России? Если желания совпадут обменяемся почтовыми адресами.

Балин, только сейчас увидел Ваше сообщение. Да, давайте обсудим! Пишите сюда Lechanet@rambler.ru

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

Подскажите, в версии олед 1.05 счетчик улавливает одну частицу на дисплее прибавляется +1 происходит один щелчек но в графике загарается один пиксель и следом сразу второй. Так должно быть? В новых прошивках подругому? Может подскажите что там подправить?

Lazy_Dragon
Offline
Зарегистрирован: 09.03.2017

Получил сегодня на почте датчик дыма с Али.

Внутри мелкий источник Америций-241. В собранном виде фон почти не проявляется, но если аккуратно разобрать, то можно сделать пробный источник излучения. я еще хочу его вклеить в заглушку от трубы на 1/2 и 2 заглушкой закрыть (такой кейс получится)

Мой дозиметр в притык показывает в среднем 250-320 мкР/ч, на расстоянии 15 см (а так же снизу и с боков) уже фоновое значения. Стоит такой датчик около 80р, только вот шел долго, около 2 месяцев, ну и есть очень мизерный шанс, что на таможне возникнут вопросы (и то, если только перед ней разломают корпус)

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Самый безопасный КИ - урановое стекло. И через границу пересылать не надо. Прециосовский бисер 82000 больше 1000 попугаев выдает на СБМ20.

Lazy_Dragon
Offline
Зарегистрирован: 09.03.2017

Бисер, да, знаю. Но в городе так и не нашел по магазинам, так что решил попробовать из китая этот датчик заказать

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

У китайцев есть любопытный КИ под названием "кулон живительной силы", медальон из стекла зелёного цвета с добавкой солей тория, тоже фонит неплохо. Но он бета-излучатель, заказывать страшновато - Янтарь на таможне может узреть.

Есть такие же прозрачные, но они из обычного стекла. (По крайней мере на тот, что достался мне дозиметр  не реагирует никак. Хотя коробочка такая же, и карточка с серийником в комплекте.) Попадались фото с подобными активными кулонами, так что цвет - не гарантия.

Чёрные непрозрачные лавовые фонят, но мажутся активной гадостью.

Про всё это добро упоминал Айзон в одном из видео.

Забыл упомянуть про "ториевые ручки". Тоже не советую, фактически это не шибко герметичная капсула с радиоактивным порошком с содержанием тория.

Прециосовский бисер разного размера и активности есть в "бисер-бусина".

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

Lazy_Dragon подскажите. Какая прошивка у вас сейчас стоит? В старой 1.05 баги не устраняли?

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

Кулон не дешевый!

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Угу. Потому и советую взять урановое стекло в своей стране. Себе взял два пакетика, емнип по 25г. Сделал три пластинчатых ки под размер СБМ, при этом и один пакетик не израсходовал. Типоразмер только мелкий попался, игла не проходит, пришлось медной проволочкой на нить нагонять.
А "что-нибудь фонящеее" вообще можно получить не выходя из дома. Достаточно собрать радоновую ловушку и дать ей поработать чуток в непроветриваемом помещении.

vasunomad
Offline
Зарегистрирован: 05.09.2019

tekagi пишет:
Самый безопасный КИ - урановое стекло. И через границу пересылать не надо. Прециосовский бисер 82000 больше 1000 попугаев выдает на СБМ20.

Именно этот номер - 82000 или и другие тоже?

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

82000 самый активный, но из-за этого почти не светится в ультрафиолете. Есть еще несколько видов фирмы preciosa ornela с содержанием солей урана, те в ультрафиолете весьма красиво флюоресцируют.
81000 тоже uranium. Ещё минимум три каталожных номера попадалось.

vasunomad
Offline
Зарегистрирован: 05.09.2019

tekagi пишет:
82000 самый активный, но из-за этого почти не светится в ультрафиолете. Есть еще несколько видов фирмы preciosa ornela с содержанием солей урана, те в ультрафиолете весьма красиво флюоресцируют. 81000 тоже uranium. Ещё минимум три каталожных номера попадалось.

Спасибо! Неплохой вариант, попробую найти.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Вроде также должны подходить прециосовские 52010, 84000, 50800. Отдельные экземпляры могут попадаться в наборе uranium mix. Кроме чехов урановый бисер никто не делал, по крайней мере массово.

От детей хранить подальше. Во избежание.

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

Плата уместилась в корпус от мультиметра DT-838 

Кнопки пока что не прикрутил.

 

Lazy_Dragon
Offline
Зарегистрирован: 09.03.2017

Jeep64 пишет:
Lazy_Dragon подскажите. Какая прошивка у вас сейчас стоит? В старой 1.05 баги не устраняли?

Пока ничего не переделывал, так и стоит глючная 1.05. Сейчас ставить её не советую точно. Потом возможно займусь этим, заодно и плату переделаю, а то генератор нестабильно работает.

А по поводу КИ, я этот датчик решил заказать еще и из-за его копеечности, вроде заказал, а там придет не придет не особо переживаешь. ) Ну и удобный итоговой контейнер получился

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

У меня генератор стабильно работает 18-20 импульсов менял скорость отрисовки дтсплея с 100 на 300 до этого тоже сплошной треск шел от транса. Сейчас работает как в новых прошивках, пульсирует и попискивает.

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

Заказал у китайцев печатные платы...надеюсь не пол года будут идти))

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

Lazy_Dragon
Пока ничего не переделывал, так и стоит глючная 1.05. Сейчас ставить её не советую точно. Потом возможно займусь этим, заодно и плату переделаю, а то генератор нестабильно работает.
Так кроме 1.05 больше не чего нет под oled.

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Jeep64, дык именно Lazy_Dragon эту прошивку и портировал под OLED. Больше желания ни у кого не появилось.

edcase
edcase аватар
Offline
Зарегистрирован: 30.01.2019

 

нашёл бок в монтаже /утечка на высоковольтном делители/ ...........

теперь все стабильно и отлично)

edcase
edcase аватар
Offline
Зарегистрирован: 30.01.2019

 

нашёл бок в монтаже /утечка на высоковольтном делители/ ...........

теперь все стабильно и отлично)

volkodav34rus
Offline
Зарегистрирован: 17.09.2018

mambavamba14 пишет:

Заказал у китайцев печатные платы...надеюсь не пол года будут идти))

Поделитесь печаткой )) 

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

Готовой или гербер-файл?

volkodav34rus
Offline
Зарегистрирован: 17.09.2018

mambavamba14 пишет:

Готовой или гербер-файл?

Можно гербер?

 

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

Напиши почту, скину туда)

volkodav34rus
Offline
Зарегистрирован: 17.09.2018

mambavamba14 пишет:

Напиши почту, скину туда)

vbwz@yandex.ru Заранее спасибо и С НАСТУПАЮЩИМ!

vasunomad
Offline
Зарегистрирован: 05.09.2019

mambavamba14 пишет:

Напиши почту, скину туда)

Если можно и мне тоже вышлите пожалуйста гербер на vasu51@mail.ru

ВСЕХ с наступающим Новым Годом! Здоровья и Удачи в делах!

Surikat
Offline
Зарегистрирован: 13.07.2016

mambavamba14 пишет:

Напиши почту, скину туда)

добрый день!

вышлите гербер фаил на почту pcb_zakaz.com@inbox.ru

nasfiratu666
Offline
Зарегистрирован: 25.10.2019

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

https://cdn1.radikalno.ru/uploads/2020/1/1/5e699aa2f990cd6402079a00c5c4f...

https://cdn1.radikalno.ru/uploads/2020/1/1/60206559457f1f21e111f20352f4f...

https://cdn1.radikalno.ru/uploads/2020/1/1/f88cf0fa48d919114284ab79bd381...

https://cdn1.radikalno.ru/uploads/2020/1/1/14ad1682d99fbfff2787b79526048...

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

nasfiratu666, где фото с установленым дисплеем? Почему кнопки не припаяны, да ещё так близко к дорожкам загнуты? Гантелька шибко большая, лучше диаметром 6-8мм.

Начинающих (и не только) дозиметростроителей с Новым Годом! Шоб не фонило! ))

volkodav34rus
Offline
Зарегистрирован: 17.09.2018

По фото видно что много контактов не припаяны или плохой подпай

volkodav34rus
Offline
Зарегистрирован: 17.09.2018

ВСЕХ С НОВЫМ ГОДОМ !!!

nasfiratu666
Offline
Зарегистрирован: 25.10.2019

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

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Эмм. Если я прошу выложить фото с установленвм дисплеем, значит это необходимо.

nasfiratu666
Offline
Зарегистрирован: 25.10.2019
alexadresat
alexadresat аватар
Offline
Зарегистрирован: 22.02.2017

Всем привет! С Новым 2020 Годом!!!