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

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

ImaSoft пишет:

п.с. Если не секрет, откуда данные про время?

http://forum.rhbz.org/topic.php?forum=80&topic=49&postid=1442631884#1442631884

Время счёта может варьироваться в небольших пределах (в зависимости от характеристик конкретного экземпляра датчика, толщины и материала корпуса дозиметра и/или компенсирующего экрана счётчика). Для того же СБМ-20 в разных конструкциях применяли от 34 до 42 секунд.

ImaSoft пишет:

Не кто не подскажет какой допустимый фон может быть от мрамора?

8мкРн/час это опасно или нет?

 

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

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

bodriy2014 пишет:

Surikat пишет:

можно сразу под два варианта ПП (dip и smd детали), уменя как раз дисплей Красный 5110

В архивах с скетчем лежат печатки, те что я использовал.

http://srukami.inf.ua/ardos.html

Спасибо!!!

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

tekagi пишет:

(если мерять гамму вместе с бетой).

Еще вопрос, пластик задерживает бето излучение?

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

Да. (Зависит от толщины). http://www.water.ru/bz/param/radiology-common_beta.php

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

Shodan
Offline
Зарегистрирован: 07.03.2017

Опыты показывают, что практически монопенесуально.

Мягкую бету от Ni-63 сбм-ка практически не чувствует. Там долампочки есть корпус, или его нет.

А жетская бета от Sr/Y-90 легко прошивает классический пластик 1-2мм. Конечно с ослабленем некоторым, но сделал вывод, что для стронция-иттрия ненадо окна резать, оно и так шъет неплохо.

Так-что если у вас-товарищи не слюда, не режте окон, всеравно плотность потока вам нечем измерять.

1707
Offline
Зарегистрирован: 08.02.2017

Доброй ночи. Посоветуйте про быстрый диод, ямогу вместо UF4007 поставить HER208?

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

[quote=1707]

Доброй ночи. Посоветуйте про быстрый диод, ямогу вместо UF4007 поставить HER208?

[/quote

Пойдут в полне...]

Joiner
Offline
Зарегистрирован: 04.09.2014

Почти ползком продвигаюсь к своей цели :), но иду своим путем. Отличие от авторского проекта - преобразователь на 400 вольт на mc34063, и в приборе будут установлены 2 счетчика. Почти собрал экспериментальную  установку, приделал плату защиты-зарядки литиевого аккумулятора, преобразователь, два счетчика и плату съема импульсов. Плату съема импульсов тоже слелал по-своему, без конденсаторов. Работает, вроде нормально. Выдает такой сигнал

Остается присабачить ардуинку с монитором и придумать как считать импульсы с двух счетчиков.

Joiner
Offline
Зарегистрирован: 04.09.2014

Запустил свой макет, присоединил ардуинку, пока без дисплея. Результат выводил через сериал. Счетчики ставил для испытаний парами (у меня два домика для счетчиков). Самих счетчиков 8 штук. Они находились в неисправных бытовых дозиметрах заводского производства, по 4 штуки в каждом. Пока разобрал один. Счетчики в них обмотаны свинцовой фольгой. 2 раздел, два оставил в фольге. Ставил по очереди пару раздетую (пронумеровал 1 и 2), затем пару одетую (3 и 4). Ставил их на подсчет импульсов за 30 минут. Вот результат:

Сч1   -   406 имп.

Сч2   -   461 имп.

Сч3   -   464 имп.

Сч4   -   469 имп.

Знатоки, какой можно сделать вывод?

Потом поэксперементирую еще, постараюсь узнать, зачем счетчики обмотали фольгой, и почему один из раздетых счетчиков выдал гораздо меньше импульсов?

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

Joiner пишет:

....Знатоки, какой можно сделать вывод?

....

Привет.

Поздравляю с первыми замерами.

Не знаток, но выскажусь.

---По данным замера фон ~ 10мкР/ч.

---Желательно датчики Сч1 и Сч2   поменять местами и повторить замер.

---На первый взгляд счетчик Сч1 стал немного слеповат от времени.

Joiner
Offline
Зарегистрирован: 04.09.2014

bodriy2014 пишет:

Привет.

Поздравляю с первыми замерами.

..........

Спасибо. По поводу поменять местами, приходила такая мысль. Но, вроде, условия в обоих местах одинаковые. Плюс (+) на оба счетчика подается с одного провода преобразователя, минусы счетчиков идут каждый на свой каскад съема импульса, т.е., каждый минус присоединен к своему резистору с которых снимается напряжение опять же с каждого своим каскадом на транзисторе. Эти абсолютно независимые сигналы с двух счетчиков запускают прерывания 0 и 1, которые вызывают функции подсчета импульсов на каждом из счетчиков. Завтра нарисую схемку и покажу фотку своей установки (если успею дисплейчик прикрутить).

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

Joiner пишет:

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

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

Joiner
Offline
Зарегистрирован: 04.09.2014

tekagi пишет:

Лучше в анод каждого счётчика поставить свой высокоомный резистор.........

Согласен. Спасибо за подсказку, тем более, что добавить один резистор нет ни какой проблемы. Завтра добавлю.

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

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

Joiner пишет:

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

Если на разных INT-0 и INT-1, то смогут, если обработчик прерывания выполняет сейчас какое то действие и в этот момент срабатывает прерывание скажем INT-1 то будет вставлен флажок прерывания и ано сработает когда закончит выполнятся программа прерывания INT-0...

Joiner
Offline
Зарегистрирован: 04.09.2014

ImaSoft пишет:

Если на разных INT-0 и INT-1, то смогут, если обработчик прерывания выполняет сейчас какое то действие и в этот момент срабатывает прерывание скажем INT-1 то будет вставлен флажок прерывания и ано сработает когда закончит выполнятся программа прерывания INT-0...

Спасибо. Это радует. Значит импульсы не потерям.

P.S. Снимаю импульсы по такой схеме. Их к ардуинке подключено две. Одна к пину2 (int0), вторая к пину 3(int1) 

Сначала попробовал по схеме bodriy2014_го. Осциллограф показал импульс на резисторе больше 10 вольт, т.е. на базу транзистора поступало более 10 вольт, и сигнал на выходе получался с большими помехами. Сделал делитель, чтобы уменьшить напряжение, поступающее на базу. После этого импульс стал чистеньким, без помех, как на осциллограме из #508. 

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

Joiner пишет:

.....

P.S. Снимаю импульсы по такой схеме. Их к ардуинке подключено две. Одна к пину2 (int0), вторая к пину 3(int1) 

Сначала попробовал по схеме bodriy2014_го. Осциллограф показал импульс на резисторе больше 10 вольт, т.е. на базу транзистора поступало более 10 вольт, и сигнал на выходе получался с большими помехами. Сделал делитель, чтобы уменьшить напряжение, поступающее на базу. После этого импульс стал чистеньким, без помех, как на осциллограме из #508. 

Что то я не заметил чем эта схема отличается от схемы Ардоса, номиналами?

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

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

Joiner
Offline
Зарегистрирован: 04.09.2014

bodriy2014 пишет:

 

Что то я не заметил чем эта схема отличается от схемы Ардоса, номиналами?

Ардос я взял за основу и продвигаюсь по теме, начиная с первого сообщения. Но пробую внести какие-то изменения, просто...как мне хочется попробовать. И некоторые отличия, все таки есть. У меня преобразователь работает без ардуинки, транзистор не кт315, а буржуйский 2N2222 :), и между базой и землей транзистора установлен резистор не 470 ком, а 3.3 ком, по моим подсчетам на нем импульс всего 0.12 вольта.

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

ssbon
Offline
Зарегистрирован: 17.02.2015

Добрый день! Прошу помощи у автора.

Вот уже вторую неделю пытаюсь оживить аналогичное устройство, но пока безрезультатно. Ардуинщик я начинающий, поэтому все дается не быстро. Собрано аналогичное устройство, целью которого будет измерение дозы, с выдачей результатов в COM порт. Из схемы исключены кнопки, индикатор, вибро и фонарик. Не поможете со скетчем? Мои попытки адаптировать Ваш скетч не привели к желаемому результату. Обкатываю на Arduino Nano V3.0 ATmega328 CH340. Не удалось даже запустить генератор 400V.

 

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

ssbon пишет:

Добрый день! Прошу помощи у автора.

Вот уже вторую неделю пытаюсь оживить аналогичное устройство, но пока безрезультатно. Ардуинщик я начинающий, поэтому все дается не быстро. Собрано аналогичное устройство, целью которого будет измерение дозы, с выдачей результатов в COM порт. Из схемы исключены кнопки, индикатор, вибро и фонарик. Не поможете со скетчем? Мои попытки адаптировать Ваш скетч не привели к желаемому результату. Обкатываю на Arduino Nano V3.0 ATmega328 CH340. Не удалось даже запустить генератор 400V.

Привет.

Зачем вы все убираете лишнее, это ненужная работа.

Вы просто в Сетап раскоментируйте строку

//Serial.begin(19200);

И дальше выводите нужный вам параметр в ком порт

Serial.println(fon);

Займет всего минуту времени такая переделка.

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

Joiner
Offline
Зарегистрирован: 04.09.2014

Вчера, наконец, собрал макет для дозиметра. Решил сначала на макете все отладить, а потом уже делать на печатке и в корпусе. Макет получился монстроидальный и под лозунгом - сделано через Ж... Но работает, надеюсь, что правильно. А почему через Ж..., потому что блоки устройства расположил по самому наихудшему варианту. Например, высоковольтный преобразователь расположил на противоположном от источника питания и счетчиков конце доски. Это надо же было так придумать! Вот оно

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

Вот результаты:

Счетчик №1 в гнезде 1  170, 135, 151, 136, 138,161   (среднее 148.5)

Счетчик №1 в гнезде2   155, 159, 141, 128, 145, 156   (среднее 147.3)

Счетчик №2 в гнезде1   132, 137, 138, 134, 157, 141   (среднее 139.8)

Счетчик №2 в гнезде2   122, 135, 141, 140, 145, 146   (среднее 138.2)

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

Подскажите, пожалуйста, у вас тоже результаты замеров количества импульсов за определенный промежуток так разнятся, или у меня что-то не так работает?

ssbon
Offline
Зарегистрирован: 17.02.2015

Я конечно же не удалял, а комментировал. Но при компиляции постоянно ругань.

ssbon
Offline
Зарегистрирован: 17.02.2015

Спасибо! Удалось скомпилировать. Достаю бубен.

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

Joiner пишет:

.....

Вот результаты:

Счетчик №1 в гнезде 1  170, 135, 151, 136, 138,161   (среднее 148.5)

Счетчик №1 в гнезде2   155, 159, 141, 128, 145, 156   (среднее 147.3)

Счетчик №2 в гнезде1   132, 137, 138, 134, 157, 141   (среднее 139.8)

Счетчик №2 в гнезде2   122, 135, 141, 140, 145, 146   (среднее 138.2)

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

Подскажите, пожалуйста, у вас тоже результаты замеров количества импульсов за определенный промежуток так разнятся, или у меня что-то не так работает?

А что вас беспокоит, все в пределах погрешности.

--- ЕРФ постоянно меняется и притом не равномерно в небольших пределах.

--- газоразрядные счетчики имеют с завода погрешность не меньше 20%

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

Joiner
Offline
Зарегистрирован: 04.09.2014

bodriy2014 пишет:

А что .............

Спасибо. Я просто не ожидал такого разброса. Ну ладно.....придется как-то с этим жить :)

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

Joiner
Offline
Зарегистрирован: 04.09.2014

Сегодня поизмерял фон в своей квартире. Так как нормального скетча еще не написал, измерял по количеству импульсов за 10 минут, с последующим ручным переводом в микрорентгены/час. По всей квартире фон составил примерно 10-12 мкр/ч, а в ванной комнате аж 20 мкр/ч !!! Видимо плитка немного фонит. Как понимаю 20 мкр/ч это верхний предел безопасного фона.

diana221323
Offline
Зарегистрирован: 20.10.2016

Собрал я Ардос на смд элементах- версия 1.04 –заработала сразу без настройки.

Спасибо автору.

Только с печаткой намучался. Сразу не разбирался и плату из архива распечатал  и Ардуинку на 8Мгц, 3,3в пришлось прилепить вверх ногами, вернее вниз элементами, и транзисторы пришлось поставить вверх ногами, а так все замечательно, но это мелочи.  Делитель получился 120МОм/200Ком=600.

 

Прошу помощи.

 

1)Использую синий дисплей 5110 вместо красного.

 Работает нормально, только не знаю что можно изменить в скетче чтоб при засыпании не включалась подсветка.

2) И еще столкнулся с проблемкой: вот идешь случайно мимо возле источника излучения Ардос в кармане лежит выходит из режима сна и там тихонечко начинает попискивать и нифига не слышно. Что можно изменить в скетче чтоб этот бузер (или лучше еще один громкий бузер добавить)при срабатывании тревоги действительно громко запищал какую нибудь громкую мелодию хотя бы секунд 30 чтоб успеть среагировать на угрозу,

3)и еще хочется вибромоторчик куда нибудь подцепить вместо фонарика чтоб при тревоге  в очень шумных местах понять что ты начал облучаться.

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

diana221323 пишет:

1)Использую синий дисплей 5110 вместо красного.

 Работает нормально, только не знаю что можно изменить в скетче чтоб при засыпании не включалась подсветка.

Попробуйте заменить код :

    if (podsvetka == 1) {
      PORTC &= ~(1 << 2); //A2 дисплей Light
    }
    if (podsvetka == 0) {
      PORTC |= (1 << 2); //A2 дисплей Light
    }
    if (son_OK == 1) {//отсчет сна
      if (millis() - son_milis >= 1000) {
        son_milis = millis();
        time_son--;
        if (tr == 0 && time_son <= 0) {
          time_son = son_t;
          PORTB &= ~(1 << 1);//пин фонаря
          PORTC  |= (1 << 2); //A2 дисплей Light

на следующий:

    if (podsvetka == 1) {
      PORTC |= (1 << 2); //A2 дисплей Light
    }
    if (podsvetka == 0) {
      PORTC &= ~(1 << 2); //A2 дисплей Light
    }
    if (son_OK == 1) {//отсчет сна
      if (millis() - son_milis >= 1000) {
        son_milis = millis();
        time_son--;
        if (tr == 0 && time_son <= 0) {
          time_son = son_t;
          PORTB &= ~(1 << 1);//пин фонаря
          PORTC &= ~(1 << 2); //A2 дисплей Light

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

diana221323 пишет:

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

Тоже столкнулся с подобной проблемой. Пока склоняюсь к мысли поставить полевик (по такой же схеме, как на фонарик) и пятивольтовый бузер со встроенным генератором, и в функции void signa () поменять ногодрыг на более медленный, и без цикла while.

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

diana221323, тестовый скетч с сигналом тревоги и инверсией подсветки (для синего модуля дисплея 5110) на базе авторского 1.4.3:

/* ArDOs   v1.04
***Дозиметр на Ардуино
***IDE Arduino 1.8.1
*/
#include <util/delay.h>
#include <LCD5110_Graph.h>
#include <EEPROM.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
//настройки /////////////начало
LCD5110 myGLCD(A1, A0, 12, 10, 11); //подключение дисплея
#define contrast 57 //контрастность дисплея
byte treviga_1 = 30; //первая ступень тревоги
byte treviga_2 = 60; //вторая ступень тревоги
byte ton_BUZZ = 15; //длительность индикации частицы звуком
#define  ADC 153  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)
#define k_delitel 600 //коевициент дельтеля напряжения, зависит от вашего делителя.
byte puls = 1; //тонкая настройка длинны импульса высоковольтного транса
byte scrin_GRAF = 1; //скорость построения графика в секундах
bool buzz_ON = 1;  //включить индикацию бузером (1)
bool podsvetka = 0; //подсветка
bool son_OK = 0; //разрешение или запрет сна
bool alarm_sound = 0; //флаг индикации превышения порога звуком
float opornoe = 1.10; //делить на opornoe/10
#define son_t 110 //время засыпания в секундах
#define save_DOZ 45 //как часто сохранять накопленную дозу (например каждые 20мкР)
#define anti_dr 1000 //антидребезго от 0 до 255
//настройки //////////////конец
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t TinyFont[];
bool poisk = 1;
int hv_adc, hv_400, shet_s = 0, fon = 0;
float doz_v = 0.0;
volatile int shet = 0;
unsigned long t_milis = 0;
unsigned long alarm_milis = 0; //для отсчёта длительности сигнала тревоги по превышению порога
unsigned long gr_milis = 0;
unsigned long lcd_milis = 0;
unsigned long spNAK_milis = 0;
unsigned long son_milis = 0;
unsigned long time_doza = 0;
int shet_gr = 0, shet_n = 0;
byte mass_p[84];
byte m = 0;
byte n_menu = 0;
byte sys_menu = 0;
byte val_kl = 0;
byte val_ok = 0;
bool fonarik = 0;
float VCC = 0;//для экономии
byte menu = 0;
extern uint8_t logo_bat[];
extern uint8_t logo_rag[];
extern uint8_t logo_tr[];
bool tr = 0;//флаг тревоги
bool lou_fl = 0;
int speed_nakT = 0, speed_nak = 0 ;
int time_sh_l = 0;
byte time_son = son_t;
int MIN, HOUR;
int doza_vr = 0;
int val_dr_pr = 0, val_dr_levo = 0, val_dr_OK = 0;
void setup() {
  ACSR |= 1 << ACD; //отключаем компаратор
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Определяем режим сна
  pinMode(3, INPUT_PULLUP); //кнопка
  pinMode(4, INPUT_PULLUP); //кнопка
  pinMode(7, INPUT_PULLUP); //кнопка
  DDRB |= (1 << 0); PORTB &= ~(1 << 0); //пин пустой 8
  DDRC |= (1 << 4); PORTC &= ~(1 << 4); //пин пустой А4
  DDRC |= (1 << 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();
  Serial.begin(9600);
  analogReference(INTERNAL);
  attachInterrupt(0, Schet, FALLING);//прерываниям пин 2
  DDRB |= (1 << 5); //пины на выход
  DDRD |= (1 << 5);
  DDRD |= (1 << 6);
  DDRD |= (1 << 6);//пин бузера
  nakachka();
}

void loop() {
  if (menu == 0) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      val_dr_levo++;//антидребезг
      if (val_dr_levo >= anti_dr) {
        val_dr_levo = 0;
        time_son = son_t;//таймер сна сброс
        if (!(PIND & (1 << PIND7))) {
          val_kl++;
          if (val_kl == 10) {
            val_kl = 0;
            fonarik = !fonarik;
          }
        }
      }
    }
  }
  if (lou_fl == 1) {
    lou_work();
  }
  if (lou_fl == 0) {
    if (fonarik == 0) { //фонарик
      PORTB &= ~(1 << 1);//пин фонаря
    } else if (fonarik == 1) {
      PORTB |= (1 << 1);//пин фонаря
    }
if (podsvetka == 1) {
  PORTC |= (1 << 2); //A2 дисплей Light
}
if (podsvetka == 0) {
  PORTC &= ~(1 << 2); //A2 дисплей Light
}
if (son_OK == 1) {//отсчет сна
  if (millis() - son_milis >= 1000) {
    son_milis = millis();
    time_son--;
    if (tr == 0 && time_son <= 0) {
      time_son = son_t;
      PORTB &= ~(1 << 1);//пин фонаря
      PORTC &= ~(1 << 2); //A2 дисплей Light
          lou_fl = 1;
          myGLCD.enableSleep();
          shet = 0;
          attachInterrupt(1, wakeUp, LOW); //просыпаемся кнопка
        }
      }
    }
    if (millis() - lcd_milis >= 500) { //скорость отрисоаки дисплея
      lcd_milis = millis();
      if (menu == 0) {
        lcd_poisk();//вывод на дисплей режима поиск
      }
      if (menu == 1) {
        lcd_menu();//вывод на дисплей меню
      }
      if (menu == 2) {
        lcd_sys();//вывод на дисплей системного меню
      }
    }
    generator();//накачка по обратной связи с АЦП
    if (shet_s != shet) {
      signa ();//подача сигнала о частичке
    }
    if (!(PIND & (1 << PIND3))) { //нажатие ок
      val_dr_OK++;//антидребезг
      if (val_dr_OK >= anti_dr) {
        val_dr_OK = 0;
        time_son = son_t;//таймер сна сброс
        OK();
      }
    }
    if (menu == 1) {
      if (!(PIND & (1 << PIND4))) { //нажатие >>>
        val_dr_pr++;//антидребезг
        if (val_dr_pr >= anti_dr) {
          val_dr_pr = 0;
          time_son = son_t;//таймер сна сброс
          if (n_menu == 0) {
            treviga_1++;
          }
          if (n_menu == 1) {
            treviga_2++;
          }
          if (n_menu == 2) {
            podsvetka = !podsvetka;
          }
          if (n_menu == 3) {
            son_OK = !son_OK;
          }
          if (n_menu == 4) {
            scrin_GRAF++;
            if (scrin_GRAF > 10) {
              scrin_GRAF = 1;
            }
          }
          if (n_menu == 5) {
            buzz_ON = !buzz_ON;
          }
          if (n_menu == 6) {
            menu = 0;
          }
          if (n_menu == 7) {
            eeprom_wrS ();
            menu = 0;
          }
        }
      }
    }
    if (menu == 2) {
      if (!(PIND & (1 << PIND4))) { //нажатие >>>
        val_dr_pr++;//антидребезг
        if (val_dr_pr >= anti_dr) {
          val_dr_pr = 0;
          time_son = son_t;//таймер сна сброс
          if (sys_menu == 0) {
            opornoe = opornoe + 0.01;
            if (opornoe < 0.98) {
              opornoe = 1.20;
            }
            if (opornoe > 1.20) {
              opornoe = 0.98;
            }
          }
          if (sys_menu == 1) {
            puls++;
            if (puls < 1) {
              puls = 10;
            }
            if (puls > 10) {
              puls = 1;
            }
          }
          if (sys_menu == 2) {
            time_doza = 0;//сброс накопленной дозы
            doz_v = 0;//сброс накопленной дозы
            eeprom_wrD ();
            myGLCD.clrScr();
            myGLCD.setFont(SmallFont);
            myGLCD.print("SBROS OK", CENTER, 24);
            myGLCD.update();
            _delay_ms(1000);
          }
          if (sys_menu == 3) {
            menu = 0;
          }
          if (sys_menu == 4) {
            eeprom_wrS ();
            menu = 0;
          }
        }
      }
    }
    if (menu == 1) {
      if (!(PIND & (1 << PIND7))) { //нажатие <<<
        val_dr_levo++;//антидребезг
        if (val_dr_levo >= anti_dr) {
          val_dr_levo = 0;
          time_son = son_t;//таймер сна сброс
          if (n_menu == 0) {
            treviga_1--;
          }
          if (n_menu == 1) {
            treviga_2--;
          }
          if (n_menu == 2) {
            podsvetka = !podsvetka;
          }
          if (n_menu == 3) {
            son_OK = !son_OK;
          }
          if (n_menu == 4) {
            scrin_GRAF--;
            if (scrin_GRAF < 1) {
              scrin_GRAF = 10;
            }
          }
          if (n_menu == 5) {
            buzz_ON = !buzz_ON;
          }
          if (n_menu == 6) {
            menu = 0;
          }
          if (n_menu == 7) {
            eeprom_wrS ();
            menu = 0;
          }
        }
      }
    }
    if (menu == 2) {
      if (!(PIND & (1 << PIND7))) { //нажатие <<<
        val_dr_levo++;//антидребезг
        if (val_dr_levo >= anti_dr) {
          val_dr_levo = 0;
          time_son = son_t;//таймер сна сброс
          if (sys_menu == 0) {
            opornoe = opornoe - 0.01;
            if (opornoe < 0.98) {
              opornoe = 1.20;
            }
            if (opornoe > 1.20) {
              opornoe = 0.98;
            }
          }
          if (sys_menu == 1) {
            puls--;
            if (puls < 1) {
              puls = 10;
            }
            if (puls > 10) {
              puls = 1;
            }
          }
          if (sys_menu == 2) {
            time_doza = 0;//сброс накопленной дозы
            doz_v = 0;//сброс накопленной дозы
            eeprom_wrD ();
            myGLCD.clrScr();
            myGLCD.setFont(SmallFont);
            myGLCD.print("SBROS OK", CENTER, 24);
            myGLCD.update();
            _delay_ms(1000);
          }
          if (sys_menu == 3) {
            menu = 0;
          }
          if (sys_menu == 4) {
            eeprom_wrS ();
            menu = 0;
          }
        }
      }
    }
  }
  if (!tr && alarm_sound) // если фон ниже порога тревоги, но сигнал тревоги ещё не выключен
	{
		alarm_sound = 0; // сбрасываем флаг звукового сигнала тревоги
		PORTD &= ~(1 << 6); // выключаем бузер
	}
  
}

void OK () { //нажатие ОК
  if (!(PIND & (1 << PIND3))) { //удержаиние OK
    val_ok++;
    if (val_ok == 10) {
      val_ok = 0;
      menu = 2;
    }
  }
  if (menu == 2) {
    sys_menu++;
    if (sys_menu > 4) {
      sys_menu = 0;
    }
  }
  if (menu == 1) {
    n_menu++;
    if (n_menu > 7) {
      n_menu = 0;
    }
  }
  if (menu == 0) {
    menu = 1;
  }
}

void lcd_poisk() {//вывод на дисплей режима поиск
  if (shet < treviga_1 && fon < treviga_1) {//проверяем тревогу
    tr = 0;
  }
  if (shet > treviga_1 || fon > treviga_1) {//проверяем тревогу 
	check_alarm_signal(); // устанавливаем сигнал непрерывной тревоги
    tr = 1;
    time_son = son_t;//таймер сна сброс
  }
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  if (tr == 1) { //опасно
    myGLCD.drawBitmap(0, 0, logo_tr, 24, 8);
    myGLCD.print("OPASNO", 20, 0);
  }
  if (fon == 0 && tr == 0) {
    myGLCD.print("ZAMER", 20, 0);
  }
  if (fon > 0 && tr == 0) {
    myGLCD.print("NORMA", 20, 0);
  }
  myGLCD.setFont(MediumNumbers);
  if (fon == 0) {
    if (shet >= 1000) {
      myGLCD.printNumI(shet, LEFT, 7);
    }
    if (shet < 1000) {
      myGLCD.printNumI(shet, CENTER, 7);
    }
  }
  if (fon > 0) {
    if (fon >= 1000) {
      myGLCD.printNumI(fon, LEFT, 7);
    }
    if (fon < 1000) {
      myGLCD.printNumI(fon, CENTER, 7);
    }
  }
  myGLCD.setFont(SmallFont); myGLCD.print("uR/h", RIGHT, 12);
  time_d ();
  myGLCD.setFont(TinyFont);
  myGLCD.printNumI(HOUR, 0, 26);
  if (HOUR >= 9) {
    myGLCD.print("h", 10, 26);
  }
  if (HOUR < 9) {
    myGLCD.print("h", 5, 26);
  }
  myGLCD.printNumI(MIN, 16, 26);
  if (MIN >= 9) {
    myGLCD.print("m", 26, 26);
  }
  if (MIN < 9) {
    myGLCD.print("m", 21, 26);
  }
  myGLCD.setFont(SmallFont);
  if (doz_v < 1000) {
    myGLCD.printNumF(doz_v, 1, 41, 24); myGLCD.print("uR", RIGHT, 24);
  }
  if (doz_v >= 1000) {
    myGLCD.printNumF(doz_v / 1000.0, 2, 41, 24); myGLCD.print("mR", RIGHT, 24);
  }
  myGLCD.drawLine(0, 32, 83, 32);//верхняя
  myGLCD.drawBitmap(59, 0, logo_bat, 24, 8); myGLCD.setFont(TinyFont); myGLCD.printNumF(VCC, 2, 63, 2); //батарейка
  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(TinyFont);
  myGLCD.print("OPASN.1", 0, 0); myGLCD.printNumI(treviga_1, CENTER, 0); myGLCD.print("uR/h", RIGHT, 0);
  myGLCD.print("OPASN.2", 0, 6); myGLCD.printNumI(treviga_2, CENTER, 6); myGLCD.print("uR/h", RIGHT, 6);
  myGLCD.print("PODSV.", 0, 12); myGLCD.printNumI(podsvetka, CENTER, 12);
  myGLCD.print("SON.", 0, 18); myGLCD.printNumI(son_OK, CENTER, 18); myGLCD.print("on/off", RIGHT, 18);//usr
  myGLCD.print("POISK.", 0, 24); myGLCD.printNumI(scrin_GRAF, CENTER, 24); myGLCD.print("SEK", RIGHT, 24);
  myGLCD.print("ZVUK", 0, 30); myGLCD.printNumI(buzz_ON, CENTER, 30);
  myGLCD.print("OUT", 0, 36);
  myGLCD.print("SAVE", 0, 42);
  myGLCD.print(">", 30, n_menu * 6);
  myGLCD.update();
}
void lcd_sys() { //вывод на дисплей меню
  VCC_read();
  speed_nakachka ();//скорость накачки имлульсы/сек
  myGLCD.clrScr();
  myGLCD.setFont(TinyFont);
  myGLCD.print("OPORN", 0, 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("NAKAH", 0, 6); myGLCD.printNumI(puls, CENTER, 6); myGLCD.printNumI(hv_400, RIGHT, 6);
  myGLCD.print("DOZA", 0, 12); myGLCD.print(">>", CENTER, 12); myGLCD.print("SBROS", RIGHT, 12);
  myGLCD.print("OUT", 0, 18);
  myGLCD.print("SAVE", 0, 24);
  myGLCD.print(">", 30, sys_menu * 6);
  myGLCD.print("SPEED N", 0, 40); myGLCD.printNumI(speed_nak, CENTER, 40); myGLCD.print("imp/sek", RIGHT, 40);
  myGLCD.update();
}

void poisk_f() {//режим поиска
  if (poisk == 1) {
    if (millis() - gr_milis >= scrin_GRAF * 1000) { //счет для графика
      gr_milis = millis();
      val_ok = 0;//сброс удержания системного меню
      shet_gr = shet - shet_n;
      if (shet_gr < 0) {
        shet_gr = 1;
      }
      mass_p[m] = shet_gr ;
      shet_n = shet;
      if (m < 82) {
        m++;
      }
      if (m == 82) {
        for (int i = 0; i < 83; i++) {
          mass_p[i] = mass_p[i + 1];
        }
        mass_p[82] = shet_gr;
      }
      VCC_read();
    }
    if (millis() - t_milis >= 36000) {//отсчет для СТС-5(СБМ-20)
      t_milis = millis();
      fon = shet;
      doz_v = doz_v + fon / 100.0;
      shet = 0;
      time_doza = time_doza + 36;
      if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
        eeprom_wrD ();
        doza_vr = doz_v;
      }
      if (menu == 1) { //выход из меню
        menu = 0;
      }
    }
    if (shet - fon >= 20) { //ускоряем если счет намного больше фона
      fon = shet;
    }
  }
}

void signa () { //индикация каждой частички звуком или светом
  poisk_f();
  shet_s = shet;
  if (alarm_sound)

	{
		PORTD |= (1 << 6); // включаем непрерывный сигнал тревоги
		if ((millis() - alarm_milis) > 7000) // проверяем, не истекло ли время подачи сигнала тревоги
		{
		PORTD &= ~(1 << 6); // выключаем непрерывный сигнал тревоги
		alarm_sound = 0; // сбрасываем флаг сигнала тревоги
		}
		
		PORTB |= (1 << 5); //светодиод
		delay(ton_BUZZ);
		PORTB &= ~(1 << 5);//светодиод
	}
	else 
	{
	if (buzz_ON == 1) 
	    {//включаем бузер
		PORTB |= (1 << 5); //светодиод
		PORTD |= (1 << 6);
		delay(ton_BUZZ);
		PORTD &= ~(1 << 6);
		PORTB &= ~(1 << 5);//светодиод
		}
	
	
    }
  generator();//накачка по обратной связи с АЦП
}

void Schet() { //прерывание от счетчика на пин 2
  //detachInterrupt(0);
  shet++;
  //attachInterrupt(0, Schet, FALLING);
}

void generator() {//накачка по обратной связи с АЦП
  hv_adc  = Read_HV();
  if (hv_adc < ADC) { //Значение АЦП при котором на выходе 400В
    PORTD |= (1 << 5); //пин накачки
    int c = puls;
    while (c > 0) {
      asm("nop");
      c--;
    }
    PORTD &= ~(1 << 5);//пин накачки
    speed_nakT++;
  }
}
void VCC_read() { // Чтение напряжения батареи
  ADCSRA = 0b11100111;
  ADMUX = 0b01101110;//Выбор внешнего опорного+BG
  _delay_ms(5);
  while ((ADCSRA & 0x10) == 0);
  ADCSRA |= 0x10;
  byte resu = ADCH;
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  VCC = (opornoe * 255.0) / resu;
}
byte Read_HV () {
  ADMUX = 0b11100110;//выбор внутреннего опорного 1,1В и А6
  ADCSRA = 0b11100111;
  _delay_us(20);
  while ((ADCSRA & 0x10) == 0);
  ADCSRA |= 0x10;
  byte result = ADCH;
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  return result;
}
void lcd_init() {
  myGLCD.InitLCD();
  myGLCD.setContrast(contrast);
  myGLCD.clrScr();
  myGLCD.drawBitmap(0, 0, logo_rag, 84, 48);
  myGLCD.setFont(SmallFont);
  myGLCD.print("Arduino+", CENTER, 32);
  myGLCD.print("Dosimetr v1.03", CENTER, 40);
  myGLCD.update();
}
void eeprom_wrS () { //запись настроек в память
  EEPROM.write(0, 222);
  EEPROM.write(1, treviga_1);
  EEPROM.write(2, podsvetka);
  EEPROM.write(3, son_OK);
  EEPROM.write(4, scrin_GRAF);
  EEPROM.write(5, buzz_ON);
  EEPROM.write(6, puls);
  EEPROM.write(7, opornoe * 100);
  EEPROM.write(8, treviga_2);
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("Save OK", CENTER, 24);
  myGLCD.update();
  _delay_ms(1000);
}
void eeprom_wrD () { //запись настроек в память время накопления дозы
  byte hi = time_doza >> 8;// разбираем
  byte low = time_doza;
  EEPROM.write(9, hi);//пишем
  EEPROM.write(10, low);
  hi = int(doz_v) >> 8;// разбираем
  low = int(doz_v);
  EEPROM.write(11, hi);//пишем
  EEPROM.write(12, low);
}
void eeprom_readD () { //чтание настроек из памяти время накопления дозы
  byte hi  = EEPROM.read(9);//читаем
  byte low  = EEPROM.read(10);
  time_doza = (hi << 8) | low; // собираем
  hi  = EEPROM.read(11);//читаем
  low  = EEPROM.read(12);
  doz_v = (hi << 8) | low; // собираем
}
void eeprom_readS () { //чтание настроек из памяти
  if (EEPROM.read(0) == 222) {
    treviga_1 = EEPROM.read(1);
    podsvetka = EEPROM.read(2);
    son_OK = EEPROM.read(3);
    scrin_GRAF = EEPROM.read(4);
    buzz_ON = EEPROM.read(5);
    puls = EEPROM.read(6);
    opornoe = EEPROM.read(7) / 100.0;
    treviga_2 = EEPROM.read(8);
  }
  _delay_ms(10);
}
void nakachka() {//первая накачка
  byte n = 0;
  while (n < 20) {
    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 lou_work () {
  CLKPR = 1 << CLKPCE;
  CLKPR = (1 << CLKPS3);
  time_sh_l++;
  if (time_sh_l == 650) {
    time_sh_l = 0;
    fon = shet;
    PORTB |= (1 << 5); //светодиод
    doz_v = doz_v + shet / 100.0;
    shet = 0;
    _delay_us(50);
    PORTB &= ~(1 << 5);//светодиод
    time_doza = time_doza + 36;
    if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
      eeprom_wrD ();
      doza_vr = doz_v;
    }
  }
  if (shet >= treviga_1) {
    CLKPR = 1 << CLKPCE;
    CLKPR = (0 << CLKPS3);
	check_alarm_signal(); // устанавливаем сигнал непрерывной тревоги
    tr = 1;
    myGLCD.disableSleep();
    lou_fl = 0;
    t_milis = millis();
    fon = shet ;
    shet = 0;
  }
  ADMUX = 0b11100110;
  ADCSRA = 0b11100111;
  while ((ADCSRA & 0x10) == 0);
  ADCSRA |= 0x10;
  hv_adc = ADCH;
  ADCSRA &= ~(1 << ADEN);
  if (hv_adc < ADC) {
    CLKPR = 1 << CLKPCE;
    CLKPR = (0 << CLKPS3);
    nakachka();
  }
}
void wakeUp() {
  detachInterrupt(1);
  CLKPR = 1 << CLKPCE;
  CLKPR = (0 << CLKPS3);
  _delay_ms(100);
  myGLCD.disableSleep();
  lou_fl = 0;
  t_milis = millis();
  shet = 0;
}
void time_d() {
  HOUR = time_doza / 3600;
  MIN = (time_doza / 60) % 60;
}

void check_alarm_signal()  // устанавливаем сигнал непрерывной тревоги, если "tr" ещё не установлен, а показания уже выше аварийного порога
{
	if (!tr) // если счёт превысил аварийный порог, но флаг "tr" ещё не установлен
		{
		alarm_sound = 1; // поднимаем флаг аварийного сигнала
		alarm_milis = millis(); // запоминаем время начала тревоги
		}  
}


Тестовый скетч с сигналом тревоги (для красного модуля дисплея 5110) на базе авторского 1.4.3:

/* ArDOs   v1.04
***Дозиметр на Ардуино
***IDE Arduino 1.8.1
*/
#include <util/delay.h>
#include <LCD5110_Graph.h>
#include <EEPROM.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
//настройки /////////////начало
LCD5110 myGLCD(A1, A0, 12, 10, 11); //подключение дисплея
#define contrast 57 //контрастность дисплея
byte treviga_1 = 30; //первая ступень тревоги
byte treviga_2 = 60; //вторая ступень тревоги
byte ton_BUZZ = 15; //длительность индикации частицы звуком
#define  ADC 153  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)
#define k_delitel 600 //коевициент дельтеля напряжения, зависит от вашего делителя.
byte puls = 1; //тонкая настройка длинны импульса высоковольтного транса
byte scrin_GRAF = 1; //скорость построения графика в секундах
bool buzz_ON = 1;  //включить индикацию бузером (1)
bool podsvetka = 0; //подсветка
bool son_OK = 0; //разрешение или запрет сна
bool alarm_sound = 0; //флаг индикации превышения порога звуком
float opornoe = 1.10; //делить на opornoe/10
#define son_t 110 //время засыпания в секундах
#define save_DOZ 45 //как часто сохранять накопленную дозу (например каждые 20мкР)
#define anti_dr 1000 //антидребезго от 0 до 255
//настройки //////////////конец
extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
extern uint8_t TinyFont[];
bool poisk = 1;
int hv_adc, hv_400, shet_s = 0, fon = 0;
float doz_v = 0.0;
volatile int shet = 0;
unsigned long t_milis = 0;
unsigned long alarm_milis = 0; //для отсчёта длительности сигнала тревоги по превышению порога
unsigned long gr_milis = 0;
unsigned long lcd_milis = 0;
unsigned long spNAK_milis = 0;
unsigned long son_milis = 0;
unsigned long time_doza = 0;
int shet_gr = 0, shet_n = 0;
byte mass_p[84];
byte m = 0;
byte n_menu = 0;
byte sys_menu = 0;
byte val_kl = 0;
byte val_ok = 0;
bool fonarik = 0;
float VCC = 0;//для экономии
byte menu = 0;
extern uint8_t logo_bat[];
extern uint8_t logo_rag[];
extern uint8_t logo_tr[];
bool tr = 0;//флаг тревоги
bool lou_fl = 0;
int speed_nakT = 0, speed_nak = 0 ;
int time_sh_l = 0;
byte time_son = son_t;
int MIN, HOUR;
int doza_vr = 0;
int val_dr_pr = 0, val_dr_levo = 0, val_dr_OK = 0;
void setup() {
  ACSR |= 1 << ACD; //отключаем компаратор
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Определяем режим сна
  pinMode(3, INPUT_PULLUP); //кнопка
  pinMode(4, INPUT_PULLUP); //кнопка
  pinMode(7, INPUT_PULLUP); //кнопка
  DDRB |= (1 << 0); PORTB &= ~(1 << 0); //пин пустой 8
  DDRC |= (1 << 4); PORTC &= ~(1 << 4); //пин пустой А4
  DDRC |= (1 << 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();
  Serial.begin(9600);
  analogReference(INTERNAL);
  attachInterrupt(0, Schet, FALLING);//прерываниям пин 2
  DDRB |= (1 << 5); //пины на выход
  DDRD |= (1 << 5);
  DDRD |= (1 << 6);
  DDRD |= (1 << 6);//пин бузера
  nakachka();
}

void loop() {
  if (menu == 0) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      val_dr_levo++;//антидребезг
      if (val_dr_levo >= anti_dr) {
        val_dr_levo = 0;
        time_son = son_t;//таймер сна сброс
        if (!(PIND & (1 << PIND7))) {
          val_kl++;
          if (val_kl == 10) {
            val_kl = 0;
            fonarik = !fonarik;
          }
        }
      }
    }
  }
  if (lou_fl == 1) {
    lou_work();
  }
  if (lou_fl == 0) {
    if (fonarik == 0) { //фонарик
      PORTB &= ~(1 << 1);//пин фонаря
    } else if (fonarik == 1) {
      PORTB |= (1 << 1);//пин фонаря
    }
    if (podsvetka == 1) {
      PORTC &= ~(1 << 2); //A2 дисплей Light
    }
    if (podsvetka == 0) {
      PORTC |= (1 << 2); //A2 дисплей Light
    }
    if (son_OK == 1) {//отсчет сна
      if (millis() - son_milis >= 1000) {
        son_milis = millis();
        time_son--;
        if (tr == 0 && time_son <= 0) {
          time_son = son_t;
          PORTB &= ~(1 << 1);//пин фонаря
          PORTC  |= (1 << 2); //A2 дисплей Light
          lou_fl = 1;
          myGLCD.enableSleep();
          shet = 0;
          attachInterrupt(1, wakeUp, LOW); //просыпаемся кнопка
        }
      }
    }
    if (millis() - lcd_milis >= 500) { //скорость отрисоаки дисплея
      lcd_milis = millis();
      if (menu == 0) {
        lcd_poisk();//вывод на дисплей режима поиск
      }
      if (menu == 1) {
        lcd_menu();//вывод на дисплей меню
      }
      if (menu == 2) {
        lcd_sys();//вывод на дисплей системного меню
      }
    }
    generator();//накачка по обратной связи с АЦП
    if (shet_s != shet) {
      signa ();//подача сигнала о частичке
    }
    if (!(PIND & (1 << PIND3))) { //нажатие ок
      val_dr_OK++;//антидребезг
      if (val_dr_OK >= anti_dr) {
        val_dr_OK = 0;
        time_son = son_t;//таймер сна сброс
        OK();
      }
    }
    if (menu == 1) {
      if (!(PIND & (1 << PIND4))) { //нажатие >>>
        val_dr_pr++;//антидребезг
        if (val_dr_pr >= anti_dr) {
          val_dr_pr = 0;
          time_son = son_t;//таймер сна сброс
          if (n_menu == 0) {
            treviga_1++;
          }
          if (n_menu == 1) {
            treviga_2++;
          }
          if (n_menu == 2) {
            podsvetka = !podsvetka;
          }
          if (n_menu == 3) {
            son_OK = !son_OK;
          }
          if (n_menu == 4) {
            scrin_GRAF++;
            if (scrin_GRAF > 10) {
              scrin_GRAF = 1;
            }
          }
          if (n_menu == 5) {
            buzz_ON = !buzz_ON;
          }
          if (n_menu == 6) {
            menu = 0;
          }
          if (n_menu == 7) {
            eeprom_wrS ();
            menu = 0;
          }
        }
      }
    }
    if (menu == 2) {
      if (!(PIND & (1 << PIND4))) { //нажатие >>>
        val_dr_pr++;//антидребезг
        if (val_dr_pr >= anti_dr) {
          val_dr_pr = 0;
          time_son = son_t;//таймер сна сброс
          if (sys_menu == 0) {
            opornoe = opornoe + 0.01;
            if (opornoe < 0.98) {
              opornoe = 1.20;
            }
            if (opornoe > 1.20) {
              opornoe = 0.98;
            }
          }
          if (sys_menu == 1) {
            puls++;
            if (puls < 1) {
              puls = 10;
            }
            if (puls > 10) {
              puls = 1;
            }
          }
          if (sys_menu == 2) {
            time_doza = 0;//сброс накопленной дозы
            doz_v = 0;//сброс накопленной дозы
            eeprom_wrD ();
            myGLCD.clrScr();
            myGLCD.setFont(SmallFont);
            myGLCD.print("SBROS OK", CENTER, 24);
            myGLCD.update();
            _delay_ms(1000);
          }
          if (sys_menu == 3) {
            menu = 0;
          }
          if (sys_menu == 4) {
            eeprom_wrS ();
            menu = 0;
          }
        }
      }
    }
    if (menu == 1) {
      if (!(PIND & (1 << PIND7))) { //нажатие <<<
        val_dr_levo++;//антидребезг
        if (val_dr_levo >= anti_dr) {
          val_dr_levo = 0;
          time_son = son_t;//таймер сна сброс
          if (n_menu == 0) {
            treviga_1--;
          }
          if (n_menu == 1) {
            treviga_2--;
          }
          if (n_menu == 2) {
            podsvetka = !podsvetka;
          }
          if (n_menu == 3) {
            son_OK = !son_OK;
          }
          if (n_menu == 4) {
            scrin_GRAF--;
            if (scrin_GRAF < 1) {
              scrin_GRAF = 10;
            }
          }
          if (n_menu == 5) {
            buzz_ON = !buzz_ON;
          }
          if (n_menu == 6) {
            menu = 0;
          }
          if (n_menu == 7) {
            eeprom_wrS ();
            menu = 0;
          }
        }
      }
    }
    if (menu == 2) {
      if (!(PIND & (1 << PIND7))) { //нажатие <<<
        val_dr_levo++;//антидребезг
        if (val_dr_levo >= anti_dr) {
          val_dr_levo = 0;
          time_son = son_t;//таймер сна сброс
          if (sys_menu == 0) {
            opornoe = opornoe - 0.01;
            if (opornoe < 0.98) {
              opornoe = 1.20;
            }
            if (opornoe > 1.20) {
              opornoe = 0.98;
            }
          }
          if (sys_menu == 1) {
            puls--;
            if (puls < 1) {
              puls = 10;
            }
            if (puls > 10) {
              puls = 1;
            }
          }
          if (sys_menu == 2) {
            time_doza = 0;//сброс накопленной дозы
            doz_v = 0;//сброс накопленной дозы
            eeprom_wrD ();
            myGLCD.clrScr();
            myGLCD.setFont(SmallFont);
            myGLCD.print("SBROS OK", CENTER, 24);
            myGLCD.update();
            _delay_ms(1000);
          }
          if (sys_menu == 3) {
            menu = 0;
          }
          if (sys_menu == 4) {
            eeprom_wrS ();
            menu = 0;
          }
        }
      }
    }
  }
  if (!tr && alarm_sound) // если фон ниже порога тревоги, но сигнал тревоги ещё не выключен
	{
		alarm_sound = 0; // сбрасываем флаг звукового сигнала тревоги
		PORTD &= ~(1 << 6); // выключаем бузер
	}
  
}

void OK () { //нажатие ОК
  if (!(PIND & (1 << PIND3))) { //удержаиние OK
    val_ok++;
    if (val_ok == 10) {
      val_ok = 0;
      menu = 2;
    }
  }
  if (menu == 2) {
    sys_menu++;
    if (sys_menu > 4) {
      sys_menu = 0;
    }
  }
  if (menu == 1) {
    n_menu++;
    if (n_menu > 7) {
      n_menu = 0;
    }
  }
  if (menu == 0) {
    menu = 1;
  }
}

void lcd_poisk() {//вывод на дисплей режима поиск
  if (shet < treviga_1 && fon < treviga_1) {//проверяем тревогу
    tr = 0;
  }
  if (shet > treviga_1 || fon > treviga_1) {//проверяем тревогу 
	check_alarm_signal(); // устанавливаем сигнал непрерывной тревоги
    tr = 1;
    time_son = son_t;//таймер сна сброс
  }
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  if (tr == 1) { //опасно
    myGLCD.drawBitmap(0, 0, logo_tr, 24, 8);
    myGLCD.print("OPASNO", 20, 0);
  }
  if (fon == 0 && tr == 0) {
    myGLCD.print("ZAMER", 20, 0);
  }
  if (fon > 0 && tr == 0) {
    myGLCD.print("NORMA", 20, 0);
  }
  myGLCD.setFont(MediumNumbers);
  if (fon == 0) {
    if (shet >= 1000) {
      myGLCD.printNumI(shet, LEFT, 7);
    }
    if (shet < 1000) {
      myGLCD.printNumI(shet, CENTER, 7);
    }
  }
  if (fon > 0) {
    if (fon >= 1000) {
      myGLCD.printNumI(fon, LEFT, 7);
    }
    if (fon < 1000) {
      myGLCD.printNumI(fon, CENTER, 7);
    }
  }
  myGLCD.setFont(SmallFont); myGLCD.print("uR/h", RIGHT, 12);
  time_d ();
  myGLCD.setFont(TinyFont);
  myGLCD.printNumI(HOUR, 0, 26);
  if (HOUR >= 9) {
    myGLCD.print("h", 10, 26);
  }
  if (HOUR < 9) {
    myGLCD.print("h", 5, 26);
  }
  myGLCD.printNumI(MIN, 16, 26);
  if (MIN >= 9) {
    myGLCD.print("m", 26, 26);
  }
  if (MIN < 9) {
    myGLCD.print("m", 21, 26);
  }
  myGLCD.setFont(SmallFont);
  if (doz_v < 1000) {
    myGLCD.printNumF(doz_v, 1, 41, 24); myGLCD.print("uR", RIGHT, 24);
  }
  if (doz_v >= 1000) {
    myGLCD.printNumF(doz_v / 1000.0, 2, 41, 24); myGLCD.print("mR", RIGHT, 24);
  }
  myGLCD.drawLine(0, 32, 83, 32);//верхняя
  myGLCD.drawBitmap(59, 0, logo_bat, 24, 8); myGLCD.setFont(TinyFont); myGLCD.printNumF(VCC, 2, 63, 2); //батарейка
  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(TinyFont);
  myGLCD.print("OPASN.1", 0, 0); myGLCD.printNumI(treviga_1, CENTER, 0); myGLCD.print("uR/h", RIGHT, 0);
  myGLCD.print("OPASN.2", 0, 6); myGLCD.printNumI(treviga_2, CENTER, 6); myGLCD.print("uR/h", RIGHT, 6);
  myGLCD.print("PODSV.", 0, 12); myGLCD.printNumI(podsvetka, CENTER, 12);
  myGLCD.print("SON.", 0, 18); myGLCD.printNumI(son_OK, CENTER, 18); myGLCD.print("on/off", RIGHT, 18);//usr
  myGLCD.print("POISK.", 0, 24); myGLCD.printNumI(scrin_GRAF, CENTER, 24); myGLCD.print("SEK", RIGHT, 24);
  myGLCD.print("ZVUK", 0, 30); myGLCD.printNumI(buzz_ON, CENTER, 30);
  myGLCD.print("OUT", 0, 36);
  myGLCD.print("SAVE", 0, 42);
  myGLCD.print(">", 30, n_menu * 6);
  myGLCD.update();
}
void lcd_sys() { //вывод на дисплей меню
  VCC_read();
  speed_nakachka ();//скорость накачки имлульсы/сек
  myGLCD.clrScr();
  myGLCD.setFont(TinyFont);
  myGLCD.print("OPORN", 0, 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("NAKAH", 0, 6); myGLCD.printNumI(puls, CENTER, 6); myGLCD.printNumI(hv_400, RIGHT, 6);
  myGLCD.print("DOZA", 0, 12); myGLCD.print(">>", CENTER, 12); myGLCD.print("SBROS", RIGHT, 12);
  myGLCD.print("OUT", 0, 18);
  myGLCD.print("SAVE", 0, 24);
  myGLCD.print(">", 30, sys_menu * 6);
  myGLCD.print("SPEED N", 0, 40); myGLCD.printNumI(speed_nak, CENTER, 40); myGLCD.print("imp/sek", RIGHT, 40);
  myGLCD.update();
}

void poisk_f() {//режим поиска
  if (poisk == 1) {
    if (millis() - gr_milis >= scrin_GRAF * 1000) { //счет для графика
      gr_milis = millis();
      val_ok = 0;//сброс удержания системного меню
      shet_gr = shet - shet_n;
      if (shet_gr < 0) {
        shet_gr = 1;
      }
      mass_p[m] = shet_gr ;
      shet_n = shet;
      if (m < 82) {
        m++;
      }
      if (m == 82) {
        for (int i = 0; i < 83; i++) {
          mass_p[i] = mass_p[i + 1];
        }
        mass_p[82] = shet_gr;
      }
      VCC_read();
    }
    if (millis() - t_milis >= 36000) {//отсчет для СТС-5(СБМ-20)
      t_milis = millis();
      fon = shet;
      doz_v = doz_v + fon / 100.0;
      shet = 0;
      time_doza = time_doza + 36;
      if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
        eeprom_wrD ();
        doza_vr = doz_v;
      }
      if (menu == 1) { //выход из меню
        menu = 0;
      }
    }
    if (shet - fon >= 20) { //ускоряем если счет намного больше фона
      fon = shet;
    }
  }
}

void signa () { //индикация каждой частички звуком или светом
  poisk_f();
  shet_s = shet;
  if (alarm_sound)

	{
		PORTD |= (1 << 6); // включаем непрерывный сигнал тревоги
		if ((millis() - alarm_milis) > 7000) // проверяем, не истекло ли время подачи сигнала тревоги
		{
		PORTD &= ~(1 << 6); // выключаем непрерывный сигнал тревоги
		alarm_sound = 0; // сбрасываем флаг сигнала тревоги
		}
		
		PORTB |= (1 << 5); //светодиод
		delay(ton_BUZZ);
		PORTB &= ~(1 << 5);//светодиод
	}
	else 
	{
	if (buzz_ON == 1) 
	    {//включаем бузер
		PORTB |= (1 << 5); //светодиод
		PORTD |= (1 << 6);
		delay(ton_BUZZ);
		PORTD &= ~(1 << 6);
		PORTB &= ~(1 << 5);//светодиод
		}
	
	
    }
  generator();//накачка по обратной связи с АЦП
}

void Schet() { //прерывание от счетчика на пин 2
  //detachInterrupt(0);
  shet++;
  //attachInterrupt(0, Schet, FALLING);
}

void generator() {//накачка по обратной связи с АЦП
  hv_adc  = Read_HV();
  if (hv_adc < ADC) { //Значение АЦП при котором на выходе 400В
    PORTD |= (1 << 5); //пин накачки
    int c = puls;
    while (c > 0) {
      asm("nop");
      c--;
    }
    PORTD &= ~(1 << 5);//пин накачки
    speed_nakT++;
  }
}
void VCC_read() { // Чтение напряжения батареи
  ADCSRA = 0b11100111;
  ADMUX = 0b01101110;//Выбор внешнего опорного+BG
  _delay_ms(5);
  while ((ADCSRA & 0x10) == 0);
  ADCSRA |= 0x10;
  byte resu = ADCH;
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  VCC = (opornoe * 255.0) / resu;
}
byte Read_HV () {
  ADMUX = 0b11100110;//выбор внутреннего опорного 1,1В и А6
  ADCSRA = 0b11100111;
  _delay_us(20);
  while ((ADCSRA & 0x10) == 0);
  ADCSRA |= 0x10;
  byte result = ADCH;
  ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  return result;
}
void lcd_init() {
  myGLCD.InitLCD();
  myGLCD.setContrast(contrast);
  myGLCD.clrScr();
  myGLCD.drawBitmap(0, 0, logo_rag, 84, 48);
  myGLCD.setFont(SmallFont);
  myGLCD.print("Arduino+", CENTER, 32);
  myGLCD.print("Dosimetr v1.03", CENTER, 40);
  myGLCD.update();
}
void eeprom_wrS () { //запись настроек в память
  EEPROM.write(0, 222);
  EEPROM.write(1, treviga_1);
  EEPROM.write(2, podsvetka);
  EEPROM.write(3, son_OK);
  EEPROM.write(4, scrin_GRAF);
  EEPROM.write(5, buzz_ON);
  EEPROM.write(6, puls);
  EEPROM.write(7, opornoe * 100);
  EEPROM.write(8, treviga_2);
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("Save OK", CENTER, 24);
  myGLCD.update();
  _delay_ms(1000);
}
void eeprom_wrD () { //запись настроек в память время накопления дозы
  byte hi = time_doza >> 8;// разбираем
  byte low = time_doza;
  EEPROM.write(9, hi);//пишем
  EEPROM.write(10, low);
  hi = int(doz_v) >> 8;// разбираем
  low = int(doz_v);
  EEPROM.write(11, hi);//пишем
  EEPROM.write(12, low);
}
void eeprom_readD () { //чтание настроек из памяти время накопления дозы
  byte hi  = EEPROM.read(9);//читаем
  byte low  = EEPROM.read(10);
  time_doza = (hi << 8) | low; // собираем
  hi  = EEPROM.read(11);//читаем
  low  = EEPROM.read(12);
  doz_v = (hi << 8) | low; // собираем
}
void eeprom_readS () { //чтание настроек из памяти
  if (EEPROM.read(0) == 222) {
    treviga_1 = EEPROM.read(1);
    podsvetka = EEPROM.read(2);
    son_OK = EEPROM.read(3);
    scrin_GRAF = EEPROM.read(4);
    buzz_ON = EEPROM.read(5);
    puls = EEPROM.read(6);
    opornoe = EEPROM.read(7) / 100.0;
    treviga_2 = EEPROM.read(8);
  }
  _delay_ms(10);
}
void nakachka() {//первая накачка
  byte n = 0;
  while (n < 20) {
    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 lou_work () {
  CLKPR = 1 << CLKPCE;
  CLKPR = (1 << CLKPS3);
  time_sh_l++;
  if (time_sh_l == 650) {
    time_sh_l = 0;
    fon = shet;
    PORTB |= (1 << 5); //светодиод
    doz_v = doz_v + shet / 100.0;
    shet = 0;
    _delay_us(50);
    PORTB &= ~(1 << 5);//светодиод
    time_doza = time_doza + 36;
    if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
      eeprom_wrD ();
      doza_vr = doz_v;
    }
  }
  if (shet >= treviga_1) {
    CLKPR = 1 << CLKPCE;
    CLKPR = (0 << CLKPS3);
	check_alarm_signal(); // устанавливаем сигнал непрерывной тревоги
    tr = 1;
    myGLCD.disableSleep();
    lou_fl = 0;
    t_milis = millis();
    fon = shet ;
    shet = 0;
  }
  ADMUX = 0b11100110;
  ADCSRA = 0b11100111;
  while ((ADCSRA & 0x10) == 0);
  ADCSRA |= 0x10;
  hv_adc = ADCH;
  ADCSRA &= ~(1 << ADEN);
  if (hv_adc < ADC) {
    CLKPR = 1 << CLKPCE;
    CLKPR = (0 << CLKPS3);
    nakachka();
  }
}
void wakeUp() {
  detachInterrupt(1);
  CLKPR = 1 << CLKPCE;
  CLKPR = (0 << CLKPS3);
  _delay_ms(100);
  myGLCD.disableSleep();
  lou_fl = 0;
  t_milis = millis();
  shet = 0;
}
void time_d() {
  HOUR = time_doza / 3600;
  MIN = (time_doza / 60) % 60;
}

void check_alarm_signal()  // устанавливаем сигнал непрерывной тревоги, если "tr" ещё не установлен, а показания уже выше аварийного порога
{
	if (!tr) // если счёт превысил аварийный порог, но флаг "tr" ещё не установлен
		{
		alarm_sound = 1; // поднимаем флаг аварийного сигнала
		alarm_milis = millis(); // запоминаем время начала тревоги
		}  
}

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

Скетч проверяйте на работоспособность, мне не на чем (другой дисплей и другой код генерации накачки).

Тест выхода в тревогу из спящего режима.

bodriy2014, если я правильно понял, GND дисплея в режиме сна не отключается? Может стоит посадить её на общий, и освободить пин под другой функционал? Тогда можно будет и красный/синий дисплей в дефайны вынести. И ещё вопрос, treviga_2 в коде не используется?

diana221323
Offline
Зарегистрирован: 20.10.2016

tekagi спасибо , код поменял теперь синий дисплей 5110 работает корректно,

для усиления звука приделал к выходу бузера усилитель на pam8403 , используется 1 канал. питание на плату усилителя подается вместо светодиода.

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

 

diana221323
Offline
Зарегистрирован: 20.10.2016

для tekagi перерезал дорожку с выхода А3 , а 8 выход синего дисплея 5110 припаял перемычкой на GND pro mini. Работа Ардоса не изменилась. Поэтому наверное выход А3 можно использовать для других целей

diana221323
Offline
Зарегистрирован: 20.10.2016

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

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

Так в моём предыдущем посте весь код выложен. Развернуть спойлер, нажать на кнопку с двумя стрелочками в правом верхнем углу кода, откроется окно, откуда скетч целиком копируется по Ctrl+A   Ctrl+C прямо в Ардуино ИДЕ. Строки я подсветил для bodriy2014, чтобы были видны отличия от оригинального 1.4.3 - может чем-то в дальнейших версиях пригодятся.

Пока кинул на дропбокс.

ssbon
Offline
Зарегистрирован: 17.02.2015

Не подскажите, емкость С2 насколько критична (допустимый диапазон)?

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

По схеме из какого поста? В топике немало вариантов, нумерация элементов различается. В схеме на сайте автора С2 нет.

ssbon
Offline
Зарегистрирован: 17.02.2015

С17, С8 в цепи первичной обмотки

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

ssbon пишет:

С17, С8 в цепи первичной обмотки

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

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

Емкость несильно важна в пределах 10мкФ.

Joiner
Offline
Зарегистрирован: 04.09.2014

Попытался с ходу реализовать свой алгоритм измерения радиации, получилась полнейшая фигня. Или в скетче ошибки, или подход неправильный. Придется изучать подходы автора темы, брать их на вооружение. Сразу разобраться не удалось, посмотрел мельком..........., пока нет времени и знаний. Не понимаю что означают разные символы типа <1>>11 и что-то в этом роде......

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

Joiner, строки вроде:

  PORTC &= ~(1 << 3); //A3 дисплей GND
  PORTC  |= (1 << 2); //A2 дисплей Light

?

Это прямое управение пинами ардуины через регистры. Более быстродействующий (хоть и более сложный для понимания) вариант digitalWrite. Собственно к агоритму измерения отношения не имеют. Хотя подобные конструкции здесь используются и для работы с АЦП, поскольку analogRead в данном случае не совсем подходит.

Joiner
Offline
Зарегистрирован: 04.09.2014

tekagi пишет:

Joiner, строки.......

А можно в двух словах алгоритм измерения радиации по импульсам? Я попробовал по типу тахометра измерять время между импульсами, а потом усреднять в массиве (размер массива изменял чтобы посмотреть как влияет на результаты), получилась полнейшая фигня.  Самый "лучший" результат - посчитать кол-во импульсов за какой-то промежуток времени, а потом вычислить результат в микрорентгенах в час.

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

Увы, сам не настолько силён в кодинге. Знаю лишь, что используется алгоритм "скользящего окна". Но основан всё равно на подсчёте количества импульсов за период.

ssbon
Offline
Зарегистрирован: 17.02.2015

Спасибо! В начальных страницах фигурирует 100.0 uF

Joiner
Offline
Зарегистрирован: 04.09.2014

tekagi пишет:

Увы, сам не настолько силён в кодинге. Знаю лишь, что используется алгоритм "скользящего окна".......

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

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

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

Joiner пишет:

... По прерываниям определяется время между импульсами и на этой основе вычисляется частота, а из нее уровень радиации...

Как мне кажется, измерять время между импульсами не лучшая идея, уж слишком хаотично они идут, может каждые 2-3 секунды, а может и через 15 секунд пролететь пачка импульсов с минимальным интервалом и опять затишье.

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

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

Joiner
Offline
Зарегистрирован: 04.09.2014

Lazy_Dragon пишет:

Как мне кажется, измерять время между импульсами не лучшая идея..................

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

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

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

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

tekagi пишет:

Тоже столкнулся с подобной проблемой. Пока склоняюсь к мысли поставить полевик (по такой же схеме, как на фонарик) и пятивольтовый бузер со встроенным генератором, и в функции void signa () поменять ногодрыг на более медленный, и без цикла while.

В общем(Зацепила меня тема громкости бузера), в моем варианте, та же проблема была с громкостью бузера (Пьезокерамический излучатель), менять на генераторный не захотел и тот, что у меня был особой громкостью не отличался, и решил сделать, что то на том, что был и вот что с этого >>ВЫШЛО<<

diana221323
Offline
Зарегистрирован: 20.10.2016

Imasoft выложи скетч пожалуйста.

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

diana221323 пишет:
Imasoft выложи скетч пожалуйста.

Если, автор bodriy2014 не будет против я здесь выложу!

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

ImaSoft пишет:

diana221323 пишет:
Imasoft выложи скетч пожалуйста.

Если, автор bodriy2014 не будет против я здесь выложу!

Только ЗА, любые сообщения по данной теме приветствуются.

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

diana221323 пишет:
Imasoft выложи скетч пожалуйста.

Файлы проекта на Github: >>ТУТ<<