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

Muxi
Онлайн
Зарегистрирован: 22.01.2019

tekagi пишет:
Кто мешает взять "формулу" и посчитать? Вот только достоверность результата будет стремиться к нулю. Ибо не учитывает ни расстояние до датчика, ни геометрию источника и т.д.

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

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

Я просто к чему, если мы уже меряем бету, выводом данные по разности, то можно вывести данные и в беккерелях. Как говорилось в одном из видео с первой страницы: здесь никто не гарантирует точность, прибор даёт возможность оценить опасность и не более, так и здесь, можно будет просто оценить опасность тех же даров леса

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

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

Arezus
Arezus аватар
Offline
Зарегистрирован: 26.06.2013

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

blokerun2
Offline
Зарегистрирован: 27.01.2019

Может ли счетчик СБМ-20 без фольги быть в полтора раза чувствительней (по гамма и бета условно), чем счетчики СБМ-20 в фольге и чем счетчик СТС-5 (очень старый) ?

Muxi
Онлайн
Зарегистрирован: 22.01.2019

А чем обусловлено хранение в gif.c заставок к бета измерениям? почему отказались от

myGLCD.print(utf8rus("РЕЖИМ РАЗНОСТНОГО"), CENTER, 0);

?

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

blokerun2, зависит от источника. Компенсационный экран выравнивает чувствительность счётчика по гамме, и отсекает бету. Старые же счётчики со временем теряют свои характеристики.
Muxi, памяти мало. Это, кстати, написано в комментариях чейнджлога в скетче.

Arezus
Arezus аватар
Offline
Зарегистрирован: 26.06.2013

Напросился сегодня в лабораторию по поверке дозиметров, единственное, что в работе были чернобыльские дозиметры и загрузили мощный источник Cs-137. Минимально что с него можно получить - 3147 мкР/ч на расстоянии 5 метров. Определился момент зашкала - 2,1 мР/ч.  Пока не знаю в какую сторону копать, то ли ток повышать на датчик, то ли ВВ кондер больше ставить.

Какие мысли и рекомендации дадите?

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

Зашкал - в смысле дальше не растёт?
У нас основное ограничение - количество импульсов в секунду, ибо массив байт. Делать его uint16_t не хочется по многим причинам, да я и не рассчитывал, что девайс будет эксплуатироваться при уровнях свыше 10мР/ч, у некоторых бытовых радиометров предел как раз такой. Можно, конечно, переключаться на меньшее время (к примеру, 0.1с вместо 1с) или при высоких уровнях использовать маленький массив uint16_t. Отпишитесь на мыло, обсудим.
Ардос стоило бы боком к источнику повернуть, так счётчики перекрываются. С одним счётчиком и скетчем под него пробовали?

Arezus, больше интересует соответствие показаний образцовым радиометрам, если будет такая возможность.
Кстати, по двум датчикам. Если в схему добавить сдвоенный выключатель - можно попробовать модифицировать скетч на переключение 1 - 2.

blokerun2
Offline
Зарегистрирован: 27.01.2019

Под картинкой ссылка на видео. Тестирую дозиметр бета источником.

https://drive.google.com/open?id=1jHf3Of63xt-yE_9U0rujg7YZRoz2YvwZ

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

Арезус, а что по импульсам преобразователя при фоне в 2мР? Думаю проблема там. Я мерял фон в 8мР при 350 импульсах где-то, фото есть в теме.

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

Скорее всего дело в типе источника. У нас время счёта 36-40 секунд, что соответствует калибровке по Радию 226 (с учётом небольшого ослабления корпусом). Для Цезия время счёта должно быть больше, 53 секунды плюс накидка на ослабление. (См. табличку, собранную SergejEU.) Получается разница приблизительно в 1,55 раза, 2,13*1,55~=3.3. Так что это ещё не зашкал. По идее абсолютный предел для АрДоса на данный момент 10мР/ч, но чудеса начнутся раньше, где-то с 7-8 (для двухдатчикового вдвое раньше). Причём с этой отметки и далее показания начнут занижаться, что не есть гуд. Есть пара задумок, как сделать предупреждение о зашкале, не забыть бы, когда дойдут руки поковырять скетч...

Сусемьбек
Offline
Зарегистрирован: 08.02.2019

tekagi пишет:

Есть пара задумок, как сделать предупреждение о зашкале, не забыть бы, когда дойдут руки поковырять скетч...

таки можно поинтересоваться? что происходит на приемном от датчика пине в случае зашкала? постоянный 0? если так, то есть детское предложение. завести отдельный индикаторный светодиод показывающий состояние входа с датчика. если 0 то горит, 1 не горит. при нормальной работе его вспышек практически не будет видно, но при зашкале будет гореть постоянно. Ну или программно если входной пин в 0 и состояние не менялось то пишем на экранчиге что пора делать ноги

Muxi
Онлайн
Зарегистрирован: 22.01.2019

tekagi пишет:
(для двухдатчикового вдвое раньше).
как я понимаю только в том случае если датчики в параллель стоят?

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

Сусемьбек, здесь следует различать зашкал датчика (непрекращающийся тлеющий разряд) и зашкал счётной части. СБМ-20 теоретически, ЕМНИП, способен считать до 144мР/ч, но в нашем случае проблема в счётной части, в используемых восьмибитных переменных. То есть невозможности при такой обработке корректно воспринять более 254 импульсов в секунду.

Лучше проверять не логический уровень, а поставить RC цепочку и завести на АЦП, как сделано в Припяти. И свыше определённого порога переключаться со счёта импульсов на данные АЦП. Была и такая мысль, но для этого нужны компоненты со стабильными параметрами.

Muxi, без разницы, даже если на разных прерываниях. Разве что каждому входному пину назначить свою переменную, тогда будет как в однодатчиковой версии.

blokerun2
Offline
Зарегистрирован: 27.01.2019

Для увеличения выходного ВВ напряжения, первичную обмотку нужно ведь уменьшать, я так понял? Если у меня 3,5 витка , то нужно делать, например, 2,5 ?

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

Для увеличения выходного при правильно собранном преобразователе достаточно изменить дефайн adc_value. При текущей конфигурации преобразователь способен выдавать вольт 600. Если не тянет - искать ошибки в монтаже или неправильно подобранные компоненты.

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

Привет всем кто в теме и тем кто мимо проходил.

Отдельный респект комраду tekagi !

В ветке уже более 2500 постов и все по делу!

Все от людей которым интересно!

Уважаемый tekagi  если есть предложения по обновлению странички проекта на сайте, новые картинки готовых приборов, возможно более свежие и продуманные прошивки, печатные планы и схемы. Шли все с пожеланиями, нет лучше с строгими указаниями мне на почту. Я все обязательно выложу, чтоб у новичков тех кто придет с ютюба было меньше вопросов на форуме, а только предложения и спасибки!

Всем успехов в ваших проектах ваш bodriy2014

Сайт  по дозиметру ArDOs

 

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

Фигассе, с возвращением)) А продолжить проект не желаешь? А то мне всё ж знаний не хватает :)
Про инфу на страничке подумаю, до сего момента старался оптимизировать под уже имеющееся наполнение, с наскока не соберу. Глянь пост #26, может сам чегой выберешь.

ivancheg8
Offline
Зарегистрирован: 20.02.2017

я в шоке, батя в доме!

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

tekagi пишет:
... А продолжить проект не желаешь?..... Глянь пост #26, может сам чегой выберешь....

--- Править код уже не стану, с учетом наработанного опыта, я бы теперь все написал по другому. Те два Ардоса что у меня есть работают исправно, всем доволен, в своих приборах точно ничего менять не собираюсь.

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

 

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

bodriy2014 пишет:
...с учетом наработанного опыта, я бы теперь все написал по другому...
Дык это... Может v2 зафигачить? ) Или интерес к дозиметрии иссяк?

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

1.08.1

/* ArDOs   v1.08.1
***Дозиметр на Ардуино
***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 60 //контрастность дисплея
//#define buzzer_active //если используется активный бузер (со встроенным генератором), управляемый транзистором с выхода 6, то раскомментировать эту строчку, если пассивный (с усилителем или без) - оставить закомментированой.
//#define UNO_DIP // если используется ArduinoUNO или плата на голой атмеге328 в корпусе DIP - раскомментируйте данную строчку. Это переключит чтение напряжения с делителя с ноги A6 на ногу A5.
#define first_alarm_duration 7000 //длительность сигнала тревоги при превышении первого аварийного порога в миллисекундах
byte treviga_1 = 30; //первая ступень тревоги
byte treviga_2 = 60; //вторая ступень тревоги
byte del_BUZZ = 7;//длительность одиночного сигнала
#define  ADC_value 163  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255). Для значений делителя с сайта srukami 163. alexadresat 185. (Тестовая версия tekagi  67)
#define k_delitel 576 //коефициент делителя напряжения, зависит от вашего делителя. Для значений делителя с сайта 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 20 //как часто сохранять накопленную дозу например каждые 20мкР
#define geiger_counter_seconds 36 // число секунд для замера, соответствующее характеристикам счётчика. Для СБМ-20 равно 40.
byte beta_time = 5; //время замера бета излучения
//настройки //////////////конец
//служебные переменные
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_rag[], logo_tr[], beta_prev_1[], beta_prev_2[];
volatile int shet = 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++;
					}
				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--;
					}
				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;
	}
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 ((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, 24); myGLCD.print(utf8rus("мкР"), RIGHT, 24);
			}
		else
			{
				myGLCD.printNumF(doz_v, 1, 34, 24); myGLCD.print(utf8rus("мкР"), RIGHT, 24);
			}    
	}
if (doz_v >= 1000) 
	{
		myGLCD.printNumF(doz_v / 1000.0, 2, 41, 24); myGLCD.print(utf8rus("мР"), RIGHT, 24);
	}
myGLCD.drawLine(0, 32, 83, 32);//верхняя
battery();
if (graph_type == 0)
	{
	for (uint8_t i = 0; i < 82; i ++)  //печатаем график
		{
			uint8_t max_pixel = map(mass_p[i], 0, GRAPH_max, 0, 15);
			myGLCD.drawLine(i + 1, 47, i + 1, 47 - max_pixel);
		}
	}
else if (graph_type == 1)
	{
	for (int i = 0; i < 82; i ++)  //печатаем график
	  {
		if (mass_p[i] > 0) 
			{
				if (mass_p[i] <= 15) 
					{
						myGLCD.drawLine(i + 1, 47, i + 1, 47 - mass_p[i]);
					}
				if (mass_p[i] > 15) 
					{
						myGLCD.drawLine(i + 1, 47, i + 1, 47 - 15);
					}
			}
		}
	}
myGLCD.update();
}
//-------------------------------------------------------------------------------------------------------
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("ПОРОГ 2"), 5, 6); myGLCD.printNumI(treviga_2, 55, 6); myGLCD.print("\xBC\xBD\xBE\xBF", RIGHT, 6);
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);
				/*
				myGLCD.print(utf8rus("РЕЖИМ РАЗНОСТНОГО"), CENTER, 0);
				myGLCD.print(utf8rus("ЗАМЕРА"), CENTER, 8); 
				myGLCD.drawLine(0, 16, 83, 16); 
				myGLCD.print(utf8rus("УСТАНОВИТЕ ПРИБОР"), CENTER, 20); 
				myGLCD.print(utf8rus("НА ПУСТУЮ КЮВЕТУ И"), CENTER, 28); 		
				*/
		
			}
		else if (bet_z == 1)
			{
				myGLCD.drawBitmap(0, 0, beta_prev_2, 84, 48);	
				/*
				myGLCD.print(utf8rus("ЗАМЕР ОБРАЗЦА"), CENTER, 0); 
				myGLCD.drawLine(0, 8, 83, 8); 		
				myGLCD.print(utf8rus("ЗАПОЛНИТЕ КЮВЕТУ"), CENTER, 12);
				myGLCD.print(utf8rus("ИЗМЕРЯЕМЫМ ВЕЩЕСТВОМ"), CENTER, 20);  
				myGLCD.print(utf8rus("УСТАНОВИТЕ ПРИБОР И"), CENTER, 28);
				*/	
			}

//  myGLCD.setFont(SmallFontRus);
//  myGLCD.print(utf8rus("Замер "), 20, 10); myGLCD.printNumI(bet_z, 55, 10);
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) 
			{
				otsup = 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.print("\xBC"":""\xB9", 23 + otsup, 0);
		}
    myGLCD.drawLine(0, 8, 83, 8);
    myGLCD.setFont(SmallFontRus);
    myGLCD.drawLine(40, 8, 40, 28);
    myGLCD.print(utf8rus("Замер0"), LEFT, 10); myGLCD.print(utf8rus("Замер1"), RIGHT, 10);
    myGLCD.printNumI(bet_z0, LEFT, 20); myGLCD.printNumI(bet_z1, RIGHT, 20);
    myGLCD.drawLine(0, 28, 83, 28);
    if (bet_z < 2) 
		{
			myGLCD.print(utf8rus("Идёт замер"), CENTER, 30); myGLCD.printNumI(bet_z, RIGHT, 30);
			myGLCD.printNumI(bet_r, CENTER, 38);
		}
    if (bet_z == 2) 
		{
			myGLCD.print(utf8rus("Результат"), CENTER, 30);
			myGLCD.printNumI(bet_r, CENTER, 38); myGLCD.print(utf8rus("мкР/ч"), RIGHT, 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,70); //генерим писк 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,70); //генерим писк 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 < 83; 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 < 83; 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++;
}
//-------------------------------------------------------------------------------------------------
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();
	}
myGLCD.drawBitmap(59, 0, logo_bat, 24, 8);
myGLCD.setFont(TinyFontRus);
myGLCD.printNumF(VCC, 2, 65, 1);
}
//----------------------------------------------------------------------------------------------------
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, 26);
			if(MONTH>99)
				{
					myGLCD.print("M", 13, 26);
				}
			else if (MONTH>9)
				{
					myGLCD.print("M", 9, 26);
				}
			else
				{
					myGLCD.print("M", 5, 26);
				}
		myGLCD.printNumI(DAY, 18, 26);
		if (DAY > 9) 
			{
				myGLCD.print("\xBB", 26, 26);
			}
		else
			{
				myGLCD.print("\xBB", 23, 26);
			}	
		}
	else if (DAY) // если нет месяцев, но есть дни
		{
			myGLCD.printNumI(DAY, 0, 26);
			if (DAY > 9) 
				{
					myGLCD.print("\xBB", 9, 26);
				}
			else
				{
					myGLCD.print("\xBB", 5, 26);
				}
			myGLCD.printNumI(HOUR, 18, 26);
			if (HOUR > 9) 
				{
					myGLCD.print("\xBA", 26, 26);
				}
			else 
				{
					myGLCD.print("\xBA", 23, 26);
				}
		}
	else // если нет дней
		{
			myGLCD.printNumI(HOUR, 0, 26);
			if (HOUR > 9) 
				{
					myGLCD.print("\xBA", 9, 26);
				}
			else
				{
					myGLCD.print("\xBA", 5, 26);
				}
			myGLCD.printNumI(MIN, 18, 26);
			if (MIN > 9) 
				{
					myGLCD.print("\xBC", 26, 26);
				}
			else
				{
					myGLCD.print("\xBC", 23, 26);
				}
		}		

}
//--------------------------------------------------------------------------------------------------------
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;}
}

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




/*

ChangeLog by tekagi:

1.08.1		24.03.2019
  -пара мелких багфиксов (обнуление переменной в строке 901 и коррекция обратного преобразования среднего фона в дозу с учётом 3600 секунд в 933)
  -изменена версия в заставке

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

1.07.9		01.01.2019
  -переписан график (ранее график отобржал увеличение кол-ва импульсов над предыдущим временным интервалом, сейчас показывает усреднённое значение за выбранный интервал, масштабируя по максимальному значению за весь отображаемый на экране период)

1.07.8
  -добавлено управление вибросигналом из меню

1.07.7         19.06.2018
  -фикс учёта времени (переведено с миллис на таймер1, код взят из примера, выложенного dimax)
  -сигнал тревоги сделан прерывистым

1.07.6		  15.06.2018
  -начато добавление вибро

1.07.5        10.06.2018
  -мелкие изменения в графике: подкорректированы значки батарейки и аварийного сигнала (в батарейке значение напряжения было сдвинуто на пару пикселов, а колокольчик аварии перекрывался цифрами при повышении фона свыше 100мкР/ч);

1.07.4		  15.05.2018
  -исправлена лишняя секунда в режиме бета замера и немного изменена обработка тревоги первого уровня;

1.07.3		  28.04.2018
  -изменено содержание экранов между бета замерами. В промежуточной 1.07.2 сделал на стандартных функциях вывода библиотеки экрана, на двух экранах съело 12% оперативки. Пришлось переписать в виде картинки, попутно убрав вывод текста с начальной заставки и внеся его в картинку заставки.

1.07.1        25.04.2018
  -добавлен мелкий шрифт, русифицированы меню;

1.07          16.04.2018
  -начато добавление русского языка в интерфейсе. Спасибо kaktuc за русский шрифт к библиотеке и arduinec за функцию перекодирования выводимого на дисплей текста;
  -заменён дефайн "ADC" на "ADC_value", в новых версиях ArduinoIDE из-за этого возникала ошибка компилляции;

1.064         15.04.2018
  -добавлена возможность использования ArduinoUNO или голого камня atmega328p в DIP корпусе. Для переключения раскомментировать #define UNO в начале скетча, это переключит чтение высокого напряжения с делителя с пина A6 на A5;
  -добавлено переключение состояния подсветки при удержании ">>"
  
1.063.7       15.04.2018
  -попытка переписать обработку клавиш (вынесено в отдельную функцию);
  -выключен выход в системное меню из функций длительного и разностного замеров (оставлен только из основного режима "поиск");

1.063.6       25.03.2018
  -пофиксены кракозяблы при выводе "ANALIZ" в начале длительного замера;

1.063.5       14.01.18
  -пофиксена некорректная запись в еепром времени учёта дозы (писалось только 2 байта из четырёх);
  -добавлено преобразование микрорентген/час в миллирентгены/час в режиме поиска и длительного замера при фоне свыше 1000;

  
1.063.4       13.01.18
  -добавлена возможность включать индикацию светодиодом и бузером независимо друг от друга;

  
1.063.3 и ниже    12.11.2017
  -добавлена возможность выбрать активный или пассивный бузер;
  -пофиксен учёт фона во время нахождения в меню (при выходе из меню был скачок фона, поскольку в функции меню не было вызова poisk_f();   arduino.ru/forum/proekty/delaem-dozimetr?page=17#comment-320398   );
  -добавил режим непрерывной аварийной сигнализации при превышении первого порога, длительность сигнала настраивается в дефайне;
  -пофиксен серьёзный баг в режиме разностного замера (счёт импульсов начинался не с нажатия кнопки "ОК" при запуске второго цикла измерения, а сразу после окончания первого измерения, в результате разностный результат сильно завышался);
  -пофиксен паразитный сигнал при значении "shet = 0;"   arduino.ru/forum/proekty/delaem-dozimetr?page=16#comment-318736  ;

  P.S. Спасибо ImaSoft за подсказки и готовые кусочки кода.
  
*/

gif.c

// файл 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[] =
{ 0x00, 0x00, 0x1C, 0x7F, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x7F};
  
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 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, // Я
};

Добавил пару мелких багфиксов (см. чейнджлог).

Samodelkin_YouTube
Offline
Зарегистрирован: 16.12.2018

Решил сделать компактный дозиметр на СБМ20. Купил 5 шт. Подключил, но сигнал какой-то странный, вместо одного щелчком Ардуино видит много импульсов. Пробовал подключать пэзо, сигналы четкие. На всех 5 датчиках такая реакция. На датчиках СИ22Г все ОК. В чем может быть проблема?

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

Смотрите сигнал осликом после формирователя, проверяйте соответствие 400В. Можно попробовать чуть увеличить ёмкость помехоподавительного конденсатора.

Samodelkin_YouTube
Offline
Зарегистрирован: 16.12.2018

Конденсатор поставил на 1 нФ

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

В первую очередь соответствие напряжения. Такой эффект не редкость при завышенном. Можно попробовать снизить до 370-380, уменьшив adc_value. Далее - осциллограмма. Могут и помехи просачиваться, если сам счётчик или цепи детектирования проходят вблизи узла накачки или плохо отделены от него по питанию.
Номинал анодного резистора не занижен? Полярность счётчика соблюдена?

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

1.08.2 Тестовое добавление индикации переполнения переменной счёта.

/* 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 60 //контрастность дисплея
//#define buzzer_active //если используется активный бузер (со встроенным генератором), управляемый транзистором с выхода 6, то раскомментировать эту строчку, если пассивный (с усилителем или без) - оставить закомментированой.
//#define UNO_DIP // если используется ArduinoUNO или плата на голой атмеге328 в корпусе DIP - раскомментируйте данную строчку. Это переключит чтение напряжения с делителя с ноги A6 на ногу A5.
#define first_alarm_duration 7000 //длительность сигнала тревоги при превышении первого аварийного порога в миллисекундах
byte treviga_1 = 30; //первая ступень тревоги
byte treviga_2 = 60; //вторая ступень тревоги
byte del_BUZZ = 7;//длительность одиночного сигнала
#define  ADC_value 163  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255). Для значений делителя с сайта srukami 163. alexadresat 185. (Тестовая версия tekagi  67)
#define k_delitel 576 //коефициент делителя напряжения, зависит от вашего делителя. Для значений делителя с сайта 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 20 //как часто сохранять накопленную дозу например каждые 20мкР
#define geiger_counter_seconds 36 // число секунд для замера, соответствующее характеристикам счётчика. Для СБМ-20 равно 40.
byte beta_time = 5; //время замера бета излучения
//настройки //////////////конец
//служебные переменные
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_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++;
					}
				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--;
					}
				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;
	}
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, 24); myGLCD.print(utf8rus("мкР"), RIGHT, 24);
			}
		else
			{
				myGLCD.printNumF(doz_v, 1, 34, 24); myGLCD.print(utf8rus("мкР"), RIGHT, 24);
			}    
	}
if (doz_v >= 1000) 
	{
		myGLCD.printNumF(doz_v / 1000.0, 2, 41, 24); myGLCD.print(utf8rus("мР"), RIGHT, 24);
	}
myGLCD.drawLine(0, 32, 83, 32);//верхняя
battery();
if (graph_type == 0)
	{
	for (uint8_t i = 0; i < 82; i ++)  //печатаем график
		{
			uint8_t max_pixel = map(mass_p[i], 0, GRAPH_max, 0, 15);
			myGLCD.drawLine(i + 1, 47, i + 1, 47 - max_pixel);
		}
	}
else if (graph_type == 1)
	{
	for (int i = 0; i < 82; i ++)  //печатаем график
	  {
		if (mass_p[i] > 0) 
			{
				if (mass_p[i] <= 15) 
					{
						myGLCD.drawLine(i + 1, 47, i + 1, 47 - mass_p[i]);
					}
				if (mass_p[i] > 15) 
					{
						myGLCD.drawLine(i + 1, 47, i + 1, 47 - 15);
					}
			}
		}
	}
myGLCD.update();
}
//-------------------------------------------------------------------------------------------------------
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("ПОРОГ 2"), 5, 6); myGLCD.printNumI(treviga_2, 55, 6); myGLCD.print("\xBC\xBD\xBE\xBF", RIGHT, 6);
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);
				/*
				myGLCD.print(utf8rus("РЕЖИМ РАЗНОСТНОГО"), CENTER, 0);
				myGLCD.print(utf8rus("ЗАМЕРА"), CENTER, 8); 
				myGLCD.drawLine(0, 16, 83, 16); 
				myGLCD.print(utf8rus("УСТАНОВИТЕ ПРИБОР"), CENTER, 20); 
				myGLCD.print(utf8rus("НА ПУСТУЮ КЮВЕТУ И"), CENTER, 28); 		
				*/
		
			}
		else if (bet_z == 1)
			{
				myGLCD.drawBitmap(0, 0, beta_prev_2, 84, 48);	
				/*
				myGLCD.print(utf8rus("ЗАМЕР ОБРАЗЦА"), CENTER, 0); 
				myGLCD.drawLine(0, 8, 83, 8); 		
				myGLCD.print(utf8rus("ЗАПОЛНИТЕ КЮВЕТУ"), CENTER, 12);
				myGLCD.print(utf8rus("ИЗМЕРЯЕМЫМ ВЕЩЕСТВОМ"), CENTER, 20);  
				myGLCD.print(utf8rus("УСТАНОВИТЕ ПРИБОР И"), CENTER, 28);
				*/	
			}

//  myGLCD.setFont(SmallFontRus);
//  myGLCD.print(utf8rus("Замер "), 20, 10); myGLCD.printNumI(bet_z, 55, 10);
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) 
			{
				otsup = 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.print("\xBC"":""\xB9", 23 + otsup, 0);
		}
    myGLCD.drawLine(0, 8, 83, 8);
    myGLCD.setFont(SmallFontRus);
    myGLCD.drawLine(40, 8, 40, 28);
    myGLCD.print(utf8rus("Замер0"), LEFT, 10); myGLCD.print(utf8rus("Замер1"), RIGHT, 10);
    myGLCD.printNumI(bet_z0, LEFT, 20); myGLCD.printNumI(bet_z1, RIGHT, 20);
    myGLCD.drawLine(0, 28, 83, 28);
    if (bet_z < 2) 
		{
			myGLCD.print(utf8rus("Идёт замер"), CENTER, 30); myGLCD.printNumI(bet_z, RIGHT, 30);
			myGLCD.printNumI(bet_r, CENTER, 38);
		}
    if (bet_z == 2) 
		{
			myGLCD.print(utf8rus("Результат"), CENTER, 30);
			myGLCD.printNumI(bet_r, CENTER, 38); myGLCD.print(utf8rus("мкР/ч"), RIGHT, 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,70); //генерим писк 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,70); //генерим писк 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 < 83; 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 < 83; 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();
	}
myGLCD.drawBitmap(59, 0, logo_bat, 24, 8);
myGLCD.setFont(TinyFontRus);
myGLCD.printNumF(VCC, 2, 65, 1);
}
//----------------------------------------------------------------------------------------------------
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, 26);
			if(MONTH>99)
				{
					myGLCD.print("M", 13, 26);
				}
			else if (MONTH>9)
				{
					myGLCD.print("M", 9, 26);
				}
			else
				{
					myGLCD.print("M", 5, 26);
				}
		myGLCD.printNumI(DAY, 18, 26);
		if (DAY > 9) 
			{
				myGLCD.print("\xBB", 26, 26);
			}
		else
			{
				myGLCD.print("\xBB", 23, 26);
			}	
		}
	else if (DAY) // если нет месяцев, но есть дни
		{
			myGLCD.printNumI(DAY, 0, 26);
			if (DAY > 9) 
				{
					myGLCD.print("\xBB", 9, 26);
				}
			else
				{
					myGLCD.print("\xBB", 5, 26);
				}
			myGLCD.printNumI(HOUR, 18, 26);
			if (HOUR > 9) 
				{
					myGLCD.print("\xBA", 26, 26);
				}
			else 
				{
					myGLCD.print("\xBA", 23, 26);
				}
		}
	else // если нет дней
		{
			myGLCD.printNumI(HOUR, 0, 26);
			if (HOUR > 9) 
				{
					myGLCD.print("\xBA", 9, 26);
				}
			else
				{
					myGLCD.print("\xBA", 5, 26);
				}
			myGLCD.printNumI(MIN, 18, 26);
			if (MIN > 9) 
				{
					myGLCD.print("\xBC", 26, 26);
				}
			else
				{
					myGLCD.print("\xBC", 23, 26);
				}
		}		

}
//--------------------------------------------------------------------------------------------------------
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;}
}

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




/*

ChangeLog by tekagi:

1.08.2		25.03.2019
  -добавлена индикация переполнения счётной переменной

1.08.1		24.03.2019
  -пара мелких багфиксов (обнуление переменной в строке 901 и коррекция обратного преобразования среднего фона в дозу с учётом 3600 секунд в 933)
  -изменена версия в заставке

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

1.07.9		01.01.2019
  -переписан график (ранее график отобржал увеличение кол-ва импульсов над предыдущим временным интервалом, сейчас показывает усреднённое значение за выбранный интервал, масштабируя по максимальному значению за весь отображаемый на экране период)

1.07.8
  -добавлено управление вибросигналом из меню

1.07.7         19.06.2018
  -фикс учёта времени (переведено с миллис на таймер1, код взят из примера, выложенного dimax)
  -сигнал тревоги сделан прерывистым

1.07.6		  15.06.2018
  -начато добавление вибро

1.07.5        10.06.2018
  -мелкие изменения в графике: подкорректированы значки батарейки и аварийного сигнала (в батарейке значение напряжения было сдвинуто на пару пикселов, а колокольчик аварии перекрывался цифрами при повышении фона свыше 100мкР/ч);

1.07.4		  15.05.2018
  -исправлена лишняя секунда в режиме бета замера и немного изменена обработка тревоги первого уровня;

1.07.3		  28.04.2018
  -изменено содержание экранов между бета замерами. В промежуточной 1.07.2 сделал на стандартных функциях вывода библиотеки экрана, на двух экранах съело 12% оперативки. Пришлось переписать в виде картинки, попутно убрав вывод текста с начальной заставки и внеся его в картинку заставки.

1.07.1        25.04.2018
  -добавлен мелкий шрифт, русифицированы меню;

1.07          16.04.2018
  -начато добавление русского языка в интерфейсе. Спасибо kaktuc за русский шрифт к библиотеке и arduinec за функцию перекодирования выводимого на дисплей текста;
  -заменён дефайн "ADC" на "ADC_value", в новых версиях ArduinoIDE из-за этого возникала ошибка компилляции;

1.064         15.04.2018
  -добавлена возможность использования ArduinoUNO или голого камня atmega328p в DIP корпусе. Для переключения раскомментировать #define UNO в начале скетча, это переключит чтение высокого напряжения с делителя с пина A6 на A5;
  -добавлено переключение состояния подсветки при удержании ">>"
  
1.063.7       15.04.2018
  -попытка переписать обработку клавиш (вынесено в отдельную функцию);
  -выключен выход в системное меню из функций длительного и разностного замеров (оставлен только из основного режима "поиск");

1.063.6       25.03.2018
  -пофиксены кракозяблы при выводе "ANALIZ" в начале длительного замера;

1.063.5       14.01.18
  -пофиксена некорректная запись в еепром времени учёта дозы (писалось только 2 байта из четырёх);
  -добавлено преобразование микрорентген/час в миллирентгены/час в режиме поиска и длительного замера при фоне свыше 1000;

  
1.063.4       13.01.18
  -добавлена возможность включать индикацию светодиодом и бузером независимо друг от друга;

  
1.063.3 и ниже    12.11.2017
  -добавлена возможность выбрать активный или пассивный бузер;
  -пофиксен учёт фона во время нахождения в меню (при выходе из меню был скачок фона, поскольку в функции меню не было вызова poisk_f();   arduino.ru/forum/proekty/delaem-dozimetr?page=17#comment-320398   );
  -добавил режим непрерывной аварийной сигнализации при превышении первого порога, длительность сигнала настраивается в дефайне;
  -пофиксен серьёзный баг в режиме разностного замера (счёт импульсов начинался не с нажатия кнопки "ОК" при запуске второго цикла измерения, а сразу после окончания первого измерения, в результате разностный результат сильно завышался);
  -пофиксен паразитный сигнал при значении "shet = 0;"   arduino.ru/forum/proekty/delaem-dozimetr?page=16#comment-318736  ;

  P.S. Спасибо ImaSoft за подсказки и готовые кусочки кода.
  
*/

gif.c

// файл 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[] =
{ 0x00, 0x00, 0x1C, 0x7F, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x7F};
  
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, // Я
};

Надеюсь, никто не будет иметь дела с такой какой, чтобы её увидеть. ))

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

Надо будет в подвале Юпитера затестить)

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

А заодно получить титул "Ваша светлость"? )

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

Уже получил. Чёрная терра там более 900мЗв намеряла минуты за полторы и я убрался оттуда. Каков примерно предел- 10 мР?

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

Показаний, которым можно доверять, даже меньше, порядка 7-8. В раздумьях, как бы поднять это значение, не ухудшив быстродействие и чувствительность на малых уровнях.

Muxi
Онлайн
Зарегистрирован: 22.01.2019

tekagi, а почему опять перешли к 36 секундам? надо ли на двух датчиках переходить к 18 вместо 20?

define geiger_counter_seconds 36

 

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

По желанию. Для моего экземпляра 40 многовато. Есть стойкое впечатление, что показания завышены, но то ли у меня стены слегка фонят, то ли датчик такую характеристику имеет.

kkk51
Offline
Зарегистрирован: 05.03.2019

Здравствуйте.сегодня захожу в настройки дозиметра(потому что пропал счет,хотел посмотреть напряжение на счетчике)и увидел напряжение 630в и 4 импульса.после этого несколько раз перезагружаю его и напряжение выранилось и через какое-то времы сгорает(горит только светодиод питания) ардуино.из-за чего такое произашло???

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

Скорее всего монтаж... Может влага попала, или плохо вымыты остатки активного флюса. Может и по питанию проблемы, дистанционно диагноз никто не скажет.

kkk51
Offline
Зарегистрирован: 05.03.2019

а для счетчика это опасно???флюс исключительно канифоль

 

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

Если напряжение действительно завышено - да. Если анодный балластник не занижее и не пробит - то вряд ли сгорит.

Medvedik
Medvedik аватар
Offline
Зарегистрирован: 09.07.2017

И снова здравствуйте)

Нашол на EasyEDA печатку ArDOS`a - https://easyeda.com/Sergoiy/ARDOs_dosimetr-12b9dde5699542108fffed423843d237

Кто-то собирал по такой плате?)

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

В теме данный пользователь не появлялся. Под неё и код дорабатываться должен, там железа поболе, чем в оригинале. Это, кстати, не единственная печатка в easyeda, я ещё находил, несколько страниц назад линки постил. Плюс ещё один линк в #26.

f_max
Offline
Зарегистрирован: 29.03.2019

Привет. Полностью повторяем первую схему с сайта http://srukami.inf.ua/ardos.html. Нам необходимо, помимо вывода инфы на дисплей, вовдоить дозу, измеренную каждые 30 секунд в com-порт. Как модернизировать код со второй ссылки (режим поиск + режим замер) для реализации данной задачи? Заранее спасибо.

f_max
Offline
Зарегистрирован: 29.03.2019

Привет. Полностью повторяем первую схему с сайта http://srukami.inf.ua/ardos.html. Нам необходимо, помимо вывода инфы на дисплей, вовдоить дозу, измеренную каждые 30 секунд в com-порт. Как модернизировать код со второй ссылки (режим поиск + режим замер) для реализации данной задачи? Заранее спасибо.

f_max
Offline
Зарегистрирован: 29.03.2019

Привет. Полностью повторяем первую схему с сайта http://srukami.inf.ua/ardos.html. Нам необходимо, помимо вывода инфы на дисплей, вовдоить дозу, измеренную каждые 30 секунд в com-порт. Как модернизировать код со второй ссылки (режим поиск + режим замер) для реализации данной задачи? Заранее спасибо.

f_max
Offline
Зарегистрирован: 29.03.2019

Привет. Полностью повторяем первую схему с сайта http://srukami.inf.ua/ardos.html. Нам необходимо, помимо вывода инфы на дисплей, вовдоить дозу, измеренную каждые 30 секунд в com-порт. Как модернизировать код со второй ссылки (режим поиск + режим замер) для реализации данной задачи? Заранее спасибо.

f_max
Offline
Зарегистрирован: 29.03.2019

Привет. Полностью повторяем первую схему с сайта http://srukami.inf.ua/ardos.html. Нам необходимо, помимо вывода инфы на дисплей, выводить дозу, измеренную каждые 30 секунд в com-порт. Как модернизировать код со второй ссылки (режим поиск + режим замер) для реализации данной задачи? Заранее спасибо.

f_max
Offline
Зарегистрирован: 29.03.2019

Привет. Полностью повторяем первую схему с сайта http://srukami.inf.ua/ardos.html. Нам необходимо, помимо вывода инфы на дисплей, выводить дозу, измеренную каждые 30 секунд в com-порт. Как модернизировать код со второй ссылки (режим поиск + режим замер) для реализации данной задачи? Заранее спасибо.

f_max
Offline
Зарегистрирован: 29.03.2019

Привет. Полностью повторяем первую схему с сайта http://srukami.inf.ua/ardos.html. Нам необходимо, помимо вывода инфы на дисплей, выводить дозу, измеренную каждые 30 секунд в com-порт. Как модернизировать код со второй ссылки (режим поиск + режим замер) для реализации данной задачи? Заранее спасибо.

f_max
Offline
Зарегистрирован: 29.03.2019

Привет. Полностью повторяем первую схему с сайта http://srukami.inf.ua/ardos.html. Нам необходимо, помимо вывода инфы на дисплей, выводить дозу, измеренную каждые 30 секунд в com-порт. Как модернизировать код со второй ссылки (режим поиск + режим замер) для реализации данной задачи? Заранее спасибо.

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

Встречный вопрос: зачем?

f_max
Offline
Зарегистрирован: 29.03.2019

Для построения графика фона на компьютере. В более широком формате - мы делаем модель каротажного зонда.

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

Код Ардоса для этого слишком избыточен. Есть немало проектов, считающих импульсы/фон и выводящих в порт. Если добавлять вывод в текущий код - высока вероятность нестабильной работы, оперативки уже не хватает, надо убирать работу с дисплеем и разностный режим. Для подобной задачи лучше что-то вроде http://srukami.inf.ua/doz_com.html , но там тоже надо и код, и схему дорабатывать. И второе - чувствительности СБМ-20 не маловато будет? ИМХО для таких целей лучше что-то вроде того же СИ22Г, а то и не одного.

Тот код устарел и содержит несколько ошибок, новые версии здесь. По схеме - смотрите пост #26 данной темы, там важные исправления.

Отпишитесь мне на мейл (есть в том же посте).

Evo333
Offline
Зарегистрирован: 20.02.2019

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