Делаем дозиметр!

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

А зарядку, можно сделать индикатор «молния» . Ориентировка, точка в напряжении. Это будет нижний пиксель молнии.

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

Ну, индикация заряда не приоритет, я лучше пин оставлю на детект тлеющего разряда.

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

Кстати у тебя индикация светом работает? Я что-то все как не выставлял, фонарик не мигает, даже насеков нету на индикацию.

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

"Индикация светом" - это светодиод на 13й ноге, не фонарик. Были предложения на фонарик повесить стробоскоп по аварийному пределу, но это точно не из первоочередных доработок. Пока по основному функционалу вопросов много. Потому и интерфейс не трогаю, хотя оба меню давно пора переделать.

По зарядке. На платках с TP4056 есть светодиоды индикации заряда и окончания, проще их вывести на корпус или поставить сбоку от дисплея, цветная засветка будет индицировать процесс.

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

Ну отключение сингализации и неприрывныую с больлим диапазоном я сделал. 

Вот какие пороги еще сделать? Сейчас до 1000 микрорентген можно выставить. Мне кажется выше и нет смысла?

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

Там в таком виде и во втором уровне нет никакого смысла. Сигнализация первого уровня должна быть привязана к длительному замеру, это позволит выделять малые уровни превышения над фоном (15-40 мкР/ч) без ложных срабатываний. Сигнализация второго уровня должна быть привязана к кратковременному замеру (36 секунд для СБМ-20) при низком фоне, или при превышении определённого количества импульсов даже если этот период ещё не закончился (чтобы прибор не ждал окончания периода для выдачи сигнала, а пользователь уже через пару секунд сверкал пятками). Этот порог должен начинаться от 60-100 мкР/ч. Плюс продумать временное отключение/сброс тревоги с последующим автовключением или напоминанием, что фон ещё не ниже порога.

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

Так сигналка 2 и работает в режиме фонового замера. Она не связана с первым уровнем. Логика работы как у той сигналки, только значения другие и сигнализация непереставая работает при превышении.

то есть она перестанет орать только при понижении фона ниже установленного, либо сброса.

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

Она не способна увидеть стабильное небольшое превышение. Если поставить порог 25 при фоне 15 она периодически будет давать ложные срабатывания. Смотрите код основного замера (большие цифры) и длительного (малые вверху). Одна авария должна работать по малому скользящему окну (часть массива данных), при этом контролировать сумму недавно внесённых в массив данных на предмет превышения некоего количества импульсов внутри этого малого окна, для уровней свыше 100 и быстрой реакции, вторая брать за основу данные всего массива, что позволит получить меньший разброс показаний и более точное значение фона, для низких уровней аварии. Поскольку для этого массив должен быть набран целиком - аварийный сигнал сработает позже. Для низких уровней это некритично, но исключает ложную тревогу, а при высоких раньше сработает второй уровень. Плюс надо задать логику при сработке второго уровня для временного отключения первого.
Если надо более детально - пишите на мыло, покажу к каким переменным надо привязаться. С телефона код нормально не почитаешь, а я в него уже давно не заглядывал.

Morroc
Offline
Зарегистрирован: 24.10.2016

/дубль

Morroc
Offline
Зарегистрирован: 24.10.2016

По мне так и не надо ставить порог вроде 25. О чем сигнализирует такая сигналка ? Опасности никакой нет, а где то в районе 50 уже от фона не сработает случайно.

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

Ну вот. Первую сигналку сделать по верхним цифрам. Тобишь для малых значений. Например коротковременный сигнал что фон выше нормы. Например 30. Не опасно, но просто проинформирует что превышение.

второй же, сигналка как я ее назвал. 

Будет работать в зависимости от больших цифр и маленьких. Наприпер в 500микрорентген.

здесь точные значения не нужны, да и скорость +-3 секунды не критично, не стоит усложнять код из-за пары секунд. Тут главное что бы проинформировать о грязной зоне. 

Эта сигналка нужна для «невидимого» использования радиометра. Тобишь когда он у тебя в кармане. Ты идешь. Порог выставлен в 500 и фон начинает превышать этот порог то начинает орать сигналка значит что надо уходить от туда. 

При резком наборе фона она так и так сработает при данном коде. 

Dark-Dante
Offline
Зарегистрирован: 09.01.2018

tekagi, жду правок по таймеру, собрал всё последние наработки чтобы обновить свою прошивку, буду теперь ждать еще Вашу правку.

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

OfficialGalkin пишет:
  

Ну вот. Первую сигналку сделать по верхним цифрам. Тобишь для малых значений. Например коротковременный сигнал что фон выше нормы. Например 30. Не опасно, но просто проинформирует что превышение.

второй же, сигналка как я ее назвал. 

Будет работать в зависимости от больших цифр и маленьких. Наприпер в 500микрорентген.

В плане индикации всё верно. Но это должны быть не разные уровни одной переменной, а взятые с разных переменных, плюс для малого уровня должна быть дополнительная функция с логикой "или".

OfficialGalkin пишет:
...скорость +-3 секунды не критично... 

OfficialGalkin пишет:
  При резком наборе фона она так и так сработает при данном коде.

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

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

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

 

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

Сделал индикацию АКБ

В настройках добавляем строчку

float batnapruga = 3.20; //Настройка минимального значения напряжения акб для отображения. Зависит от работоспособности вашей схемы. Обычно 3.20 вольта by OfficialGalkin

В логотипах добалвяем логотиб линии 

extern uint8_t logo_bat[], logo_bat_line[], logo_rag[], logo_tr[], beta_prev_1[], beta_prev_2[], em_logo[];

В Gif.c логотип и линия батареи 

const unsigned char PROGMEM logo_bat[] =
{0xe,0x1f,0x11,0x11,
0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x1f};
 
const unsigned char PROGMEM logo_bat_line[] =
{0x7,0x7,0x7,0x7,
0x7,0x7,0x7,0x7,
0x7,0x7,0x7,0x7,
0x7};

Ну и саму баттарейку переписываем

//----------------------------------------------------------------------------------------------------
void battery()  //батарейка
{
if (bat_mill - millis() > 2000) 
  {
    bat_mill = millis();
    VCC_read();
  }

byte batline = 13; //Задаем длинну оинии батареи
batline = 13 * (((VCC - batnapruga) / 1 * 100) / 100); //Зависимость длинны в пикселях от процента заряда


      if (((VCC - batnapruga) / 1 * 100) > 15) //Проверяем процентный заряд акб
        {
  myGLCD.drawBitmap(68, 0, logo_bat, 16, 5);
  myGLCD.drawBitmap(83 - batline, 1, logo_bat_line, batline, 3);
        }
      else //Если заряд меньше 15% мигаем пустой батарейкой
        {
          toch = !toch;
          if (toch == 0) 
          {
            myGLCD.drawBitmap(68, 0, logo_bat, 16, 5);
          }
          else 
          {
            myGLCD.drawBitmap(68, 0, logo_bat, 0, 0);
          } 
        }
}
//----------------------------------------------------------------------------------------------------

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

 OfficialGalkin - давай выкладйвай целиком прошивку(hex и gif). Будем пробовать....

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

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

    if  (bet_z < 2) //таймер выводим только пока идёт первый или второй замер
		{
			myGLCD.setFont(TinyFontRus);
			myGLCD.printNumI((beta_time - minute -1), LEFT, 0);
			if (toch == 0) 
				{
					myGLCD.print(":", 5 + otsup, 0);
				}
			else 
				{
					myGLCD.print(" ", 5 + otsup, 0);
				} 
			myGLCD.printNumI((60 - sek), 10 + otsup, 0); myGLCD.print("\xBC"":""\xB9", 23 + otsup, 0);

 

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

tegagi - Привет! Заметил  на схеме ты добавил диод D3, это просто дла защиты?

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

Привет. Супрессор это. Упоминались случаи вылета полевика, смотрел осликом - есть паразитная иголка от самоиндукции в момент закрытия транзистора, она способна пробить полевик. Особенно на больших катушках (учитывая, что даже на моей 6х8 иногда превышает допустимое напряжение исток-сток). Супрессор позволяет срезать ей верх на безопасном для полевика уровне. Если хочешь - полистай несколько страниц назад, я детально описывал, с осциллограммой.

Во флайбеках это чуть ли не обязательный элемент, но супрессор - упрощённый вариант, чаще используется цепь диод - резистор - конденсатор. Для нас это излишество)

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

ОК.  А сдесь случаем в нутри уже не установлен?

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

Нет, здесь встроеный защитный диод от обратной полярности и супрессор для защиты от перенапряжения на затворе.

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

Откуда этот супрессор выковырить?

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

Вряд ли где-то есть подобное на донорах. Я покупал, у местных электронщиков-продаванов нашёл поштучно, и смд, и дип. Но поначалу взял по рабочему напряжению, а они иглы не режут, быстродействия не хватает. Прогрыз даташит и взял по паспортному импульсному - заработало. Там на схеме несколько аналогов указано. Справедливости ради у меня и без них работало, транз ни один не вылетел, но с ними как-то спокойней, да и повторяющим меньше шансов полевик подпалить.

В печатку в #26 я супрессор добавил.

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

Еще поправку сделай. В место сопротивления с 6 ножки 470 Ом поставь перемычку, и далее в место конденсатора 100n замени на сопротивление 2 кОм.

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

Лови. Строго не судить. Я только на прошлой неделе начал заниматься "программированием"

прошивка

/* ArDOs   v1.08.2
***Дозиметр на Ардуино
***IDE Arduino 1.8.8
  ветка форума arduino.ru/forum/proekty/delaem-dozimetr
  сайт srukami.inf.ua/ardos.html
*/
#include <util/delay.h> //уже есть
#include <EEPROM.h>//уже есть
#include <LCD5110_Graph.h>//нужно установить

//настройки /////////////начало
LCD5110 myGLCD(A1, A0, 12, 10, 11); //подключение дисплея
#define contrast 70 //контрастность дисплея
//#define buzzer_active //если используется активный бузер (со встроенным генератором), управляемый транзистором с выхода 6, то раскомментировать эту строчку, если пассивный (с усилителем или без) - оставить закомментированой.
//#define UNO_DIP // если используется ArduinoUNO или плата на голой атмеге328 в корпусе DIP - раскомментируйте данную строчку. Это переключит чтение напряжения с делителя с ноги A6 на ногу A5.
#define first_alarm_duration 3000 //длительность сигнала тревоги при превышении первого аварийного порога в миллисекундах
byte treviga_1 = 30; //первая ступень тревоги
byte treviga_2 = 0; //вторая ступень тревоги
byte del_BUZZ = 2;//длительность одиночного сигнала
#define  ADC_value 225  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255). Для значений делителя с сайта srukami 163. alexadresat 185. (Тестовая версия tekagi  67)
#define k_delitel 420 //коефициент делителя напряжения, зависит от вашего делителя. Для значений делителя с сайта srukami k_delitel 576. alexadresat 500 (Тестовая версия tekagi  1395)
byte puls = 2; //тонкая настройка длинны импульса высоковольтного транса
byte scrin_GRAF = 1; //скорость построения графика в секундах
bool podsvetka = 0; //подсветка
uint8_t graph_type = 1; //тип графика
bool alarm_sound = 0; //флаг индикации превышения порога звуком
float opornoe = 1.10; //делить на opornoe/10
#define save_DOZ 1 //как часто сохранять накопленную дозу например каждые 20мкР
#define geiger_counter_seconds 40 // число секунд для замера, соответствующее характеристикам счётчика. Для СБМ-20 равно 40.
byte beta_time = 5; //время замера бета излучения
float batnapruga = 3.20; //Настройка минимального значения напряжения акб для отображения. Зависит от работоспособности вашей схемы. Обычно 3.20 вольта by OfficialGalkin 
//настройки //////////////конец
//служебные переменные
extern uint8_t SmallFontRus[], MediumNumbers[], TinyFontRus[];
volatile uint8_t timer_seconds = 0; // для отсчёта секундных интервалов в прерывании
uint8_t beta_seconds = 0;
uint8_t count_and_dose_seconds = 0;
#define maxString 21 // для работы функции преобразования кодировки utf8us
char target[maxString + 1] = ""; // для работы функции преобразования кодировки utf8us
extern uint8_t logo_bat[], logo_bat_line[], logo_rag[], logo_tr[], beta_prev_1[], beta_prev_2[], em_logo[];
volatile int shet = 0;
volatile bool overflow_alarm = 0;
int8_t ind_ON = 1;  //0 - индикация выключена, 1 - включён бузер, 2 - светодиод, 3 - и бузер, и светодиод
uint8_t first_alarm_type = 1;  //1-3, 1 - только бузер, 2 - только вибро, 3 - и бузер, и вибро
byte periodical_alarm_variable = 0; // переменная для периодически повторяющейся тревожной сигнализации
unsigned long gr_milis = 0, lcd_milis = 0;
unsigned long alarm_milis = 0; //для отсчёта длительности сигнала тревоги по превышению порога
unsigned long spNAK_milis = 0, time_doza = 0, bat_mill = 0;
uint16_t hv_adc, hv_400, shet_n = 0, shet_s = 0;
uint16_t fon = 0, fon_254 = 0;
int speed_nakT = 0, speed_nak = 0, result;
byte MIN, DAY, HOUR, MONTH; //для учёта времени дозы
uint16_t doza_vr = 0, fon_vr254 = 0, fon_vr_poisk = 0;
byte mass_p[84]; // массив для графика
byte m = 0, n_menu = 0, sys_menu = 0;
byte  mass_poisk[255]; // основной рабочий массив
byte val_kl = 0, val_ok = 0, menu = 0, zam_poisk_counter = 0;
byte sek = 0, minute = 0, bet_z = 0, gotovo = 0;
int  bet_z0 = 0, bet_z1 = 0, bet_r = 0;
float VCC = 0.0, doz_v = 0.0;
bool tr = 0, poisk = 1, fonarik = 0, toch, blink_data=1;
uint8_t GRAPH_max = 5; // максимальное значение за период отображения графика
uint8_t GRAPH_count = 0; // счётчик для поиска максимального значения для графика
#define key_pressed_left 1
#define key_pressed_right 2
#define key_pressed_ok 3
#define key_holded_left 4
#define key_holded_right 5
#define key_holded_ok 6
#define keys_not_pressed 0
uint8_t key_data = 0;
//-------------------------------------------------------------
void setup() {
  //-----------------------------------------------------------
  // настраиваем таймер на секундный интервал
  TCCR1A=(1<<WGM11); //режим14 FAST PWM 
  TCCR1B=(1<<CS12)|(1<<WGM13)|(1<<WGM12); //делить частоту CPU на 256
if (F_CPU == 16000000UL) 
 {
  ICR1=62499;  // (16000000MHz /div256) -1 = 1 раз в секунду
 }
else if (F_CPU == 8000000UL) 
 {
  ICR1=31249;  // (8000000MHz /div256) -1 = 1 раз в секунду
 } 
  TIMSK1=(1<<TOIE1); //разрешить прерывание
  //-----------------------------------------------------------
// Serial.begin(115200);
  ACSR |= 1 << ACD; //отключаем компаратор
  //ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  pinMode(3, INPUT_PULLUP); //кнопка
  pinMode(4, INPUT_PULLUP); //кнопка
  pinMode(7, INPUT_PULLUP); //кнопка
  DDRB |= (1 << 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();
  clear_poisk_variables();
}
//-------------------------------------------------------------
void loop() 
{
key_data = get_key();  // вызываем функцию определения нажатия кнопок, присваивая возвращаемое ней значение переменной, которую далее будем использовать в коде
if (menu == 0) 
  {
    if (key_data == key_pressed_left)   //нажатие <<<
    {
      key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду 
      clear_poisk_variables();
    }
    if (key_data == key_holded_left) //удержание <<< фонарик  
  {
    fonarik = !fonarik; 
    key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
  }   
    if (key_data == key_holded_right) // удержание <<< подсветка
  {
    key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду     
        podsvetka = !podsvetka;
    }   
    if (key_data == key_pressed_right)  //нажатие >>>
  {
    key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
    menu = 4;
    shet = 0;
    bet_z0 = 0;
    bet_z1 = 0;
    bet_r = 0;
    bet_z = 0;
    gotovo = 0;
    sek = 0;
    minute = 0;
    }
 } 
if (menu == 3)
  {
    if (key_data == key_pressed_left)  //нажатие <<<
  {
    key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
    menu = 0;
    shet = 0; fon = 0; zam_poisk_counter = 0;
    for (int i = 0; i < 18; i++) { mass_poisk[i] = 0; }//чистим
  }
  } 
if (menu == 4) 
  {
    if (key_data == key_pressed_right)  //нажатие >>>
  {
    key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
    menu = 0;
    clear_poisk_variables();
    }
  }
if (fonarik == 0)  //фонарик
  {
    PORTB &= ~(1 << 1);//пин фонаря
  } 
else if (fonarik == 1) 
  {
    PORTB |= (1 << 1);//пин фонаря
  }
if (podsvetka == 1) 
  {
    PORTC &= ~(1 << 2); //A2 дисплей Light
  }
else if (podsvetka == 0) 
  {
    PORTC |= (1 << 2); //A2 дисплей Light
  }
  if (millis() - lcd_milis >= 300)  //скорость отрисовки дисплея
  {
    lcd_milis = millis();
    blink_data = !blink_data;
    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_200s(); //вывод на дисплей замер 180сек
        menu = 0;
      }
    if (menu == 4) 
      {
        zamer_beta();
      }
  }
//-------------------------------------------------------------------------------------------------------------
/* Костыль. Разностный замер и длительный замер вызываются с частотой отрисовки дисплея, 
поэтому сложно поймать нажатия кнопок внутри функций zamer_200s() и zamer_beta().
Возможно в будущем придётся разделить эти функции на обработку данных (вызывать с частотой loop'а) 
и вывод на дисплей (вызывать с частотой обновления дисплея)
*/
if (menu == 4)
{
    if ((key_data == key_pressed_ok) && (gotovo == 0))  //нажатие OK
    {
      key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
      gotovo = 1;
      switch (bet_z) //проверяем, находимся ли в первом или втором замере
      {
        case 0: //если в первом замере
          bet_z0 = 0; //обнуляем текущие показания замера 1
          shet = 0; //обнуляем счёт
        case 1: //если во втором замере
          bet_z1 = 0; //обнуляем текущие показания замера 2
          shet = 0; //обнуляем счёт            
      }
    }
}
//--------------------------------------------------------------------------------------------------------------  
generator();//накачка по обратной связи с АЦП
if (shet_s != shet) 
  {
    signa ();//подача сигнала о частичке
  }
if (key_data == key_pressed_ok) { //нажатие ок
if (menu == 2) 
  {
    key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
    sys_menu++;
    if (sys_menu > 5) 
      {
        sys_menu = 0;
      }
  }
if (menu == 1) 
  {
    key_data = 0;    // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
    n_menu++;
    if (n_menu > 7) 
      {
        n_menu = 0;
      }
  }
if (menu == 0) 
  {
    key_data = 0;   // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
    menu = 1;
  }
  } 
if (menu == 0)  // в меню по удержанию кнопки "ок" входим только из режима "поиск"
  {
    if (key_data == key_holded_ok)  //удержание OK
      {
        menu = 2; 
        key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
      }
  }
if (menu == 1) 
  {
    if (key_data == key_pressed_right)  //нажатие >>>
      {
        if (n_menu == 0) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду   
            treviga_1++;
          }
        if (n_menu == 1) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду     
            treviga_2++;
            treviga_2 = constrain (treviga_2, 0, 6);
          }
        if (n_menu == 2) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду     
            podsvetka = !podsvetka;
          }
        if (n_menu == 3) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            graph_type++;
            if (graph_type>1) {graph_type = 1;}
          }
        if (n_menu == 4) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду     
            scrin_GRAF++;
            if (scrin_GRAF > 10) 
              {
                scrin_GRAF = 1;
              }
          }
        if (n_menu == 5) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду     
            ind_ON++; 
            ind_ON = constrain (ind_ON, 0, 4); //держим значение в диапазоне 0...4
          }
        if (n_menu == 6) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду     
            menu = 0;
          }
        if (n_menu == 7) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду     
            eeprom_wrS ();
            menu = 0;
          }
      }
  }
if (menu == 2) 
  {
    if (key_data == key_pressed_right)  //нажатие >>>
      {
        if (sys_menu == 0) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду 
            opornoe = opornoe + 0.01;
            if (opornoe < 0.98) 
              {
                opornoe = 1.20;
              }
            if (opornoe > 1.20) 
              {
                opornoe = 0.98;
              }
          }
        if (sys_menu == 1) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            puls++;
            if (puls < 1) 
              {
                puls = 200;
              }
            else if (puls > 200) 
              {
                puls = 1;
              }
          }
        if (sys_menu == 2) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            time_doza = 0;//сброс накопленной дозы
            doz_v = 0;//сброс накопленной дозы
            eeprom_wrD ();
            myGLCD.clrScr();
            myGLCD.setFont(SmallFontRus);
            myGLCD.print(utf8rus("ДОЗА И ВРЕМЯ"), CENTER, 16);
            myGLCD.print(utf8rus("ОБНУЛЕНЫ"), CENTER, 24);
            myGLCD.update();
            _delay_ms(1000);
          }
        if (sys_menu == 3) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            menu = 0;
          }
        if (sys_menu == 4) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            eeprom_wrS ();
            menu = 0;
          }
        if (sys_menu == 5) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            beta_time++;
          }
      }
  }
if (menu == 1) 
  {
    if (key_data == key_pressed_left)  //нажатие <<<
      {
        if (n_menu == 0) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            treviga_1--;
          }
        if (n_menu == 1) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            treviga_2--;
            treviga_2 = constrain (treviga_2, 0, 6);
          }
        if (n_menu == 2) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            podsvetka = !podsvetka;
          }
        if (n_menu == 3) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            graph_type--;
            if (graph_type > 1) {graph_type = 0;}
          }
        if (n_menu == 4) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            scrin_GRAF--;
            if (scrin_GRAF < 1) 
              {
                scrin_GRAF = 10;
              }
          }
        if (n_menu == 5) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            ind_ON--; 
            ind_ON = constrain (ind_ON, 0, 4); //держим значение в диапазоне 0...4
          }
        if (n_menu == 6) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            menu = 0;
          }
        if (n_menu == 7) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            eeprom_wrS ();
            menu = 0;
          }
      }
  }
if (menu == 2) 
  {
    if (key_data == key_pressed_left)  //нажатие <<<
      {
        if (sys_menu == 0) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            opornoe = opornoe - 0.01;
            if (opornoe < 0.98) 
              {
                opornoe = 1.20;
              }
            else if (opornoe > 1.20) 
              {
                opornoe = 0.98;
              }
          }
        if (sys_menu == 1) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            puls--;
            if (puls < 1) 
              {
                puls = 200;
              }
            else if (puls > 200) 
              {
                puls = 1;
              }
          }
        if (sys_menu == 2) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            time_doza = 0;//сброс накопленной дозы
            doz_v = 0;//сброс накопленной дозы
            eeprom_wrD ();
            myGLCD.clrScr();
            myGLCD.setFont(SmallFontRus);
            myGLCD.print(utf8rus("ДОЗА И ВРЕМЯ"), CENTER, 16);
            myGLCD.print(utf8rus("ОБНУЛЕНЫ"), CENTER, 24);
            myGLCD.update();
            _delay_ms(1000);
          }
        if (sys_menu == 3) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            menu = 0;
          }
        if (sys_menu == 4) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            eeprom_wrS ();
            menu = 0;
          }
        if (sys_menu == 5) 
          {
            key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
            beta_time--;
          }
      }
  }
//------------------------------------------------------------------------------------------------------------------  
if (alarm_sound && (millis() - lcd_milis >= 300)) //если поднят флаг аварийного сигнала (плюс попользуемся интервалом обновления экрана)
  {
    periodical_alarm_variable++; 
    if (periodical_alarm_variable >= 4) {periodical_alarm_variable = 1;} // держим переменную в пределах
    PORTB |= (1 << 0); //включаем вибру
    if (periodical_alarm_variable  > 1 )
      {
        PORTB &= ~(1 << 0); // выключаем вибру  
      }
    if  (periodical_alarm_variable  < 3) // периодичный звук тревоги
      {
        #ifdef buzzer_active //если задефайнен активный бузер
        PORTD |= (1 << 6); // включаем непрерывный сигнал тревоги
        #else //пассивный
        tone (6, 1300); //генерим писк с частотой 1300Гц (значение можно изменить на своё) на пине 6
        #endif
      }
    else 
      {
        #ifdef buzzer_active   //если задефайнен активный бузер
        PORTD &= ~(1 << 6); // выключаем непрерывный сигнал тревоги
        #else //пассивный бузер
        noTone (6); //выключаем писк на 6й ноге
        #endif 
      }
  if ((millis() - alarm_milis) > first_alarm_duration) // проверяем, не истекло ли время подачи сигнала тревоги
    {
      PORTB &= ~(1 << 0); // выключаем вибру
      periodical_alarm_variable = 0; // обнуляем переменную
      #ifdef buzzer_active   //если задефайнен активный бузер
      PORTD &= ~(1 << 6); // выключаем непрерывный сигнал тревоги
      #else //пассивный бузер
      noTone (6); //выключаем писк на 6й ноге
      #endif 
      alarm_sound = 0; // сбрасываем флаг сигнала тревоги
    }
  }
//------------------------------------------------------------------------------------------------------------------
if (!tr && alarm_sound) // если фон ниже порога тревоги, но сигнал тревоги ещё не выключен
  {
    res_first_alarm(); //сбрасываем сигнал тревоги
  }
}
//-------------------------------------------------------------------------------------------------------
void lcd_poisk() 
{//вывод на дисплей режима поиск
if (shet < treviga_1 && fon < treviga_1) //проверяем тревогу
  {
    tr = 0;
  }
if (shet > treviga_1 || fon > treviga_1) //проверяем тревогу
  {
    check_alarm_signal(); // устанавливаем сигнал непрерывной тревоги, если "tr" переключился в "1"
    tr = 1;
  }

switch (treviga_2) //проверяем, какое значение выбрано
      {
        case 0: //индикация выключена
          tr = 0;
          break;  
        case 1: //индикация звуком
          if (shet < 10 && fon < 10) {}
          if (shet > 10 || fon > 10) //проверяем тревогу
          {
              ahtung();
          }
        case 2: //индикация звуком
          if (shet < 30 && fon < 30) {}
          if (shet > 30 || fon > 30) //проверяем тревогу
          {
              ahtung();
          }
        case 3: //индикация звуком
          if (shet < 50 && fon < 50) {}
          if (shet > 50 || fon > 50) //проверяем тревогу
          {
              ahtung();
          }
        case 4: //индикация звуком
          if (shet < 100 && fon < 100) {}
          if (shet > 100 || fon > 100) //проверяем тревогу
          {
              ahtung();
          }
        case 5: //индикация звуком
          if (shet < 500 && fon < 500) {}
          if (shet > 500 || fon > 500) //проверяем тревогу
          {
              ahtung();
          }
        case 6: //индикация звуком
          if (shet < 1000 && fon < 1000) {}
          if (shet > 1000 || fon > 1000) //проверяем тревогу
          {
              ahtung();
          }
        
      }



  
myGLCD.clrScr();
myGLCD.setFont(SmallFontRus);
if (tr == 1)  //опасно
  {
    myGLCD.drawBitmap(0, 0, logo_tr, 24, 8);
  }
myGLCD.setFont(TinyFontRus);
if (fon_254 > 0) 
  {
    if (fon_254 >= 1000) 
      {
        myGLCD.print("\xBC\xBE\xBF", 43, 0);
      }
    if (fon_254 < 1000) 
      {
        myGLCD.print("\xBC\xBD\xBE\xBF", 43, 0);
      }
  }
if ((zam_poisk_counter >= 254) || blink_data)
  {
  myGLCD.setFont(TinyFontRus);
  if (fon_254 > 0) 
    {
      if (fon_254 >= 1000) 
        {
          myGLCD.printNumF((float(fon_254)/1000.0), 1, 26, 0);
        }
      if (fon_254 < 1000) 
        {
          if (fon_254 < 100)
            {
              myGLCD.printNumI(fon_254, 32, 0);
            }
          else
            {
              myGLCD.printNumI(fon_254, 26, 0);
            }
        }
    }
  }
if (overflow_alarm && !blink_data)
  {
  myGLCD.drawBitmap(16, 8, em_logo, 16, 16);
  overflow_alarm = 0;
  }
else if ((zam_poisk_counter >= geiger_counter_seconds) || blink_data)
  {
    myGLCD.setFont(MediumNumbers);
    if (fon > 0) 
      {
        if (fon >= 1000) 
          {
            myGLCD.printNumF((float(fon)/1000), 2, LEFT, 7);
            myGLCD.setFont(SmallFontRus); myGLCD.print(utf8rus("мР/ч"), RIGHT, 12);
          }
        if (fon < 1000) 
          {
            if (fon < 100)
              {
                myGLCD.printNumI(fon, CENTER, 7);
              }
            else
              {
                myGLCD.printNumI(fon, LEFT, 7); 
              }
            myGLCD.setFont(SmallFontRus); myGLCD.print(utf8rus("мкР/ч"), RIGHT, 12);
          }
      }
  }
if (fon > 0) 
  {
    myGLCD.setFont(SmallFontRus);
    if (fon >= 1000) 
      {
        myGLCD.print(utf8rus("мР/ч"), RIGHT, 12);
      }
    if (fon < 1000) 
      {
        myGLCD.print(utf8rus("мкР/ч"), RIGHT, 12);
      }
  }
time_d ();
myGLCD.setFont(TinyFontRus);
ind_doze_time();  //вывод времени накопления дозы на дисплей    
myGLCD.setFont(SmallFontRus);
if (doz_v < 1000) 
  {
    if (doz_v < 100)
      {
        myGLCD.printNumF(doz_v, 1, 41, 41); myGLCD.print(utf8rus("мкР"), RIGHT, 41);
      }
    else
      {
        myGLCD.printNumF(doz_v, 1, 34, 41); myGLCD.print(utf8rus("мкР"), RIGHT, 41);
      }    
  }
if (doz_v >= 1000) 
  {
    myGLCD.printNumF(doz_v / 1000.0, 2, 41, 41); myGLCD.print(utf8rus("мР"), RIGHT, 41);
  }
myGLCD.drawLine(0, 39, 84, 39);//верхняя
battery();
if (graph_type == 0)
  {
  for (uint8_t i = 0; i < 84; i ++)  //печатаем график
    {
      uint8_t max_pixel = map(mass_p[i], 0, GRAPH_max, 0, 15);
      myGLCD.drawLine(i + 0, 39, i + 0, 39 - max_pixel);
    }
  }
else if (graph_type == 1)
  {
  for (int i = 0; i < 84; i ++)  //печатаем график
    {
    if (mass_p[i] > 0) 
      {
        if (mass_p[i] <= 15) 
          {
            myGLCD.drawLine(i + 0, 39, i + 0, 39 - mass_p[i]);
          }
        if (mass_p[i] > 15) 
          {
            myGLCD.drawLine(i + 0, 39, i + 0, 39 - 15);
          }
      }
    }
  }
myGLCD.update();
}
//------------------------------------------ Синалка 2 сработала ------------------------------------------------
void ahtung()
  {
           overflow_alarm = 1;
           #ifdef buzzer_active //если задефайнен активный бузер
            {
              PORTD |= (1 << 6); //включаем бузер 
              delay(del_BUZZ); //длительность одиночного сигнала
              PORTD &= ~(1 << 6); //выключаем бузер 
            }
          #else //пассивный бузер
            {
              tone (6,3000,100);
               tone (6,2600,100);
            }
          #endif 
  }
//-------------------------------------------------------------------------------------------------------
void lcd_menu()  //вывод на дисплей меню
{
myGLCD.clrScr();
myGLCD.setFont(TinyFontRus);
myGLCD.print(utf8rus("ПОРОГ 1"), 5, 0); myGLCD.printNumI(treviga_1, 55, 0); myGLCD.print("\xBC\xBD\xBE\xBF", RIGHT, 0);
myGLCD.print(utf8rus("СИГНАЛКА"), 5, 6); //пункт меню выбора индикации частиц
switch (treviga_2)
  {
  case 0:
    myGLCD.print(utf8rus("ВЫКЛ."), RIGHT, 6); //сигналка выключена. Сигнализация Порог 1 тоже отключется.
    break;  
  case 1:
    myGLCD.print(utf8rus("10 \xBC\xBD\xBE\xBF"), RIGHT, 6); // 10 мкр/ч
    break;  
  case 2:
    myGLCD.print(utf8rus("30 \xBC\xBD\xBE\xBF"), RIGHT, 6); // 30 мкр/ч
    break;  
  case 3:
    myGLCD.print(utf8rus("50 \xBC\xBD\xBE\xBF"), RIGHT, 6); // 50 мкр/ч
    break; 
  case 4:
    myGLCD.print(utf8rus("100 \xBC\xBD\xBE\xBF"), RIGHT, 6); // 100 мкр/ч
    break; 
  case 5:
    myGLCD.print(utf8rus("500 \xBC\xBD\xBE\xBF"), RIGHT, 6); // 500 мкр/ч
    break; 
  case 6:
    myGLCD.print(utf8rus("1000 \xBC\xBD\xBE\xBF"), RIGHT, 6); // 1000 мкр/ч
    break; 
    default:
    myGLCD.print("err", RIGHT, 6); //  если значение не равно 1,2,3,4,5,6 или 0 - выводим ошибку 
  }
myGLCD.print(utf8rus("ПОДСВЕТКА"), 5, 12); 
if (podsvetka)  { myGLCD.print(utf8rus("ВКЛ."), RIGHT, 12); }
else  { myGLCD.print(utf8rus("ВЫКЛ."), RIGHT, 12);  }
myGLCD.print(utf8rus("ТИП. ГРАФИКА"), 5, 18);  myGLCD.printNumI(graph_type, 59, 18); myGLCD.print("0-1", RIGHT, 18); //
myGLCD.print(utf8rus("ОБН. ГРАФИКА"), 5, 24); myGLCD.printNumI(scrin_GRAF, 59, 24); myGLCD.print(utf8rus("СЕК."), RIGHT, 24);//
myGLCD.print(utf8rus("ИНДИКАЦИЯ"), 5, 30); //пункт меню выбора индикации частиц
switch (ind_ON)
  {
  case 0:
    myGLCD.print(utf8rus("ВЫКЛ."), RIGHT, 30); //индикация выключена
    break;  
  case 1:
    myGLCD.print(utf8rus("ЗВУК"), RIGHT, 30); //индикация звуком
    break;  
  case 2:
    myGLCD.print(utf8rus("СВЕТ"), RIGHT, 30); //индикация светом
    break;  
  case 3:
    myGLCD.print(utf8rus("ЗВУК+СВЕТ"), RIGHT, 30); //индикация звуком и светом
    break; 
  case 4:
    myGLCD.print(utf8rus("ВИБРО"), RIGHT, 30); //индикация вибрацией
    break; 
    default:
    myGLCD.print("err", RIGHT, 30); //  если значение не равно 1,2,3 или 0 - выводим ошибку 
  }
myGLCD.print(utf8rus("ВЫХОД"), 5, 36);
myGLCD.print(utf8rus("СОХРАНИТЬ"), 5, 42);
myGLCD.print(">", 0, n_menu * 6);
myGLCD.update();
}
//----------------------------------------------------------------------------------------------------------------------
void lcd_sys()  //вывод на дисплей меню
{
VCC_read();
speed_nakachka ();//скорость накачки имлульсы/сек
myGLCD.clrScr();
myGLCD.setFont(TinyFontRus);
myGLCD.print(utf8rus("ОПОРН."), 5, 0); myGLCD.printNumF(opornoe, 2, CENTER, 0); myGLCD.print("VCC", 55, 0); myGLCD.printNumF(VCC, 2, RIGHT, 0);
hv_400 = hv_adc * opornoe * k_delitel / 255; //считем высокео перед выводом
myGLCD.print(utf8rus("НАКАЧКА"), 5, 6); myGLCD.printNumI(puls, 55, 6); myGLCD.printNumI(hv_400, RIGHT, 6);
myGLCD.print(utf8rus("СБРОС ДОЗЫ"), 5, 12); 
myGLCD.print(utf8rus("ВЫХОД"), 5, 18);
myGLCD.print(utf8rus("СОХРАНИТЬ"), 5, 24);
myGLCD.print(utf8rus("БЕТА"), 5, 30); myGLCD.printNumI(beta_time, 55, 30); myGLCD.print(utf8rus("МИН."), RIGHT, 30);
myGLCD.print(">", 0, sys_menu * 6);
myGLCD.print(utf8rus("СКОРОСТЬ"), 5, 40); myGLCD.printNumI(speed_nak, 40, 40); myGLCD.print(utf8rus("ИМП/СЕК"), RIGHT, 40);
myGLCD.update();
}
//---------------------------------------------------------------------------------------------------------------------
void zamer_beta() 
{// замер бета или продуктов
if (gotovo == 0) 
  {
    if (alarm_sound)  //если активен сигнал тревоги первого уровня
      {
        res_first_alarm(); //сбрасываем сигнал тревоги
      }
    myGLCD.clrScr();
    myGLCD.setFont(TinyFontRus);
    if (bet_z == 0)
      {
        myGLCD.drawBitmap(0, 0, beta_prev_1, 84, 48);
      }
    else if (bet_z == 1)
      {
        myGLCD.drawBitmap(0, 0, beta_prev_2, 84, 48); 
      }
myGLCD.setFont(SmallFontRus);
myGLCD.print(utf8rus("НАЖМИТЕ OK"), CENTER, 36);
myGLCD.update();
  }  
if (gotovo == 1) 
  {
    if (timer_seconds != beta_seconds) 
      {
        beta_seconds = timer_seconds;
        sek++;
        toch = !toch;
        if (sek >= 60) 
          {
            sek = 0;
            minute++;
          }
      } 
    byte otsup = 0;
    if (minute > 9) 
      {
      if (minute > 99) 
        {
          otsup = 10;
        }
      else 
        {
          otsup = 5;
        } 
      }
    byte otsupp = 0;
    if (beta_time > 9) 
      {
        if (beta_time > 99) 
        {
          otsupp = 10;
        }
      else 
        {
          otsupp = 5;
        } 
      }
    myGLCD.clrScr();
    battery();
    if  (bet_z < 2) //таймер выводим только пока идёт первый или второй замер
    {
      myGLCD.setFont(TinyFontRus);
      myGLCD.printNumI(minute, LEFT, 0);
      if (toch == 0) 
        {
          myGLCD.print(":", 5 + otsup, 0);
        }
      else 
        {
          myGLCD.print(" ", 5 + otsup, 0);
        } 
      myGLCD.printNumI(sek, 10 + otsup, 0); myGLCD.setFont(TinyFontRus); myGLCD.print(utf8rus("ИЗ"), 21 + otsup, 0); myGLCD.printNumI(beta_time, 32 + otsup, 0); myGLCD.print("\xBC", 37 + otsup + otsupp, 0);
    }
    myGLCD.drawLine(0, 6, 84, 6);
    myGLCD.setFont(SmallFontRus);
    myGLCD.drawLine(42, 6, 42, 26);
    myGLCD.print(utf8rus("Замер"), -1, 8);
    myGLCD.print(utf8rus("0"), 34, 8);
    myGLCD.print(utf8rus("Замер"), 44, 8);
    myGLCD.print(utf8rus("1"), 78, 8);
    myGLCD.printNumI(bet_z0, -1, 18); myGLCD.printNumI(bet_z1, RIGHT, 18);
    myGLCD.drawLine(0, 26, 84, 26);
    if (bet_z < 2) 
    {
      myGLCD.print(utf8rus("Идёт замер"), 5, 33); myGLCD.printNumI(bet_z, 72, 33);
    }
    if (bet_z == 2) 
    {
      myGLCD.printNumI(bet_r, CENTER, 29); myGLCD.print(utf8rus("мкР/ч"), CENTER, 38);
    }
    myGLCD.update();
    if (bet_z == 0)  //первый замер
    {
      bet_z0 = bet_z0 + shet;
      shet = 0;
      if (minute >= beta_time) 
        {
          bet_z = 1;
          sek = 0;
          minute = 0;
          gotovo = 0; 
          tone (6,2000,550); //генерим писк 2000Гц 70миллисекунд на 6й ноге
        }
    }
    if (bet_z == 1)  //второй замер
  {
    bet_z1 = bet_z1 + shet;
    shet = 0;
    if (minute >= beta_time) 
      {
        bet_z = 2;
        sek = 0;
        minute = 0;
        tone (6,2000,550); //генерим писк 2000Гц 70миллисекунд на 6й ноге    
      }
    }
    if (bet_z == 2)  //результат
    {
      bet_r = bet_z1 - bet_z0;
//      bet_r = bet_r / (1.5 * beta_time);
      bet_r = bet_r / ((60.0/(float)geiger_counter_seconds) * (float)beta_time);
      if (bet_r < 0) {bet_r = 0;} // если результат отрицательный - выводим 0. Можно оставить вывод отрицательного результата, закомментировав данную строчку.
    }
  }
if (key_data == key_pressed_right)  //нажатие >>>
  {
    key_data = 0;  // обнуляем переменную функции кнопок для предотвращения ложных срабатываний далее по коду
    menu = 0;
    clear_poisk_variables();
  }
}
//-------------------------------------------------------------------------------------------------------------
void poisk_f() //режим поиска
{
int16_t shet_gr = 0;
if (poisk == 1) 
  {
    if (timer_seconds != count_and_dose_seconds) 
      {
        count_and_dose_seconds = timer_seconds;
          for (int i = 0; i < 254; i++)  //сдвигаем
          {
            mass_poisk[i] = mass_poisk[i + 1];
          }
        mass_poisk[254] = shet;
        if ((zam_poisk_counter < 254) && (zam_poisk_counter < geiger_counter_seconds))  //первый набор массива
          {
            fon_vr_poisk = fon_vr_poisk + shet;             
            zam_poisk_counter++;
            fon = fon_vr_poisk*((float(geiger_counter_seconds))/(float(zam_poisk_counter))); 
//            fon_254 = fon;
            fon_254 = 0;
          }
        else if ((zam_poisk_counter < 254) && (zam_poisk_counter == geiger_counter_seconds))  //
          {   
            zam_poisk_counter++;
            fon_vr_poisk = fon_vr_poisk + shet; 
            fon = fon_vr_poisk*((float(geiger_counter_seconds))/(float(zam_poisk_counter)));
            fon_254 = fon;    
            fon_vr254 = fon_vr_poisk;
          }
        else if ((zam_poisk_counter < 254) && (zam_poisk_counter > geiger_counter_seconds))  //
          {
            fon_vr_poisk = 0;
            fon_vr254 = 0;
            for (int i = zam_poisk_counter; i > 0; i--) 
              {
                fon_vr254 = fon_vr254 + mass_poisk[254-i];
              }
            for (int j = 254 - geiger_counter_seconds; j < 255; j++) 
              { 
                fon_vr_poisk = fon_vr_poisk + mass_poisk[j];
              }
            fon = fon_vr_poisk;
//            fon_254 = (float(fon_vr254))*((float(geiger_counter_seconds))/(float(zam_poisk_counter)));
            fon_254 = (float)fon_vr254*((float)geiger_counter_seconds/(float)zam_poisk_counter); 
            fon_vr254 = 0;
            zam_poisk_counter++;
          } 
        else if (zam_poisk_counter >= 254)  //набор массива
          {
            fon_vr_poisk = 0;
            fon_vr254 = 0;
            byte geiger_counter_seconds_reverse = 254 - geiger_counter_seconds;
            for (int i = 254; i > 0; i--) 
              {
                fon_vr254 = fon_vr254 + mass_poisk[i];
                if (i > geiger_counter_seconds_reverse)
                  {
                    fon_vr_poisk = fon_vr_poisk + mass_poisk[i];
                  }
              }
            fon = fon_vr_poisk;
            fon_254 = (float(fon_vr254))*((float(geiger_counter_seconds))/254.0);
          }
        shet = 0;
        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;
          }
//Serial.print(" zam_poisk_counter=");
//Serial.println(zam_poisk_counter);            
      }
    if (millis() - gr_milis >= scrin_GRAF * 1000) //счет для графика
      {
      gr_milis = millis();
      if (graph_type == 0)
        {
        val_ok = 0;//сброс удержания системного меню  
        for (uint8_t s = 254; s >= (255 - scrin_GRAF); s--) 
          {
            shet_gr = shet_gr + mass_poisk[s];
          }
        shet_gr = shet_gr / scrin_GRAF;
        for (int i = 0; i < 84; i++) // сдвигаем массив графика
          {
            mass_p[i] = mass_p[i + 1];
          }
        mass_p[82] = byte(shet_gr);
        if (GRAPH_count > 82) 
          {
            GRAPH_max = 5; 
            GRAPH_count = 0;
          }   
        for (int i = 0; i < 82; i++) 
          {
            if (mass_p[i] > GRAPH_max)
              {
                GRAPH_max = mass_p[i];
                GRAPH_count = 0;
              }
          }
        GRAPH_count++;     
        }
      if (graph_type == 1)
        {
          val_ok = 0;//сброс удержания системного меню
          shet_gr = shet - shet_n;
          if (shet_gr < 0) 
            {
              shet_gr = 1;
            }
          shet_n = shet;
          for (int i = 0; i < 83; i++) 
            {
              mass_p[i] = mass_p[i + 1];
            }
          mass_p[82] = byte(shet_gr);
            
        
        }       
      }
  }
}
//----------------------------------------------------------------------------------------------------------------

void clear_poisk_variables ()
{
shet = 0;
fon = 0;
fon_254 = 0;
zam_poisk_counter = 0;
GRAPH_max = 5;
GRAPH_count = 0;
fon_vr254 = 0;
fon_vr_poisk = 0;
for (uint8_t i = 0; i < 84; i++) { mass_p[i] = 0; } // чистим массив графика
for (uint8_t i = 0; i < 254; i++) { mass_poisk[i] = 0; } // чистим массив поиска  
}

void signa ()  //индикация каждой частички звуком светом
{
shet_s = shet;  
if (!alarm_sound) //если флаг сигнала тревоги не поднят, генерим одиночные сигналы, озвучивающие пойманные частицы
    {
    if (!shet_s) {return;} //если залетели в функцию signa() при обнулении переменной shet_s - просто возвращаемся в точку вызова. Детальнее здесь: arduino.ru/forum/proekty/delaem-dozimetr?page=16#comment-318736
    switch (ind_ON) //проверяем, какой тип индикации выбран
      {
        case 0: //индикация выключена
          break;  
        case 1: //индикация звуком
          #ifdef buzzer_active //если задефайнен активный бузер
            {
              PORTD |= (1 << 6); //включаем бузер 
              delay(del_BUZZ); //длительность одиночного сигнала
              PORTD &= ~(1 << 6); //выключаем бузер 
            }
          #else //пассивный бузер
            {
              tone (6,1000,30); //генерим писк 1000Гц 30миллисекунд на 6й ноге
            }
          #endif 
          break;  
        case 2: //индикация светом
          PORTB |= (1 << 5); //включаем светодиод
          delay(del_BUZZ); //длительность одиночного сигнала
          PORTB &= ~(1 << 5); //выключаем светодиод
          break;
  
        case 3: //индикация звуком и светом
          #ifdef buzzer_active //если задефайнен активный бузер
            {
              PORTB |= (1 << 5); //включаем светодиод
              PORTD |= (1 << 6); //включаем бузер 
              delay(del_BUZZ); //длительность одиночного сигнала
              PORTD &= ~(1 << 6); //выключаем бузер 
              PORTB &= ~(1 << 5); //выключаем светодиод
            }
          #else //пассивный бузер
            {
              PORTB |= (1 << 5); //включаем светодиод
              tone (6,1000,30); //генерим писк 1000Гц 30миллисекунд на 6й ноге
              delay(del_BUZZ);//длительность одиночного сигнала
              PORTB &= ~(1 << 5);//выключаем светодиод
            }
          #endif 
          break; 
        case 4: // индикация вибрацией
          PORTB |= (1 << 0); //включаем вибру
          delay(del_BUZZ); //длительность одиночного сигнала
          PORTB &= ~(1 << 0); // выключаем вибру      
      } 
    }
else // если активен сигнал тревоги, то только мигаем светодиодом (независимо от того, включён или нет светодиод в меню)
  {
      PORTB |= (1 << 5); //включаем светодиод
    delay(del_BUZZ);
    PORTB &= ~(1 << 5);//выключаем светодиод
  }
}
//-------------------------------------------------------------------------------------------------
void Schet()  //прерывание от счетчика на пин 2
{
shet++;
if (shet>250) {overflow_alarm = 1;} // детект приближения к переполнению переменной
}
//-------------------------------------------------------------------------------------------------
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++;
  }
}
//--------------------------------------------------------------------------------------------------
byte Read_HV () 
{
ADCSRA = 0b11100111;
#ifdef UNO_DIP //если при компилляции выбрана плата ArduinoUNO
ADMUX = 0b11100101;//выбор внутреннего опорного 1,1В и А5 
#else // если используется промини, нано или голый камень в tqfp
ADMUX = 0b11100110;//выбор внутреннего опорного 1,1В и А6
#endif  
for (int i = 0; i < 10; i++) 
  {
    while ((ADCSRA & 0x10) == 0);
    ADCSRA |= 0x10;
  }
result = 0;
for (int i = 0; i < 10; i++) 
  {
    while ((ADCSRA & 0x10) == 0);
    ADCSRA |= 0x10;
    result += ADCH;
  }
result /= 10;
return result;
}
//----------------------------------------------------------------------------------------------------
void battery()  //батарейка
{
if (bat_mill - millis() > 2000) 
  {
    bat_mill = millis();
    VCC_read();
  }

byte batline = 13; //Задаем длинну оинии батареи
batline = 13 * (((VCC - batnapruga) / 1 * 100) / 100); //Зависимость длинны в пикселях от процента заряда


      if (((VCC - batnapruga) / 1 * 100) > 15) //Проверяем процентный заряд акб
        {
  myGLCD.drawBitmap(68, 0, logo_bat, 16, 5);
  myGLCD.drawBitmap(70, 1, logo_bat_line, batline, 3);
        }
      else //Если заряд меньше 15% мигаем пустой батарейкой
        {
          toch = !toch;
          if (toch == 0) 
          {
            myGLCD.drawBitmap(68, 0, logo_bat, 16, 5);
          }
          else 
          {
            myGLCD.drawBitmap(68, 0, logo_bat, 0, 0);
          } 
        }
}
//----------------------------------------------------------------------------------------------------
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;
}
//----------------------------------------------------------------------------------------------------
void lcd_init() 
{
myGLCD.InitLCD();
myGLCD.setContrast(contrast);
myGLCD.clrScr();
myGLCD.drawBitmap(0, 0, logo_rag, 84, 48);
//myGLCD.setFont(SmallFontRus);
//  myGLCD.print(utf8rus("Ардуино+"), CENTER, 32);
//  myGLCD.print(utf8rus("Дозиметр v1.07"), CENTER, 40);
myGLCD.update();
_delay_ms(1000);
}
//----------------------------------------------------------------------------------------------------
void eeprom_wrS ()  //запись настроек в память
{
  EEPROM.write(0, 222);
  EEPROM.write(1, treviga_1);
  EEPROM.write(2, podsvetka);
  EEPROM.write(3, graph_type);
  EEPROM.write(4, scrin_GRAF);
  EEPROM.write(5, ind_ON);
  EEPROM.write(6, puls);
  EEPROM.write(7, opornoe * 100);
  EEPROM.write(8, treviga_2);
  EEPROM.write(17, beta_time);
  myGLCD.clrScr();
  myGLCD.setFont(SmallFontRus);
  myGLCD.print(utf8rus("Сохранено"), CENTER, 20);
  myGLCD.update();
  _delay_ms(1000);
}
//-----------------------------------------------------------------------------------------------------
void eeprom_wrD ()  //запись настроек в память время накопления дозы
{
  EEPROM.put(9, time_doza);
  EEPROM.put(13, doz_v);   
}
//-----------------------------------------------------------------------------------------------------
void eeprom_readD ()  //чтение настроек из памяти время накопления дозы
{
  EEPROM.get(9, time_doza);
  EEPROM.get(13, doz_v);   
}
//-----------------------------------------------------------------------------------------------------
void eeprom_readS ()  //чтение настроек из памяти
{
  if (EEPROM.read(0) == 222) 
  {
    treviga_1 = EEPROM.read(1);
    podsvetka = EEPROM.read(2);
    graph_type = EEPROM.read(3);
    scrin_GRAF = EEPROM.read(4);
    ind_ON = EEPROM.read(5);
    puls = EEPROM.read(6);
    opornoe = EEPROM.read(7) / 100.0;
    treviga_2 = EEPROM.read(8);
    beta_time = EEPROM.read(17);
  }
_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() 
{
  MONTH = time_doza / 2592000;
  DAY = (time_doza / 86400) % 30 ;
  HOUR = (time_doza / 3600) % 24 ;
  MIN = (time_doza / 60) % 60;
}
//------------------------------------------------------------------------------------------------------
void check_alarm_signal()  // устанавливаем сигнал непрерывной тревоги, если "tr" переключился в "1"
{
  if (!tr) // если счёт превысил аварийный порог, но флаг "tr" ещё не установлен
    {
      alarm_sound = 1; // поднимаем флаг аварийного сигнала
      alarm_milis = millis(); // запоминаем время начала тревоги
    }
}
//------------------------------------------------------------------------------------------------------
void res_first_alarm() //подпрограмма выключения тревоги (ручного или по истечении таймаута)
{
   alarm_sound = 0; // сбрасываем флаг звукового сигнала тревоги
   PORTB &= ~(1 << 0); // выключаем вибру
   periodical_alarm_variable = 0; // обнуляем переменную
   #ifdef buzzer_active //если задефайнен активный бузер
   PORTD &= ~(1 << 6); // выключаем бузер
   #else //пассивный бузер
   noTone(6);   //выключаем генерацию сигнала на 6й ноге
   #endif
}
//------------------------------------------------------------------------------------------------------
void ind_doze_time() //вывод времени накопления дозы на дисплей
{
  myGLCD.setFont(TinyFontRus);
  if (MONTH) // если есть месяцы
    {
      myGLCD.printNumI(MONTH, 0, 43);
      if(MONTH>99)
        {
          myGLCD.print("M", 13, 43);
        }
      else if (MONTH>9)
        {
          myGLCD.print("M", 9, 43);
        }
      else
        {
          myGLCD.print("M", 5, 43);
        }
    myGLCD.printNumI(DAY, 18, 43);
    if (DAY > 9) 
      {
        myGLCD.print("\xBB", 26, 43);
      }
    else
      {
        myGLCD.print("\xBB", 23, 43);
      } 
    }
  else if (DAY) // если нет месяцев, но есть дни
    {
      myGLCD.printNumI(DAY, 0, 43);
      if (DAY > 9) 
        {
          myGLCD.print("\xBB", 9, 43);
        }
      else
        {
          myGLCD.print("\xBB", 5, 43);
        }
      myGLCD.printNumI(HOUR, 18, 43);
      if (HOUR > 9) 
        {
          myGLCD.print("\xBA", 26, 43);
        }
      else 
        {
          myGLCD.print("\xBA", 23, 43);
        }
    }
  else // если нет дней
    {
      myGLCD.printNumI(HOUR, 0, 43);
      if (HOUR > 9) 
        {
          myGLCD.print("\xBA", 9, 43);
        }
      else
        {
          myGLCD.print("\xBA", 5, 43);
        }
      myGLCD.printNumI(MIN, 18, 43);
      if (MIN > 9) 
        {
          myGLCD.print("\xBC", 26, 43);
        }
      else
        {
          myGLCD.print("\xBC", 23, 43);
        }
    }   

}
//--------------------------------------------------------------------------------------------------------
byte get_key() // Функция определения нажатия и удержания кнопок
{
// версия 1 - для кратковременного нажатия значение возвращается при отпускании кнопки, для длительного - пока кнопка остаётся нажатой, с заданным интервалом
uint8_t trigger_push_hold_counter = 10; // задержка триггера кратковременного/длительного нажатия (проходов функции, умноженных на задержку "milliseconds_between_increment")  
uint8_t milliseconds_between_increment = 50; // интервал в миллисекундах между инкрементом счётчика нажатой кнопки 
static uint8_t val_kp, val_kl, val_ok;
static uint32_t key_delay_millis;
static uint32_t key_delay_after_hold_millis;
if ((millis() - key_delay_millis) > milliseconds_between_increment) //обрабатываем нажатия инкрементом переменной только если после предыдущей обработки прошло не менее "milliseconds_between_increment" миллисекунд
  {
    if (!(PIND & (1 << PIND4)))  //нажатие >>>
    {
    val_kp++;  // инкрементируем счётчик
    if (val_kp > trigger_push_hold_counter) // если значение счётчика больше порога детектирования удержания клавиши 
      {
       val_kp = 0; // сбрасываем счётчик 
       key_delay_after_hold_millis = millis(); // запоминаем время
       return key_holded_right; // возвращаем значение
      }
    }
    if (!(PIND & (1 << PIND7)))  //нажатие <<<
    {
    val_kl++;  // инкрементируем счётчик
    if (val_kl > trigger_push_hold_counter) // если значение счётчика больше порога детектирования удержания клавиши
      {
        val_kl = 0; // сбрасываем счётчик
        key_delay_after_hold_millis = millis(); // запоминаем время 
        return key_holded_left; // возвращаем значение
      }   
    }
    if (!(PIND & (1 << PIND3)))  //нажатие OK
    {
    val_ok++; // инкрементируем счётчик
    if (val_ok > trigger_push_hold_counter) // если значение счётчика больше порога детектирования удержания клавиши
      {
        val_ok = 0; // сбрасываем счётчик
        key_delay_after_hold_millis = millis(); // запоминаем время 
        return key_holded_ok; // возвращаем значение
      }       
    }
    key_delay_millis = millis(); // запоминаем время 
  }
if (val_ok > 0) //если клавиша OK перед этим была нажата 
  {
     if ((PIND & (1 << PIND3)) && ((millis() - key_delay_after_hold_millis) > (trigger_push_hold_counter * milliseconds_between_increment))) // если клавиша на данный момент отпущена и с момента последнего удержания любой клавиши прошёл интервал больше, чем один интервал удержания клавиши
      {
        val_ok = 0;  // сбрасываем счётчик
        return key_pressed_ok; // возвращаем значение
      }
  }
if (val_kp > 0) //если клавиша >>> перед этим была нажата 
  {
    if ((PIND & (1 << PIND4)) && ((millis() - key_delay_after_hold_millis) > (trigger_push_hold_counter * milliseconds_between_increment))) // если клавиша на данный момент отпущена и с момента последнего удержания любой клавиши прошёл интервал больше, чем один интервал удержания клавиши
      {
        val_kp = 0;  // сбрасываем счётчик 
        return key_pressed_right; // возвращаем значение
      }
  }
if (val_kl > 0) //если клавиша <<< перед этим была нажата 
  {
    if ((PIND & (1 << PIND7)) && ((millis() - key_delay_after_hold_millis) > (trigger_push_hold_counter * milliseconds_between_increment))) // если клавиша на данный момент отпущена и с момента последнего удержания любой клавиши прошёл интервал больше, чем один интервал удержания клавиши
      {
        val_kl = 0;  // сбрасываем счётчик  
        return key_pressed_left; // возвращаем значение
      }
  }
if (PIND & (1 << PIND4)) {val_kp = 0;} // если добрались до этой точки и кнопка не нажата - обнуляем счётчик (защита от появления "pressed" после "holded")
if (PIND & (1 << PIND7)) {val_kl = 0;} // если добрались до этой точки и кнопка не нажата - обнуляем счётчик (защита от появления "pressed" после "holded")
if (PIND & (1 << PIND3)) {val_ok = 0;} // если добрались до этой точки и кнопка не нажата - обнуляем счётчик (защита от появления "pressed" после "holded")
return 0; // если ни одна из кнопок не была нажата - возвращаем 0
}
//------------------------------------------------------------------------------------------------------------------------------
char *utf8rus(char *source) // функция преобразования utf8 для вывода кириллицы (by arduinec)
{
  int i,j,k;
  unsigned char n;
  char m[2] = { '0', '\0' };

  strcpy(target, ""); k = strlen(source); i = j = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }

    m[0] = n; strcat(target, m);
    j++; if (j >= maxString) break;
  }
  return target;
}

ISR (TIMER1_OVF_vect) // прерывание по таймеру, генерируемое каждую секунду
{ 
timer_seconds++ ; //инкремент переменной каждую секунду
if (timer_seconds > 59){timer_seconds = 0;}
}

// ________________ конец скетча, дальше можно не копировать _____________________



графика

// файл gif.c
// должен находиться в папке со скетчем

#include <avr/pgmspace.h>
#ifndef fontdatatype
#define fontdatatype const uint8_t
#endif
const unsigned char PROGMEM gif_chast_1[] =
{ 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00};

const unsigned char PROGMEM gif_chast_2[] =
{ 0x3C, 0x7E, 0xC3, 0xC3, 0xC3, 0xC3, 0x7E, 0x3C};

const unsigned char PROGMEM logo_bat[] =
{0xe,0x1f,0x11,0x11,
0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x1f};
 
const unsigned char PROGMEM logo_bat_line[] =
{0x7,0x7,0x7,0x7,
0x7,0x7,0x7,0x7,
0x7,0x7,0x7,0x7,
0x7};
 
const unsigned char PROGMEM  logo_tr[] =
{ 0x0C, 0x12, 0x21, 0x0C, 0x00, 0x10, 0x28, 0x26, 0x61, 0x61, 0x26, 0x28,
  0x10, 0x00, 0x0C, 0x21, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  
const unsigned char PROGMEM  em_logo[] =
{ 0x00, 0x00, 0x10, 0x18, 0x9C, 0xCC, 0xEC, 0xFC,
  0xF8, 0x78, 0x77, 0xE7, 0xC7, 0x80, 0x80, 0x80,
  0x0C, 0x0C, 0x0C, 0x0E, 0x07, 0x43, 0x63, 0x77,
  0x3E, 0x1C, 0x08, 0x00, 0x01, 0x01, 0x01, 0x01};

const unsigned char PROGMEM logo_rag[] =
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xF8, 0xF8,
  0xF8, 0xF8, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8,
  0xF8, 0xF8, 0x78, 0x78, 0x78, 0x78, 0xF8, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0,
  0xC0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0x98, 0x18,
  0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFE, 0xFF, 0xFF, 0x9F, 0x81,
  0x81, 0x81, 0x9F, 0xFF, 0xFF, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFC, 0x1E, 0x0F, 0x0F, 0x0F, 0x06, 0x00, 0xFF, 0xFF,
  0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xFF,
  0xFF, 0xFF, 0x00, 0xFC, 0xFF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x36,
  0x78, 0x78, 0x78, 0x36, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xFF, 0xFC,
  0x00, 0xFC, 0xFE, 0xFF, 0xEF, 0xC7, 0xC7, 0x8F, 0x0F, 0x0E, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xC0, 0xFC, 0xFF, 0xFF, 0xFF, 0x1F, 0x07, 0x07, 0x07,
  0x07, 0x07, 0x07, 0x07, 0x3F, 0xFF, 0xFF, 0xFF, 0xF8, 0xC0, 0x00, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
  0xFF, 0xFF, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0x7E, 0x7F, 0x3F, 0x3F,
  0x0F, 0x07, 0x00, 0x01, 0x0F, 0x1E, 0x38, 0x70, 0x60, 0xF0, 0xFE, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x60, 0x70, 0x38, 0x1F, 0x07, 0x01,
  0x00, 0x79, 0xF9, 0xF1, 0xF3, 0xF7, 0xFF, 0xFF, 0x7F, 0x3E, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,
  0x00, 0x7C, 0x24, 0x24, 0x24, 0x18, 0x00, 0x60, 0x3C, 0x24, 0x3C, 0x60,
  0x00, 0x0C, 0x50, 0x50, 0x50, 0x3C, 0x00, 0x7C, 0x20, 0x10, 0x08, 0x7C,
  0x00, 0x7C, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38,
  0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x60, 0x3E, 0x23, 0x3F, 0x60, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38,
  0x00, 0x28, 0x44, 0x54, 0x54, 0x28, 0x00, 0x7C, 0x20, 0x10, 0x08, 0x7C,
  0x00, 0x7C, 0x08, 0x10, 0x08, 0x7C, 0x00, 0x38, 0x54, 0x54, 0x54, 0x18,
  0x00, 0x04, 0x04, 0x7C, 0x04, 0x04, 0x00, 0x7C, 0x24, 0x24, 0x24, 0x18,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,
  0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
  0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x36, 0x49, 0x49, 0x49, 0x36};


// заставка БЕТА режима первая
const unsigned char PROGMEM beta_prev_1[] =
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x05,
  0x02, 0x00, 0x1F, 0x15, 0x11, 0x00, 0x1B, 0x1F, 0x1B, 0x00, 0x1F, 0x0C,
  0x1F, 0x00, 0x1F, 0x07, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x05,
  0x02, 0x00, 0x1E, 0x05, 0x1E, 0x00, 0x11, 0x15, 0x0A, 0x00, 0x1F, 0x04,
  0x1F, 0x00, 0x0E, 0x11, 0x0E, 0x00, 0x0E, 0x11, 0x0A, 0x00, 0x01, 0x1F,
  0x01, 0x00, 0x1F, 0x04, 0x1F, 0x00, 0x0E, 0x11, 0x0E, 0x00, 0x1F, 0x01,
  0x01, 0x00, 0x0E, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x15, 0x0A, 0x00,
  0x1E, 0x05, 0x1E, 0x00, 0x1F, 0x07, 0x1F, 0x00, 0x1F, 0x15, 0x11, 0x00,
  0x1F, 0x05, 0x02, 0x00, 0x1E, 0x05, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x71, 0x41,
  0xF1, 0x01, 0xE1, 0x11, 0xA1, 0x01, 0x11, 0xF1, 0x11, 0x01, 0xE1, 0x51,
  0xE1, 0x01, 0xF1, 0x41, 0xF1, 0x01, 0xE1, 0x11, 0xE1, 0x01, 0xF1, 0x51,
  0xA1, 0x01, 0xF1, 0xC1, 0xF1, 0x01, 0x11, 0xF1, 0x11, 0x01, 0xF1, 0x51,
  0x11, 0x01, 0x01, 0x01, 0x01, 0x01, 0xF1, 0x11, 0xF1, 0x01, 0xF1, 0x51,
  0x21, 0x01, 0xF1, 0xC1, 0xF1, 0x01, 0xF1, 0x51, 0x91, 0x01, 0xE1, 0x11,
  0xE1, 0x01, 0xF1, 0x51, 0x21, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x40, 0xF1, 0x01,
  0xE0, 0x50, 0xE0, 0x01, 0x00, 0x00, 0xF0, 0x11, 0xF0, 0x00, 0x71, 0x40,
  0xF1, 0x00, 0xE1, 0x10, 0xA1, 0x00, 0x10, 0xF1, 0x10, 0x00, 0x71, 0x41,
  0xF0, 0x00, 0xF1, 0xE0, 0x11, 0xE0, 0x00, 0x01, 0x00, 0xF0, 0x41, 0x91,
  0x01, 0xF0, 0xE0, 0x10, 0xE0, 0x00, 0xF1, 0x50, 0xA1, 0x00, 0xF1, 0x50,
  0x10, 0x00, 0x11, 0xF0, 0x11, 0x00, 0x71, 0x41, 0xF0, 0x00, 0x00, 0x01,
  0xF0, 0xC0, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
  0x01, 0xF0, 0x81, 0x80, 0x80, 0xF0, 0x01, 0xC0, 0x21, 0x10, 0x21, 0xC1,
  0x00, 0x70, 0x80, 0xE1, 0x80, 0x70, 0x00, 0xF1, 0x20, 0xC0, 0x21, 0xF1,
  0x00, 0xF0, 0x01, 0x80, 0x61, 0xF0, 0x00, 0x10, 0x10, 0xF1, 0x10, 0x11,
  0x00, 0xF1, 0x90, 0x91, 0x90, 0x10, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01,
  0x01, 0xE0, 0x10, 0x11, 0x10, 0xE0, 0x01, 0xF1, 0x80, 0x40, 0x20, 0x10,
  0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x01, 0x01, 0x01, 0x07,
  0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07,
  0x00, 0x07, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
  0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x07, 0x00, 0x01, 0x02, 0x04,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  
// заставка БЕТА режима вторая
const unsigned char PROGMEM beta_prev_2[] =

  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x11, 0x15, 0x0A, 0x00, 0x1E, 0x05, 0x1E, 0x00,
  0x1F, 0x07, 0x1F, 0x00, 0x1F, 0x15, 0x11, 0x00, 0x1F, 0x05, 0x02, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x0E, 0x11, 0x0E, 0x00, 0x1F, 0x15, 0x1D, 0x00,
  0x1F, 0x05, 0x02, 0x00, 0x1E, 0x05, 0x1E, 0x00, 0x11, 0x15, 0x0A, 0x00,
  0x1F, 0x10, 0x1F, 0x30, 0x1E, 0x05, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x11, 0x51,
  0xA1, 0x01, 0xE1, 0x51, 0xE1, 0x01, 0xF1, 0x11, 0xF1, 0x01, 0xE1, 0x11,
  0xE1, 0x01, 0xE1, 0x11, 0xF1, 0x01, 0xF1, 0x41, 0xF1, 0x01, 0xF1, 0xC1,
  0xF1, 0x01, 0x11, 0xF1, 0x11, 0x01, 0xF1, 0x51, 0x11, 0x01, 0x01, 0x01,
  0x01, 0x01, 0xF1, 0x41, 0x91, 0x01, 0xF1, 0xE1, 0x11, 0xE1, 0x01, 0xF1,
  0x51, 0xA1, 0x01, 0xF1, 0x51, 0x11, 0x01, 0x11, 0xF1, 0x11, 0x01, 0x71,
  0x41, 0xF1, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
  0x00, 0x00, 0xF0, 0xC0, 0xF0, 0x00, 0x10, 0x50, 0xA0, 0x00, 0xF1, 0x71,
  0xF0, 0x00, 0xF1, 0x50, 0x11, 0x00, 0xF1, 0x50, 0x21, 0x00, 0xA0, 0x51,
  0xF0, 0x00, 0xF1, 0x50, 0x11, 0x00, 0xF1, 0x70, 0xF1, 0x00, 0xF1, 0x40,
  0x81, 0xF0, 0x00, 0xF1, 0x70, 0xF0, 0x01, 0x01, 0x01, 0x00, 0xF0, 0x50,
  0xA0, 0x00, 0xF1, 0x50, 0x11, 0x00, 0xF1, 0xC0, 0xF1, 0x00, 0xF0, 0x51,
  0x11, 0x00, 0xE0, 0x11, 0xA1, 0x01, 0x10, 0xF0, 0x11, 0x00, 0xF0, 0x51,
  0xA1, 0x00, 0xE0, 0x10, 0xE0, 0x00, 0xF0, 0x70, 0xF0, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x71, 0x41, 0xF0, 0x00, 0xE1, 0x10,
  0xA1, 0x00, 0x11, 0xF1, 0x11, 0x00, 0xE1, 0x50, 0xE0, 0x00, 0xF1, 0x40,
  0xF1, 0x00, 0xE1, 0x11, 0xE1, 0x00, 0xF1, 0x50, 0xA1, 0x00, 0xF1, 0xC1,
  0xF0, 0x01, 0x10, 0xF1, 0x10, 0x01, 0xF0, 0x50, 0x10, 0x00, 0x01, 0x01,
  0x00, 0x00, 0xF1, 0x11, 0xF1, 0x00, 0xF1, 0x51, 0x23, 0x00, 0xF1, 0xC1,
  0xF1, 0x00, 0xF0, 0x51, 0xD0, 0x00, 0xE0, 0x11, 0xE0, 0x00, 0xF1, 0x51,
  0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0xF1, 0xC0, 0xF1, 0x00, 0x03, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01,
  0x00, 0xF0, 0x80, 0x81, 0x80, 0xF0, 0x01, 0xC0, 0x21, 0x10, 0x21, 0xC0,
  0x01, 0x70, 0x80, 0xE1, 0x80, 0x70, 0x01, 0xF1, 0x20, 0xC0, 0x21, 0xF0,
  0x01, 0xF0, 0x00, 0x81, 0x60, 0xF0, 0x01, 0x11, 0x11, 0xF0, 0x10, 0x10,
  0x00, 0xF0, 0x91, 0x90, 0x91, 0x10, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
  0x01, 0xE0, 0x11, 0x11, 0x11, 0xE0, 0x00, 0xF1, 0x80, 0x40, 0x21, 0x10,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x01, 0x01, 0x01, 0x07,
  0x00, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07,
  0x00, 0x07, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
  0x00, 0x07, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x03, 0x04, 0x04, 0x04, 0x03, 0x00, 0x07, 0x00, 0x01, 0x02, 0x04,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};


//----------------------------------------------------------------------
// Секция шрифтов


// Font size    : 6x8 pixels
fontdatatype SmallFontRus[] PROGMEM={
0x06,0x08,0x20,0x5F,
0x00,0x00,0x00,0x00,0x00,0x00,  // <space>
0x00,0x00,0x00,0x2F,0x00,0x00,  // !
0x00,0x00,0x07,0x00,0x07,0x00,  // "
0x00,0x14,0x7F,0x14,0x7F,0x14,  // #
0x00,0x24,0x2A,0x7F,0x2A,0x12,  // $
0x00,0x23,0x13,0x08,0x64,0x62,  // %
0x00,0x36,0x49,0x55,0x22,0x50,  // &
0x00,0x00,0x05,0x03,0x00,0x00,  // '
0x00,0x00,0x1C,0x22,0x41,0x00,  // (
0x00,0x00,0x41,0x22,0x1C,0x00,  // )
0x00,0x14,0x08,0x3E,0x08,0x14,  // *
0x00,0x08,0x08,0x3E,0x08,0x08,  // +
0x00,0x00,0x00,0xA0,0x60,0x00,  // ,
0x00,0x08,0x08,0x08,0x08,0x08,  // -
0x00,0x00,0x60,0x60,0x00,0x00,  // .
0x00,0x20,0x10,0x08,0x04,0x02,  // /

0x00,0x3E,0x51,0x49,0x45,0x3E,  // 0
0x00,0x00,0x42,0x7F,0x40,0x00,  // 1
0x00,0x42,0x61,0x51,0x49,0x46,  // 2
0x00,0x21,0x41,0x45,0x4B,0x31,  // 3
0x00,0x18,0x14,0x12,0x7F,0x10,  // 4
0x00,0x27,0x45,0x45,0x45,0x39,  // 5
0x00,0x3C,0x4A,0x49,0x49,0x30,  // 6
0x00,0x01,0x71,0x09,0x05,0x03,  // 7
0x00,0x36,0x49,0x49,0x49,0x36,  // 8
0x00,0x06,0x49,0x49,0x29,0x1E,  // 9
0x00,0x00,0x36,0x36,0x00,0x00,  // :
0x00,0x00,0x56,0x36,0x00,0x00,  // ;
0x00,0x08,0x14,0x22,0x41,0x00,  // <
0x00,0x14,0x14,0x14,0x14,0x14,  // =
0x00,0x00,0x41,0x22,0x14,0x08,  // >
0x00,0x02,0x01,0x51,0x09,0x06,  // ?

0x00,0x32,0x49,0x59,0x51,0x3E,  // @
0x00,0x7C,0x12,0x11,0x12,0x7C,  // A
0x00,0x7F,0x49,0x49,0x49,0x36,  // B
0x00,0x3E,0x41,0x41,0x41,0x22,  // C
0x00,0x7F,0x41,0x41,0x22,0x1C,  // D
0x00,0x7F,0x49,0x49,0x49,0x41,  // E
0x00,0x7F,0x09,0x09,0x09,0x01,  // F
0x00,0x3E,0x41,0x49,0x49,0x7A,  // G
0x00,0x7F,0x08,0x08,0x08,0x7F,  // H
0x00,0x00,0x41,0x7F,0x41,0x00,  // I
0x00,0x20,0x40,0x41,0x3F,0x01,  // J
0x00,0x7F,0x08,0x14,0x22,0x41,  // K
0x00,0x7F,0x40,0x40,0x40,0x40,  // L
0x00,0x7F,0x02,0x0C,0x02,0x7F,  // M
0x00,0x7F,0x04,0x08,0x10,0x7F,  // N
0x00,0x3E,0x41,0x41,0x41,0x3E,  // O

0x00,0x7F,0x09,0x09,0x09,0x06,  // P
0x00,0x3E,0x41,0x51,0x21,0x5E,  // Q
0x00,0x7F,0x09,0x19,0x29,0x46,  // R
0x00,0x46,0x49,0x49,0x49,0x31,  // S
0x00,0x01,0x01,0x7F,0x01,0x01,  // T
0x00,0x3F,0x40,0x40,0x40,0x3F,  // U
0x00,0x1F,0x20,0x40,0x20,0x1F,  // V
0x00,0x3F,0x40,0x38,0x40,0x3F,  // W
0x00,0x63,0x14,0x08,0x14,0x63,  // X
0x00,0x07,0x08,0x70,0x08,0x07,  // Y
0x00,0x61,0x51,0x49,0x45,0x43,  // Z
0x00,0x00,0x7F,0x41,0x41,0x00,  // [
0xAA,0x55,0xAA,0x55,0xAA,0x55,  // <backslash>
0x00,0x00,0x41,0x41,0x7F,0x00,  // ]
0x00,0x04,0x02,0x01,0x02,0x04,  // ^
0x00,0x40,0x40,0x40,0x40,0x40,  // _

0x00,0x00,0x03,0x05,0x00,0x00,  // `
0x00,0x7C,0x12,0x11,0x12,0x7C,  // a
0x00,0x7F,0x49,0x49,0x49,0x36,  // b
0x00,0x7F,0x49,0x49,0x49,0x36,  // c
0x00,0x7F,0x01,0x01,0x01,0x01,  // d
0x00,0x60,0x3E,0x23,0x3F,0x60,  // e
0x00,0x7F,0x49,0x49,0x49,0x41,  // f
0x00,0x77,0x08,0x3E,0x08,0x77,  // g
0x00,0x22,0x49,0x49,0x5D,0x36,  // h
0x00,0x00,0x44,0x7D,0x40,0x00,  // i
0x00,0x40,0x80,0x84,0x7D,0x00,  // j
0x00,0x7F,0x10,0x28,0x44,0x00,  // k
0x00,0x00,0x41,0x7F,0x40,0x00,  // l
0x00,0x7C,0x04,0x18,0x04,0x78,  // m
0x00,0x7C,0x08,0x04,0x04,0x78,  // n
0x00,0x38,0x44,0x44,0x44,0x38,  // o

0x00,0xFC,0x24,0x24,0x24,0x18,  // p
0x00,0x18,0x24,0x24,0x18,0xFC,  // q
0x00,0x7C,0x08,0x04,0x04,0x08,  // r
0x00,0x48,0x54,0x54,0x54,0x20,  // s
0x00,0x04,0x3F,0x44,0x40,0x20,  // t
0x00,0x3C,0x40,0x40,0x20,0x7C,  // u
0x00,0x1C,0x20,0x40,0x20,0x1C,  // v
0x00,0x3C,0x40,0x30,0x40,0x3C,  // w
0x00,0x44,0x28,0x10,0x28,0x44,  // x
0x00,0x1C,0xA0,0xA0,0xA0,0x7C,  // y
0x00,0x44,0x64,0x54,0x4C,0x44,  // z
0x00,0x00,0x10,0x7C,0x82,0x00,  // {
0x00,0x00,0x00,0xFF,0x00,0x00,  // |
0x00,0x00,0x82,0x7C,0x10,0x00,  // }
0x00,0x00,0x06,0x09,0x09,0x06,  // ~
//-----------------------------------
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  //
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 

0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 

0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x7E,0x4B,0x4A,0x4B,0x42,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 

0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  //
0x00,0x00,0x00,0x00,0x00,0x20,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x38,0x55,0x54,0x55,0x58,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  //
0x00,0x00,0x00,0x00,0x00,0x00,  //
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 
0x00,0x00,0x00,0x00,0x00,0x00,  // 

0x00,0x00,0x03,0x05,0x00,0x00,  // 
0x00,0x7C,0x12,0x11,0x12,0x7C,  // 
0x00,0x7F,0x49,0x49,0x49,0x30,  // 
0x00,0x7F,0x49,0x49,0x49,0x36,  // 
0x00,0x7F,0x01,0x01,0x01,0x01,  // 
0x00,0x60,0x3E,0x23,0x3F,0x60,  // 
0x00,0x7F,0x49,0x49,0x49,0x41,  //
0x00,0x77,0x08,0x3E,0x08,0x77,  // 
0x00,0x22,0x49,0x49,0x5D,0x36,  // 
0x00,0x7F,0x30,0x08,0x06,0x7F,  // 
0x00,0x7F,0x30,0x19,0x0C,0x7F,  // 
0x00,0x7F,0x08,0x08,0x14,0x63,  // 
0x00,0x40,0x7E,0x01,0x01,0x7F,  // 
0x00,0x7F,0x02,0x0C,0x02,0x7F,  // 
0x00,0x7F,0x08,0x08,0x08,0x7F,  // 
0x00,0x3E,0x41,0x41,0x41,0x3E,  // 

0x00,0x7F,0x01,0x01,0x01,0x7F,  // 
0x00,0x7F,0x09,0x09,0x09,0x06,  // 
0x00,0x3E,0x41,0x41,0x41,0x22,  // 
0x00,0x01,0x01,0x7F,0x01,0x01,  // 
0x00,0x07,0x48,0x48,0x48,0x3F,  // 
0x00,0x0E,0x11,0x7F,0x11,0x0E,  // 
0x00,0x63,0x14,0x08,0x14,0x63,  // 
0x00,0x3F,0x20,0x20,0x3F,0x60,  // 
0x00,0x07,0x08,0x08,0x08,0x7F,  // 
0x00,0x7F,0x40,0x7E,0x40,0x7F,  // 
0x00,0x3F,0x20,0x3F,0x20,0x7F,  // 
0x40,0x01,0x7F,0x48,0x48,0x30,  // 
0x00,0x7F,0x48,0x30,0x00,0x7F,  // 
0x00,0x7F,0x48,0x48,0x30,0x00,  // 
0x41,0x49,0x49,0x49,0x3E,0x00,  // 
0x00,0x7F,0x08,0x3E,0x41,0x3E,
0x00,0x46,0x29,0x19,0x09,0x7F,
//-----------------------------------
//0x00,0x00,0x00,0x00,0x00,0x00,
//0x00,0x7C,0x10,0x7C,0x44,0x7C,
0x00,0x20,0x54,0x54,0x54,0x78,  // 
0x00,0x3C,0x4A,0x4A,0x4A,0x30,  // 
0x00,0x7C,0x54,0x54,0x54,0x28,  // 
0x00,0x7C,0x04,0x04,0x04,0x00,  // 
0x00,0x60,0x3C,0x24,0x3C,0x60,  // 
0x00,0x38,0x54,0x54,0x54,0x18,  // 
0x00,0x6C,0x10,0x7C,0x10,0x6C,  // 
0x00,0x28,0x44,0x54,0x54,0x28,  // 
0x00,0x7C,0x20,0x10,0x08,0x7C,  // 
0x00,0x7C,0x20,0x12,0x08,0x7C,  // 
0x00,0x7C,0x10,0x10,0x28,0x44,  // 
0x00,0x40,0x7C,0x04,0x04,0x7C,  // 
0x00,0x7C,0x08,0x10,0x08,0x7C,  // 
0x00,0x7C,0x10,0x10,0x10,0x7C,  // 
0x00,0x38,0x44,0x44,0x44,0x38,  // 

0x00,0x7C,0x04,0x04,0x04,0x7C,  // 
0x00,0x7C,0x24,0x24,0x24,0x18,  // 
0x00,0x38,0x44,0x44,0x44,0x28,  // 
0x00,0x04,0x04,0x7C,0x04,0x04,  // 
0x00,0x0C,0x50,0x50,0x50,0x3C,  // 
0x00,0x18,0x24,0x7C,0x24,0x18,  // 
0x00,0x44,0x28,0x10,0x28,0x44,  // 
0x00,0x3C,0x20,0x20,0x3C,0x60,  // 
0x00,0x1C,0x20,0x20,0x7C,0x00,  // 
0x00,0x7C,0x40,0x78,0x40,0x7C,  // 
0x00,0x3C,0x20,0x3C,0x20,0x7C,  // 
0x40,0x04,0x7C,0x50,0x50,0x20,  //
0x00,0x7C,0x50,0x70,0x00,0x7C,  // 
0x00,0x7C,0x50,0x50,0x20,0x00,  // 
0x44,0x54,0x54,0x54,0x38,0x00,  // 
0x00,0x7C,0x10,0x7C,0x44,0x7C,
0x00,0x48,0x54,0x34,0x14,0x7C,
};

/*
fontdatatype rus_4x6[] PROGMEM =
{
0x04, 0x08, 0xC0, 0x20,
0x00, 0x3c, 0x12, 0x3c,                        // Code for char А
0x00, 0x3E, 0x2A, 0x12,                        // Code for char Б
0x00, 0x3E, 0x2A, 0x14,                        // Code for char В
0x00, 0x3E, 0x02, 0x02,                        // Code for char Г
0x00, 0x30, 0x1E, 0x30,                        // Code for char Д
0x00, 0x3E, 0x2A, 0x22,                        // Code for char Е
0x00, 0x36, 0x3E, 0x36,                        // Code for char Ж
0x00, 0x22, 0x2A, 0x14,                        // Code for char З
0x00, 0x3E, 0x18, 0x3E,                        // Code for char И
0x00, 0x3E, 0x19, 0x3E,                        // Code for char Й
0x00, 0x3E, 0x08, 0x22,                        // Code for char К
0x00, 0x3C, 0x02, 0x3E,                        // Code for char Л
0x00, 0x3E, 0x0E, 0x3E,                        // Code for char М
0x00, 0x3E, 0x08, 0x3E,                        // Code for char Н
0x00, 0x1C, 0x22, 0x1C,                        // Code for char О
0x00, 0x3E, 0x02, 0x3E,                        // Code for char П
0x00, 0x3E, 0x0A, 0x04,                        // Code for char Р
0x00, 0x1C, 0x22, 0x14,                        // Code for char С
0x00, 0x02, 0x3E, 0x02,                        // Code for char Т
0x00, 0x06, 0x28, 0x1E,                        // Code for char У
0x00, 0x1C, 0x3E, 0x1C,                        // Code for char Ф
0x00, 0x36, 0x08, 0x36,                        // Code for char Х
0x00, 0x1E, 0x10, 0x2E,                        // Code for char Ц
0x00, 0x0E, 0x08, 0x3E,                        // Code for char Ч
0x00, 0x3E, 0x38, 0x3E,                        // Code for char Ш
0x00, 0x1E, 0x1C, 0x3E,                        // Code for char Щ
0x00, 0x3E, 0x28, 0x10,                        // Code for char Ъ
0x3E, 0x30, 0x00, 0x3E,                        // Code for char Ы
0x00, 0x3E, 0x28, 0x10,                        // Code for char Ь
0x00, 0x14, 0x2A, 0x1C,                        // Code for char Э
0x3E, 0x08, 0x3E, 0x3E,                        // Code for char Ю
0x00, 0x34, 0x0A, 0x3E,                        // Code for char Я
};
*/

fontdatatype TinyFontRus[] PROGMEM =
{
0x04, 0x06, 0x20, 0x5f,
0x00, 0x00, 0x00, 0x03, 0xa0, 0x00, 0xc0, 0x0c, 0x00, 0xf9, 0x4f, 0x80, 0x6b, 0xeb, 0x00, 0x98, 0x8c, 0x80, 0x52, 0xa5, 0x80, 0x03, 0x00, 0x00,  // Space, !"#$%&'
0x01, 0xc8, 0x80, 0x89, 0xc0, 0x00, 0x50, 0x85, 0x00, 0x21, 0xc2, 0x00, 0x08, 0x40, 0x00, 0x20, 0x82, 0x00, 0x00, 0x20, 0x00, 0x18, 0x8c, 0x00,  // ()*+,-./
0xfa, 0x2f, 0x80, 0x4b, 0xe0, 0x80, 0x5a, 0x66, 0x80, 0x8a, 0xa5, 0x00, 0xe0, 0x8f, 0x80, 0xea, 0xab, 0x00, 0x72, 0xa9, 0x00, 0x9a, 0x8c, 0x00,  // 01234567
0xfa, 0xaf, 0x80, 0x4a, 0xa7, 0x00, 0x01, 0x40, 0x00, 0x09, 0x40, 0x00, 0x21, 0x48, 0x80, 0x51, 0x45, 0x00, 0x89, 0x42, 0x00, 0x42, 0x66, 0x00,  // 89:;<=>?
0x72, 0xa6, 0x80, 0x7a, 0x87, 0x80, 0xfa, 0xa5, 0x00, 0x72, 0x25, 0x00, 0xfa, 0x27, 0x00, 0xfa, 0xa8, 0x80, 0xfa, 0x88, 0x00, 0x72, 0x2b, 0x00,  // @ABCDEFG
0xf8, 0x8f, 0x80, 0x8b, 0xe8, 0x80, 0x8b, 0xe8, 0x00, 0xf8, 0x8d, 0x80, 0xf8, 0x20, 0x80, 0xf9, 0x0f, 0x80, 0xf9, 0xcf, 0x80, 0x72, 0x27, 0x00,  // HIJKLMNO
0xfa, 0x84, 0x00, 0x72, 0x27, 0x40, 0xfa, 0x85, 0x80, 0x4a, 0xa9, 0x00, 0x83, 0xe8, 0x00, 0xf0, 0x2f, 0x00, 0xe0, 0x6e, 0x00, 0xf0, 0xef, 0x00,  // PQRSTUVW
0xd8, 0x8d, 0x80, 0xc0, 0xec, 0x00, 0x9a, 0xac, 0x80, 0x03, 0xe8, 0x80, 0xc0, 0x81, 0x80, 0x8b, 0xe0, 0x00, 0x42, 0x04, 0x00, 0x08, 0x20, 0x80,  // XYZ[\]^_
0x02, 0x04, 0x00, 0x31, 0x23, 0x80, 0xf9, 0x23, 0x00, 0x31, 0x24, 0x80, 0x31, 0x2f, 0x80, 0x31, 0x62, 0x80, 0x23, 0xea, 0x00, 0x25, 0x53, 0x80,  // `abcdefg
0xf9, 0x03, 0x80, 0x02, 0xe0, 0x00, 0x06, 0xe0, 0x00, 0xf8, 0x42, 0x80, 0x03, 0xe0, 0x00, 0x79, 0x87, 0x80, 0x39, 0x03, 0x80, 0x31, 0x23, 0x00,  // hijklmno
0x7d, 0x23, 0x00, 0x31, 0x27, 0xc0, 0x78, 0x84, 0x00, 0x29, 0x40, 0x00, 0x43, 0xe4, 0x00, 0x70, 0x27, 0x00, 0x60, 0x66, 0x00, 0x70, 0x67, 0x00,  // pqrstuvw
0x48, 0xc4, 0x80, 0x74, 0x57, 0x80, 0x59, 0xe6, 0x80, 0x23, 0xe8, 0x80, 0x03, 0x60, 0x00, 0x8b, 0xe2, 0x00, 0x61, 0x0c, 0x00,                     // zyx{|}~
0x00, 0x00, 0x1E, // Index: 95 (0x005F)  Character: 0x007F ('')
0x01, 0x07, 0x96, // Index: 96 (0x0060)  Character: 0x0080 ('?')
0x00, 0x07, 0x90, // Index: 97 (0x0061)  Character: 0x0081 ('?')
0x00, 0x30, 0x00, // Index: 98 (0x0062)  Character: 0x0082 ('?')
0x00, 0x00, 0x00, // Index: 99 (0x0063)  Character: 0x0083 ('?')
0x0C, 0x00, 0x00, // Index: 100 (0x0064)  Character: 0x0084 ('?')
0x00, 0x00, 0x00, // Index: 101 (0x0065)  Character: 0x0085 ('?')
0x00, 0x00, 0x00, // Index: 102 (0x0066)  Character: 0x0086 ('?')
0x00, 0x00, 0x00, // Index: 103 (0x0067)  Character: 0x0087 ('?')
0x00, 0x00, 0x00, // Index: 104 (0x0068)  Character: 0x0088 ('?')
0x00, 0x00, 0x00, // Index: 105 (0x0069)  Character: 0x0089 ('?')
0x00, 0x00, 0x00, // Index: 106 (0x006A)  Character: 0x008A ('?')
0x00, 0x01, 0x0A, // Index: 107 (0x006B)  Character: 0x008B ('?')
0x00, 0x00, 0x00, // Index: 108 (0x006C)  Character: 0x008C ('?')
0x01, 0xE3, 0x12, // Index: 109 (0x006D)  Character: 0x008D ('?')
0x01, 0x07, 0x96, // Index: 110 (0x006E)  Character: 0x008E ('?')
0x01, 0xE0, 0xDE, // Index: 111 (0x006F)  Character: 0x008F ('?')
0x01, 0xE1, 0x80, // Index: 112 (0x0070)  Character: 0x0090 ('?')
0x01, 0x00, 0x00, // Index: 113 (0x0071)  Character: 0x0091 ('?')
0x01, 0x00, 0x00, // Index: 114 (0x0072)  Character: 0x0092 ('?')
0x40, 0x00, 0x00, // Index: 115 (0x0073)  Character: 0x0093 ('?')
0x00, 0x00, 0x00, // Index: 116 (0x0074)  Character: 0x0094 ('?')
0x00, 0x00, 0x00, // Index: 117 (0x0075)  Character: 0x0095 ('?')
0x00, 0x00, 0x00, // Index: 118 (0x0076)  Character: 0x0096 ('?')
0x00, 0x00, 0x00, // Index: 119 (0x0077)  Character: 0x0097 ('?')
0x00, 0x00, 0x00, // Index: 120 (0x0078)  Character: 0x0098 ('')
0x00, 0x00, 0x00, // Index: 121 (0x0079)  Character: 0x0099 ('?')
0x00, 0x00, 0x00, // Index: 122 (0x007A)  Character: 0x009A ('?')
0x00, 0x02, 0x84, // Index: 123 (0x007B)  Character: 0x009B ('?')
0x00, 0x00, 0x00, // Index: 124 (0x007C)  Character: 0x009C ('?')
0x00, 0x00, 0x00, // Index: 125 (0x007D)  Character: 0x009D ('?')
0x00, 0x00, 0x00, // Index: 126 (0x007E)  Character: 0x009E ('?')
0x00, 0x00, 0x00, // Index: 127 (0x007F)  Character: 0x009F ('?')
0x00, 0x00, 0x00, // Index: 128 (0x0080)  Character: 0x00A0 (' ')
0x00, 0x00, 0x00, // Index: 129 (0x0081)  Character: 0x00A1 ('?')
0x00, 0x00, 0x00, // Index: 130 (0x0082)  Character: 0x00A2 ('?')
0x00, 0x00, 0x9C, // Index: 131 (0x0083)  Character: 0x00A3 ('?')
0x00, 0x00, 0x00, // Index: 132 (0x0084)  Character: 0x00A4 ('¤')
0x00, 0x00, 0x00, // Index: 133 (0x0085)  Character: 0x00A5 ('?')
0x00, 0x00, 0x00, // Index: 134 (0x0086)  Character: 0x00A6 ('¦')
0x00, 0x00, 0x00, // 0xA7  
0x03, 0xFF, 0xFF, // 0xA8   |||
0x00, 0x0F, 0xFF, // 0xA9    ||
0x00, 0x00, 0x3F, // 0xAA     |
0x82, 0x08, 0x20, // 0xAB 1-
0xC3, 0x0C, 0x30, // 0xAC 2-
0xE3, 0x8E, 0x38, // 0xAD 3-
0xF3, 0xCF, 0x3C, // 0xAE 4-
0xFB, 0xEF, 0xBE, // 0xAF 5-
0x3C, 0xF3, 0xCF, // 0xB0 5_
0x3C, 0xF3, 0xCF, // 0xB1 4_
0x1C, 0x71, 0xC7, // 0xB2 3_
0x0C, 0x30, 0xC3, // 0xB3 2_
0x04, 0x10, 0x41, // 0xB4 1_
0xFF, 0xFF, 0xFF, // 0xB5 ||||
0xFF, 0xFF, 0xC0, // 0xB6 |||
0xFF, 0xF0, 0x00, // 0xB7 ||
0xFC, 0x00, 0x00, // 0xB8 |
0x38, 0xA2, 0x80, // 0xB9 с
0x30, 0x43, 0x80, // 0xBA ч
0x18, 0xC1, 0x80, // 0xBB д 
0x38, 0xC3, 0x80, // 0xBC м
0x38, 0x42, 0x80, // 0xBD к
0xFA, 0x84, 0x8C, // 0xBE Р/
0x40, 0xC1, 0x0E, // 0xBF /ч
0x7A, 0x87, 0x80, // А
0xFA, 0xAB, 0x80, // Б
0xFA, 0xA5, 0x00, // В
0xFA, 0x08, 0x00, // Г
0x1B, 0xC1, 0x80, // Д
0xFA, 0xA8, 0x80, // Е
0xDB, 0xED, 0x80, // Ж
0x8A, 0xA5, 0x00, // З
0xF8, 0xCF, 0x80, // И
0x7A, 0xC7, 0x80, // Й
0xF8, 0x89, 0x80, // К
0x7A, 0x0F, 0x80, // Л
0xFB, 0x8F, 0x80, // М
0xF8, 0x8F, 0x80, // Н
0x72, 0x27, 0x00, // О
0xFA, 0x0F, 0x80, // П
0xFA, 0x84, 0x00, // Р
0x72, 0x28, 0x80, // С
0x83, 0xE8, 0x00, // Т
0xE8, 0xAF, 0x00, // У
0x73, 0xE7, 0x00, // Ф
0x89, 0xC8, 0x80, // Х
0xF8, 0x2F, 0x83, // Ц
0xE0, 0x8F, 0x80, // Ч
0xF8, 0xEF, 0x80, // Ш
0xF8, 0xEF, 0xC0, // Щ
0x83, 0xE2, 0x84, // Ъ
0xF8, 0xA1, 0x3E, // Ы
0xF8, 0xA1, 0x00, // Ь
0x8A, 0xA7, 0x00, // Э
0xF9, 0xC8, 0x9C, // Ю
0x5A, 0x8F, 0x80, // Я
};

 

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

alexadresat, про них забыл. Появится минута - перерисую.

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

OfficialGalkin - шкалу на батарейки надо наоборот повернуть, чтоб слева наперво шкала была. Так сказать по феншую.

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

Да, но надо дополнительное условие прописать. Что бы сдвигалось заполнение направо. Так как по умолчанию привязка к левой стороне. От точки координат направо все рисуется

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

tekagi - у меня к тебе вопроc...

У меня проблема, палец подносишь к трансу счет как будто изотоп поднес. Что может это быть?

Dark-Dante
Offline
Зарегистрирован: 09.01.2018

tekagi пишет:
Возможен в индикации сдвиг на одну секунду

Не понял что за сдвиг? Опять 61 секунда что-ли?

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

Все. теперь по феншую.

 myGLCD.drawBitmap(70, 1, logo_bat_line, batline, 3);

закменить на

 myGLCD.drawBitmap(83 - batline, 1, logo_bat_line, batline, 3);

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

OfficialGalkin - ОК!

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

alexadresat, скорее всего наводки с генератора на счётную часть. У себя на твоей плате подобного не замечал, надо будет потыкать как-нибудь.
Dark-Dante, это только в индикации, и то не факт, что проявится. Особо не тестировал пока.

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

Не дотрагиваюсь, а подношу миллиметров на 8-10. Появилось это чудо месяц назад.

Есть идеи как это победить...

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

У меня вообще верещал постоянно. Я транс обмотал фальгой и посадил фальгу на +, который на транс идет с резистора.

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

При батарейном питании или от сети? Ничего перед этим не менял? На прикосновение/поднесение к телу СБМ так же реагирует? Только что потыкал в свой - никаких глюков.

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

у него может близко транс стоит к линии считывания импульсов. у меня эти импульсы считал без всяких пальцев. 

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

От батарейки пищит. От блока питания все хорошо, как и должно быть.

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

OfficialGalkin, на разных концах платы. На данный момент это самая удобная печатка, невзирая на перевёрнутую ардуину.

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

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

Ну у меня прям около ардуины. Самая компактная плата хахаха

 

Я кстати транс потом поменял. Тот в кз ушел. 

Транс на индуктивности 8.2 микрогенри.

http://arduino.ru/forum/proekty/delaem-dozimetr?page=57#comment-464483

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

Нет не пробывал, завтра. Еще момент если к разъему зарядки прикоснуться, все работает как надо, хоть датрагивайся да транса. 

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

tekagi - Электролит не помог. 

Супрессор поставил двунаправленный вот этот SMBJ10CA ,как думаешm нормально?

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

Срез на 17V, думаю вполне подойдёт. Я ставил следующий, одиннадцатый.

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

Пофиксил батарейку.

1) Теперь длина шкалы 10 пикселей.

2) 1 приксель заполнения равен 10% заряда. 

3) Сдвинуто заполнение. Теперь от 90% и выше юудет полная батарея. Со старым кодом полная батарея была только со 100% что невозможно. 

4) Упрощен рассчет. Убраны лишние умножения\деления

5) Мигание сделано от 5%

void battery()  //батарейка
{
if (bat_mill - millis() > 2000) 
  {
    bat_mill = millis();
    VCC_read();
  }
myGLCD.setFont(TinyFontRus);
byte batline = 10; //Задаем длину линии батареи
batline = 10 * (VCC - batnapruga); //Зависимость длинны в пикселях от процента заряда
//myGLCD.printNumF(((VCC - batnapruga) * 100), 0, 62, 0); //процент заряда
      if ((VCC - batnapruga) > 0.05) //Проверяем процентный заряд акб 0.05 - 5%
        {
  myGLCD.drawBitmap(71, 0, logo_bat, 16, 5);
  if ((VCC - batnapruga) >= 1) {batline = 9;}
  myGLCD.drawBitmap(82 - batline, 1, logo_bat_line, batline + 1, 3);
        }
      else //Если заряд меньше 5% мигаем пустой батарейкой
        {
          toch = !toch;
          if (toch == 0) 
          {
            myGLCD.drawBitmap(71, 0, logo_bat, 16, 5);
          }
          else 
          {
            myGLCD.drawBitmap(71, 0, logo_bat, 0, 0);
          } 
        }
}

графика

const unsigned char PROGMEM logo_bat[] =
{0xe,0x1f,0x11,0x11,
0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x11,
0x1f};
 
const unsigned char PROGMEM logo_bat_line[] =
{0x7,0x7,0x7,0x7,
0x7,0x7,0x7,0x7,
0x7,0x7};

настройки теже

float batnapruga = 3.20; //Настройка минимального значения напряжения акб для отображения. Зависит от работоспособности вашей схемы. Обычно 3.20 вольта by OfficialGalkin 
//настройки //////////////конец

если нужно отображение процента заряда, то расскоментить строчку //процент заряда

Теперь отображение батарейки я думаю можно считать завершенным) 

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

А при напряжении выше 4,3V вместо заполнения нарисовать знак юсб? ))

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

Ага) Сделаю. Только проблема, сейчас только дошло. Что если изменить настройки на например 3.5 вольта. То даже при 4.2 вольта будет не 100%.

У кого-то же плата при 3.4 вольта уже отрубается. А тут надо 3.2 вольта что бы правильно проценты считались. 

Сейчас это переделываю. И тогда уже точно будет все окончательно готово )) 

И можно будет хоть 3.8 вольта минимальное выставить

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

Все. Теперь точно готово. Пользуемся)

Можно выставить максимальное и минимальное значение напряжения. 

Можно выставить напряжение при котором будет отображаться значек USB

Можно включить\выключить индикацию процентов

В настройки прописать:

bool batproc = 1; // 1- отображать проценты. 0 - не отображать
float batusb = 4.30; // настройка напряжения, выше которого будет отображаться значек USB
float batmax = 4.20; //Настройка максимального значения напряжения акб для отображения. Обычно 4.20 вольта
float batnapruga = 3.20; //Настройка минимального значения напряжения акб для отображения. Зависит от работоспособности вашей схемы. Обычно 3.20 вольта by OfficialGalkin 

В служебных переменных добавить логотипы:

extern uint8_t logo_bat[], logo_bat_line[], logo_bat_usb[], logo_rag[], logo_tr[], beta_prev_1[], beta_prev_2[], em_logo[];

Код батареи:

void battery()  //батарейка
{
if (bat_mill - millis() > 2000) 
  {
    bat_mill = millis();
    VCC_read();
  }
myGLCD.setFont(TinyFontRus);
byte batprocent = 100;
batprocent = (VCC - batnapruga) * 100 / (batmax - batnapruga);
byte batline = 9; //Задаем длину линии батареи
batline = 10 * (((VCC - batnapruga) * 100 / (batmax - batnapruga)) / 100); //Зависимость длинны в пикселях от процента заряда

if (batproc == 1 && VCC < batusb && batprocent < 100) {myGLCD.printNumF(batprocent, 0, 62, 0);} // процент заряда
      if (batprocent > 5) //Проверяем процентный заряд акб 0.05 - 5%
        {
          if (VCC > batusb)
          {
  myGLCD.drawBitmap(71, 0, logo_bat_usb, 13, 5);
          }
            else
          {
  myGLCD.drawBitmap(71, 0, logo_bat, 13, 5);
  if (batprocent >= 100) {batline = 9;}
  myGLCD.drawBitmap(82 - batline, 1, logo_bat_line, batline + 1, 3);
          }
        }
      else //Если заряд меньше 5% мигаем пустой батарейкой
        {
          toch = !toch;
          if (toch == 0) 
          {
            myGLCD.drawBitmap(71, 0, logo_bat, 13, 5);
          }
          else 
          {
            myGLCD.drawBitmap(71, 0, logo_bat, 0, 0);
          } 
        }
}

Ну и логотипы

const unsigned char PROGMEM logo_bat[] =
{0xe,0x1f,0x11,0x11,
0x11,0x11,0x11,0x11,
0x11,0x11,0x11,0x11,
0x1f};
 
const unsigned char PROGMEM logo_bat_line[] =
{0x7,0x7,0x7,0x7,
0x7,0x7,0x7,0x7,
0x7,0x7};

const unsigned char PROGMEM logo_bat_usb[] =
{0xf,0x10,0x10,0xf,
0x0,0x17,0x15,0x1d,
0x0,0x1f,0x15,0x15,
0xa
};

Отображение процентов отключается при подключении USB

Проценты считаются по формуле

n*100:N

Где:

n { Текущее напряжение - выставленное минимальное напряжение}

N { Выставленное максимальное напряджение - текущее напряжение}

 

10 агуста 2019: Исправлен баг с присвоением значения 1 процентам.

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

OfficialGalkin пишет:
  

float batproc = 1; // 1- отображать проценты. 0 - не отображать

Вай, зачем вместо boolean использовать float? В ардуину, тащемта, планку памяти добавить нельзя... Тут люди извращаются, один байт в качестве восьми boolean используют чтобы память сэкономить, но чтобы наоборот...

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

Косячок у батарейки....

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

Напряжение выше установленного? Я прописал условие и изменил код ьбатарейки. что бы выше 99% проценты не отображались

Dark-Dante
Offline
Зарегистрирован: 09.01.2018

С ЮСБ будет косяк, так как при подключении аккума на зарядку на нем же сразу не становится 4.3 Вольта... Доя себя оставлю батарейку по умолчанию, никакие проценты, пиксели и моргания не заменят просто обычного отображения напряжения в Вольтах посмотрев на которое всё сразу становится понятно. Как по мне лучше сделать чтобы процессор принудительно выключался либо уходил в сон при напряжении , скажем, ниже 3 1 Вольта

tekagi, можете добавить ноль перед единицами секунд при счёте времени разностного замера?