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

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

Joiner пишет:

Памятник Ленину    35

:)    Вот так.

Ух ты, это хоть в какой части планеты находится?

п.с. Наш бывший памятник еще не мерял!

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

:)

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

tekagi пишет:
Особое внимание советовал бы уделить установке транзистора преобразователя, он СМДшный, но напаян со стороны деталей на проводках.

Заказал IRLZ34N, так как IRMLM2502 могу купить только в Китае, а столько ждать ну его в баню. И так руки чешутся запустить скорее.

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

По хорошему туда лучше даже не irlml2502, а irlml6346. Меньше ёмкость затвора, выше скорость переключения. 2502 просто были в закромах :)

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

Мужики, ёмаё, а где вы брали резистор на 30М ? У меня 10М потолок.

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

1707 пишет:

Мужики, ёмаё, а где вы брали резистор на 30М ? У меня 10М потолок.

Так 3 последовательно соедененных 10м даст 30м...

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

И как их тут культурно впереть то:

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

Стоя над платой, буквой "П", как раз 3 резистора 10М вместо одного 30М станут. Всё равно дисплей и ардуинка минимум на сантиметр над основной платой на разъёмах приподняты. Можно вместо одного 30М поставить 10М, и два резистора по 3М3 заменить на 10М каждый. Можно даже использовать все десятимегаомные, не добавляя "навесных" - работать будет. Просто коэффициент делителя потом пересчитать, и поменять в скетче. Поскольку резисторы стоят последовательно, то необязательно менять именно отмеченный на рисунке, можно заменить любой в цепочке.

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

1707 пишет:

Мужики, ёмаё, а где вы брали резистор на 30М ? У меня 10М потолок.

Дык это... Существуют и 120МОм одним корпусом. Вот только поди купи его в глубинке... Про смд на 5 ГОм для вольтметра вообще молчу.

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

1707

Как у вас успехи с сборкой устройства?

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

ImaSoft пишет:
Как у вас успехи с сборкой устройства?

В среду прибудет 3 шт. IRLZ34N и 4 резистора на 15М, и продолжу сборку. Так же думал что имею в наличии резики на 10М (с Китая будут не скоро), а фиг нету, проедусь на рынок, может чудо члучится и они будут. Когда искал 2М то у них не было(

 

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

1707 пишет:

ImaSoft пишет:
Как у вас успехи с сборкой устройства?

Так же думал что имею в наличии резики на 10М (с Китая будут не скоро), а фиг нету

А вы не хотите сделать, как в моем варианте? 5м на 10к или... вот у вас будет 60м(15м+15м+15м+15м) и в нижнее плече поставите 100к и делитель получится 600, зачем вам такие гиганские гигаомы? 30м это ток дельта пси получается...

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

:)

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

На сколько я понял, это придется что то в прошивке править?

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

Одну строчку:

#define k_delitel 600 //коефициент делителя напряжения, зависит от вашего делителя.

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

 

UPD: Хотя нет, две строчки. Ещё надо будет рассчитать ADC для своего делителя.

#define  ADC 153  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)

 

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

tekagi пишет:

Одну строчку:

#define k_delitel 600 //коефициент делителя напряжения, зависит от вашего делителя.

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

 

UPD: Хотя нет, две строчки. Ещё надо будет рассчитать ADC для своего делителя.

#define  ADC 153  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)

 

В моем варианте с АКБ 1000мАч устройство работает спокойно беспрерывно работает трое суток!! При том что у меня делитель 5м на 10к, по поводу расчета ADC возмите с моего скетяа там он автоматически прощитывается при компмляции, то tekagi а обратили внимание что у варианта ТС ADC не соответствует расчетным? Зеаете из за чего это...

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

tekagi пишет:

Одну строчку:

#define k_delitel 600 //коефициент делителя напряжения, зависит от вашего делителя.

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

 

UPD: Хотя нет, две строчки. Ещё надо будет рассчитать ADC для своего делителя.

#define  ADC 153  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)

 

В моем варианте с АКБ 1000мАч устройство работает спокойно беспрерывно трое суток!! При том что у меня делитель 5м на 10к, по поводу расчета ADC возмите с моего скетча там он автоматически прощитывается при компмляции, то tekag,i а обратили внимание что у варианта ТС, ADC не соответствует расчетным? Знаете из за чего это, из за утечек входа АЦП и высокоомного делителя.

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

ImaSoft пишет:

.....а обратили внимание что у варианта ТС, ADC не соответствует расчетным? Знаете из за чего это, из за утечек входа АЦП и высокоомного делителя.

Привет.

У меня  промыт и просушен и покрыт лаком.

Не соответствует по другой причине.

 

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

Почему не соответствует? В моей версии при 140МОм рассчётный коэффициент 1400, подогнаный с помощью образцового вольтметра и оставленный в скетче 1395, ADC рассчётный 66, в скетче 67. В конструкции используется делитель с буферным конденсатором, а ацп уже меряет напряжение на нём (не непрерывно, естественно). Можно было бы и гигаом использовать, но тогда пришлось бы ставить буферный операционник, работающий с микротоками, что усложнило бы конструкцию и у многих отбило бы желание собирать.
А по поводу трёх дней от 1000мАч... Чую, придёт Шодан и будет ругаться :-D

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

tekagi пишет:
А по поводу трёх дней от 1000мАч... Чую, придёт Шодан и будет ругаться :-D

Насчет делителя я высказал свою версию и не более, имхо, по поводу ADC все у же подробности я не помню прошло у же практически 2 месяца, помню что что то там юыло не то..

Чую, придёт Шодан и будет ругаться 

Кто таков почему будет ругаться?

п.с.  Админу: Почему некоторые посты вываливает по 2 штуки?

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

tekagi пишет:
Почему не соответствует? В моей версии при 140МОм рассчётный коэффициент 1400, подогнаный с помощью образцового вольтметра и оставленный в скетче 1395, ADC рассчётный 66, в скетче 67. В конструкции используется делитель с буферным конденсатором, а ацп уже меряет напряжение на нём (не непрерывно, естественно). Можно было бы и гигаом использовать, но тогда пришлось бы ставить буферный операционник, работающий с микротоками, что усложнило бы конструкцию и у многих отбило бы желание собирать. А по поводу трёх дней от 1000мАч... Чую, придёт Шодан и будет ругаться :-D

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

Я цеплял ослик и игрался с частотой замеров смотрел что и как. Пульсации есть но особо на точность это не влияет, поэтому меня устроил такой вариант.

Если хорошо присмотреться пульсаций нет только в батарейка, так что жить можно.)))

 

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

bodriy2014 пишет:

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

В моем варианте при измерении осцилом не чего не просаживается... 400 держит как укопаный, пульсации +- 2,5в расчетные от делителя 1/500 .

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

ImaSoft пишет:

Кто таков почему будет ругаться?

Тыц. Появлялся в теме, помогал советами. Некоторые элементы ArDos'a заимствованы из его разработок.

Сколько у Вас преобразователь и дозиметр в целом потребляют?

bodriy2014, обновлений пока не предвидится?

bodriy2014 пишет:

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

Знаю, но с погрешностью плюс-минус лапоть придётся мириться)

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

ImaSoft

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

Хотел бы ещё узнать из каких условий выбирать нужный номинал?

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

Некритично. Этот резистор служит защитой от программной ошибки, плюс (вместе с электролитом/керамикой по питанию) фильтром импульсных помех обратно в схему. Можно и 30 поставить, меньше 6 нежелательно. Там, где 10-100к тоже некритично, это подтяжка затвора к земле от самопроизвольного открытия, пока работает загрузчик. Я 100к ставил.

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

ImaSoft пишет:

В моем варианте при измерении осцилом не чего не просаживается... 400 держит как укопаный, пульсации +- 2,5в расчетные от делителя 1/500 .

Я говорил о буферном для АЦП, а вы пишите о кондере на котором высокое.

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

tekagi пишет:

Сколько у Вас преобразователь и дозиметр в целом потребляют?

В активном состоянии когда 400в накачаны 30мА когда спит 25.7мА(можно еще уменьшить на 5мА убрав светик Power с платы pro mini) и если мне не изменяет память ардуинка кушает от 5в 19мА от лития думаю чуть меньше ну возьмем 15мА и того преобразователь кушает когда накачал 400в 10мА как-то так... при накачке ток может доходить до 100мА

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

tekagi пишет:
Почему не соответствует? В моей версии при 140МОм рассчётный коэффициент 1400, подогнаный с помощью образцового вольтметра и оставленный в скетче 1395, ADC рассчётный 66, в скетче 67.

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

За образец я взял 1,05, смотрим в схему, что мы видим, делитель 3.3м+3.3м+30м+30м+10м+10м+10м+10м+10м+10м=126600000(Ом)126.6(мОм) нижнее плече 220к рачет коэффициента: k_delitel=126600000/220000+1=576.4 округлили 576, в скетче 1.05 мы почему-то видим 440? и ADC 220? Вот это мне сразу и не понравилось...

Вот взять мой расчет!

#define k_delitel  507                                          //Коэффициент делителя напряжения, зависит от вашего делителя
#define U_Nakachki 402//В                                       //Напряжение накачки
#define ADC (byte)((((float)(255/opornoe))*U_Nakachki)/k_delitel)//Значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255) (255/opornoe)*(402/k_delitel)=183

k_delitel=5100000/10000+1=510 из за разброса номиналов принемаем ~507

Расчет ADC:  (255/opornoe)*(402/k_delitel)=183 и все соответствует

п.с. то bodriy2014, Может в вержнем плече не 126(мОм) а 96(мОм) (-10м -10м -10м)тогда все сходится?

Если верхнее плече 96600000/220000+1=440 напряжение начачки принемаем 417в то ADC: 220

 

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

ImaSoft пишет:

....

п.с. то bodriy2014, Может в вержнем плече не 126(мОм) а 96(мОм) (-10м -10м -10м)тогда все сходится?

Если верхнее плече 96600000/220000+1=440 напряжение начачки принемаем 417в то ADC: 220

Нужно отколупать промерить или прочитать, там все маской залил.

Отпишу и исправлю схему если так.

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

Между делом экспериментирую со своим дозиметром. Сегодня поднес его к такому шару....на долю секунды...

Дозиметр дико завизжал и выдал результат 7500 микрорентген/ч. Надеюсь это действие высокого напряжения, а не радиации :)

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

Joiner

Повезло что МК не издох и защитные диоды на входах выдержали.

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

bodriy2014 пишет:

Joiner

Повезло что МК не издох и защитные диоды на входах выдержали.

Это действительно так опасно?! Я что-то не подумал.....

Дозиметр сейчас рядом со мной, славаБогу работает, выдает 10 мкр/час. Больше не будук так делать :)

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

И так, мужики, по 30М вопрос решил, транзисторы получил. Но с 3.3М и 10М увы нет. Вопрос, у кореша есть СМД нужных мне номинвлов, я могу им "приделать ноги" и впаять? :) Руки чешутся доделать.

 

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

Сегодня наткнулся на ролик "Самодельный безопасный бета-источник" . Сходил в магазин, купил нужное. Проверил. Работает!

Мой дозиметр показал излучение от пакетика 70 микрорентген/час, как и у автора ролика. Теперь сделаю свой источник излучения. Думаю, пригодится для настройки и проверки своих изделий.

Вот ссылочка, кому интересно... https://www.youtube.com/watch?v=8E1s_IcfC-0

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

Joiner, тоже соединения калия пользую :) Пару страниц назад показывал. Ки искать неохота, СПД дома принципиально держать не хочется. А калийная селитра есть в любом магазине, занимающемся садом-огородом. Единственное замечание - если кто-то использует в конструкции счётчик в компенсационной свинцовой фольге, то дозиметр почти ничего не увидит.

1707, можно, только желательно под ними оставить небольшой зазор, чтобы можно было хорошо вымыть остатки флюса.

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

tekagi пишет:

Joiner, тоже соединения калия пользую :) Пару страниц назад показывал. ...................................

Ой, не заметил. 

Купил точно в такой же пачке, измерял голыми СБМ 20. Со временем попробую померить с какими-нибудь прокладками. Хочу посмотреть что бету остановит :)

Какой уровень ваш дозиметр показал на пакете?

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

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

UPD: Тот же пакет, что и в видео, толстая полиэтиленовая упаковка плюс тонкий пакетик. Значения, естественно, в условных микрорентгенах.

ArDos (1.4.3, дежурный режим)  ~ 63mR/h,

Припять со снятым фильтром ~ 92mR/h,

Припять с установленным бета-фильтром ~ 24mR/h (при фоне 17-22),

Ирис ЭЛСИС  21-23mR/h (при фоне 17-20).

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

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

tekagi пишет:

.......

Спасибо.

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

1707 пишет:

Вопрос, у кореша есть СМД нужных мне номинвлов, я могу им "приделать ноги" и впаять? :) Руки чешутся доделать.

Для станд.шага 2,54 хорошо обычная гребенка подходит. С одной стороны SMD, лапки в отверстия.

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

UPD2: Почему-то думал, что в ИРИСе стоит датчик в фольге. Разобрал - нет, просто укороченный СБМ20 без экрана. Положил на пакет с селитрой без задней пластиковой крышки - получил приблизительно 77 условных mR/h...   Получается, пластиковый корпус толщиной 1.7мм "съел" почти всю бету. Всё-таки в следующей версии АрДоса окошко с плёнкой для беты оставлю...

bwn, к сожалению у 1707 уже вытравлена печатка под дип-резисторы, стандартная гребёнка не станет. А за лайфхак спасибо )

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

tekagi пишет:

UPD2: Почему-то думал, что в ИРИСе стоит датчик в фольге. Разобрал - нет, просто укороченный СБМ20 без экрана. Положил на пакет с селитрой без задней пластиковой крышки - получил приблизительно 77 условных mR/h...   Получается, пластиковый корпус толщиной 1.7мм "съел" почти всю бету. Всё-таки в следующей версии АрДоса окошко с плёнкой для беты оставлю...

Вот чем мне селитра и понравилась, что бету излучает. Можно будет с экраном определиться для отсечения беты.

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

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

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

tekagi пишет:

ArDos (1.4.3, дежурный режим)  ~ 63mR/h,

Прошу прощения за влезание в дискуссию, но вот у меня каков вопрос, у вас не однократно проскакивала версия ArDos 1.4.3, из этого вытикиющий вопрос, где эта прошивка, я в природе видел <1.04->1.05->1.06 ->??? 

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

Упс, моя вина, нолик пропустил.  Bodriy2014 по мере написания кода скидывал мне новые версии для теста, по мере обнаружения ошибок вносились изменения. На авторском сайте, вероятнее всего, лежат уже стабильные версии (детально не сравнивал). То есть фактически это версия 1.04 после мелких доработок. Чтобы не путаться, я добавлял по 0.001 к версии, так они у меня и остались. Вот чейнжлог (то, что известно мне, может были ещё доработки) по сравнению с первоначальной версией 1.04:

//Оптимизация питания в режиме сна
//Исправлен баг с кнопкой <<
//Вынесен делитель #define k_delitel
//Добавлена горячая кнопка фонарика

В этой же версии bodriy2014 достиг потребления 9/1,5мА = работа/сон. У меня значения больше приблизительно на 10 мА, попутно выяснилось, что ардуинки на MLF атмегах потребляют в 4 раза больше, чем на TQFP (а я по незнанию влепил именно MLF, они подешевле были).

В версиях 1.05 и выше режим сна отключён.

 

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

tekagi пишет:

Упс... мере обнаружения ошибок вносились изменения.

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

1.05 Найдено не верное расположение "h" "m" времени накопленной дозы и сама доза сохранялась в память в 16 битном формате, а это максимальное время 2^16=65536 из этого максимальное время 65536/3600=18h 12m

Выдержки: 1.05

//-------------------------------------------------------------
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_wrD () { //запись настроек в память время накопления дозы
  byte higi = (time_doza & 0xFF000000) >> 24;
  byte high = (time_doza & 0x00FF0000) >> 16;
  byte hi =   (time_doza & 0x0000FF00) >> 8;
  byte low =  (time_doza & 0x000000FF);
  EEPROM.write(20, higi);
  EEPROM.write(21, high);
  EEPROM.write(22, hi);
  EEPROM.write(23, low);
  #ifdef Debug_Serial
  Serial.print("time_doza-");Serial.print(time_doza,HEX);Serial.print("; higi-");Serial.print(higi,HEX);Serial.print("; high-");Serial.print(high,HEX);Serial.print("; hi-");Serial.print(hi,HEX);Serial.print("; low-");Serial.print(low,HEX);Serial.print("; result-");Serial.println(((long)higi << 24) | ((long)high << 16) | ((long)hi << 8) | low,HEX);
  #endif
  hi = int(doz_v) >> 8;
  low = int(doz_v);
  EEPROM.write(24, hi);
  EEPROM.write(25, low);
}
//-------------------------------------------------------------
void eeprom_readD () { //чтание настроек из памяти время накопления дозы
  byte higi  = EEPROM.read(20);
  byte high  = EEPROM.read(21);
  byte hi  = EEPROM.read(22);
  byte low  = EEPROM.read(23);
  time_doza = ((long)higi << 24) | ((long)high << 16) | ((long)hi << 8) | low;
  #ifdef Debug_Serial
  Serial.print("time_doza-");Serial.print(time_doza,HEX);Serial.print("; higi-");Serial.print(higi,HEX);Serial.print("; high-");Serial.print(high,HEX);Serial.print("; hi-");Serial.print(hi,HEX);Serial.print("; low-");Serial.print(low,HEX);Serial.print("; result-");Serial.println(((long)higi << 24) | ((long)high << 16) | ((long)hi << 8) | low,HEX);
  #endif  
  hi  = EEPROM.read(24);
  low  = EEPROM.read(25);
  doz_v = (hi << 8) | low;
}
//-------------------------------------------------------------

В poisk_f() поменять:

//-------------------------------------------------------------
void poisk_f() {//режим поиска
...
...
...

      time_doza = time_doza + 1;

      if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
        eeprom_wrD ();
        doza_vr = doz_v;
      }
    }
  }
}
//-------------------------------------------------------------

На:

//-------------------------------------------------------------
void poisk_f() {//режим поиска
...
...
...

      if (time_doza < 3599940/*999h59m*/) {time_doza ++;}

      if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
        eeprom_wrD ();
        doza_vr = doz_v;
      }
    }
  }
}
//-------------------------------------------------------------

Далее lcd_poisk(): 1.05

void lcd_poisk() {//вывод на дисплей режима поиск
...
...
...

  time_d ();
  myGLCD.setFont(TinyFont);
  myGLCD.printNumI(HOUR, 0, 26);
  if (HOUR >= 9) {
    myGLCD.print("h", 13, 26);
  }
  if (HOUR < 9) {
    myGLCD.print("h", 5, 26);
  }
  myGLCD.printNumI(MIN, 18, 26);
  if (MIN >= 9) {
    myGLCD.print("m", 26, 26);
  }
  if (MIN < 9) {
    myGLCD.print("m", 23, 26);
  }
...
...
...
}
//-------------------------------------------------------------

Поменять на:

//--------------------------------------------------------------
void lcd_poisk() {//вывод на дисплей режима поиск
...
...
...
 time_d();
  myGLCD.setFont(TinyFont);
  myGLCD.printNumI(HOUR, 0, 26);
  if (HOUR < 9) {myGLCD.print("h", 4, 26);myGLCD.printNumI(MIN, 12, 26);
    if (MIN < 9) {myGLCD.print("m", 16, 26);}
    else {myGLCD.print("m", 20, 26);}
  }
  else {if ((HOUR > 9) && (HOUR < 99)) {myGLCD.print("h", 8, 26);myGLCD.printNumI(MIN, 16, 26);
          if (MIN < 9) {myGLCD.print("m", 20, 26);}
          else {myGLCD.print("m", 24, 26);}
        }
        else {myGLCD.print("h", 12, 26);myGLCD.printNumI(MIN, 20, 26);
              if (MIN < 9) {myGLCD.print("m", 24, 26);}
              else {myGLCD.print("m", 28, 26);}
             }
       }
...
...
...
}
//-------------------------------------------------------------

п.с. Вроде пока все...

 

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

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

За замечания спасибо, всё же хочется чтобы проект развивался.  У меня тоже лежит список хотелок/багов, но всё зависит от наличия времени и настроения у bodriy2014 )

ImaSoft пишет:

Ага, так все таки с багами боролись когда-то...

Не так давно (после выхода 1.06) автором был найден (и пофиксен) серьёзный косяк в работе с АЦП, из-за которого шла периодическая неконтролируемая перекачка высокого напряжения. Присутствовал и в прежних версиях, но в 1.05 и 1.06 проявился максимально.

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

tekagi пишет:

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

Вы имели ввиду это?

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

Третья строчка. Или я неправильно понял выводимые данные?

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

tekagi пишет:

 

ретья строчка. Или я неправильно понял выводимые данные?

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

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

tekagi пишет:

Не так давно (после выхода 1.06) автором был найден (и пофиксен) серьёзный косяк в работе с АЦП, из-за которого шла периодическая неконтролируемая перекачка высокого напряжения. Присутствовал и в прежних версиях, но в 1.05 и 1.06 проявился максимально.

Если можно код?

п.с. Чет я не замечал у себя такого.

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

Кстати в спомнил сейчас еще про один баг, это лишнее щелкание когда shet сбрасывается в 0

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

ImaSoft пишет:

Если можно код?

п.с. Чет я не замечал у себя такого.

1.062

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

//настройки /////////////начало
LCD5110 myGLCD(A1, A0, 12, 10, 11); //подключение дисплея
//LCD5110 myGLCD(12, 11, 10, A4, A5); //подключение дисплея
#define contrast 60 //контрастность дисплея
byte treviga_1 = 30; //первая ступень тревоги
byte treviga_2 = 60; //вторая ступень тревоги
byte ton_BUZZ = 70; //тональность буззера
#define  ADC 230  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)
#define k_delitel 420 //коефициент дельтеля напряжения, зависит от вашего делителя.
byte puls = 2; //тонкая настройка длинны импульса высоковольтного транса
byte scrin_GRAF = 1; //скорость построения графика в секундах
bool buzz_ON = 1;  //включить индикацию бузером (1)
bool podsvetka = 0; //подсветка
bool son_OK = 0; //разрешение или запрет сна
float opornoe = 1.10; //делить на opornoe/10
#define son_t 40 //время засыпания в секундах
#define save_DOZ 20 //как часто сохранять накопленную доху например каждые 20мкР
byte beta_time = 1; //время замера бета излучения
//настройки //////////////конец
//служебные переменные
extern uint8_t SmallFont[], MediumNumbers[], TinyFont[];
extern uint8_t logo_bat[], logo_rag[], logo_tr[], gif_chast_1[], gif_chast_2[];
volatile int shet = 0;
unsigned long t_milis = 0, gr_milis = 0, lcd_milis = 0, toch_milis = 0, timer_mil = 0;
unsigned long spNAK_milis = 0, time_doza = 0, bat_mill = 0;
int hv_adc, hv_400, shet_s = 0, fon = 0, shet_gr = 0, shet_n = 0;
int speed_nakT = 0, speed_nak = 0, time_sh_l = 0, MIN, HOUR, result;
int doza_vr = 0, val_dr_pr = 0, val_dr_OK = 0;
byte mass_p[84], mass_toch[201], m = 0, n_menu = 0, sys_menu = 0, mass_36[41];
byte val_kl = 0, val_ok = 0, menu = 0, zam_180p = 0, zam_36p = 0, gif_x = 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, stat_percent = 99.0;
bool tr = 0, poisk = 1, fonarik = 0, g_fl = 0, toch;
//-------------------------------------------------------------
void setup() {
  //Serial.begin(19200);
  ACSR |= 1 << ACD; //отключаем компаратор
  //ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  pinMode(3, INPUT_PULLUP); //кнопка
  pinMode(4, INPUT_PULLUP); //кнопка
  pinMode(7, INPUT_PULLUP); //кнопка
  DDRB |= (0 << 0); PORTB &= ~(1 << 0); //пин пустой 8
  DDRC |= (0 << 4); PORTC &= ~(1 << 4); //пин пустой А4
  DDRC |= (0 << 5); PORTC &= ~(1 << 5); //пин пустой А5
  DDRB |= (1 << 1);//пин фонаря
  DDRC |= (1 << 3);//A3 дисплей GND
  DDRC |= (1 << 2);//A2 дисплей Light
  PORTC &= ~(1 << 3); //A3 дисплей GND
  PORTC  |= (1 << 2); //A2 дисплей Light
  eeprom_readS ();
  eeprom_readD ();
  lcd_init();
  attachInterrupt(0, Schet, FALLING);//прерываниям пин 2
  DDRB |= (1 << 5); //пины на выход
  DDRD |= (1 << 5);
  DDRD |= (1 << 6);
  DDRD |= (1 << 6);//пин бузера
  nakachka();
}
//-------------------------------------------------------------
void loop() {
  if (menu == 0) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      _delay_ms(500);//антидребезг
      menu = 3;
      shet = 0; zam_180p = 0; fon = 0;
      stat_percent = 99.0;
      if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
        val_kl++;
        if (val_kl == 6) {
          val_kl = 0;
          fonarik = !fonarik;
        }
      }
    }
    if (!(PIND & (1 << PIND4))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      menu = 4;
      shet = 0;
      bet_z0 = 0;
      bet_z1 = 0;
      bet_r = 0;
      bet_z = 0;
      gotovo = 0;
      sek = 0;
      minute = 0;
      if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
        val_kl++;
        if (val_kl == 6) {
          val_kl = 0;
          fonarik = !fonarik;
        }
      }
    }
  }
  if (menu == 4) {
    if (!(PIND & (1 << PIND4))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      menu = 0;
      shet = 0;
      stat_percent = 99.0;
      if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
        val_kl++;
        if (val_kl == 6) {
          val_kl = 0;
          fonarik = !fonarik;
        }
      }
    }
  }
  if (fonarik == 0) { //фонарик
    PORTB &= ~(1 << 1);//пин фонаря
  } else if (fonarik == 1) {
    PORTB |= (1 << 1);//пин фонаря
  }
  if (podsvetka == 1) {
    PORTC &= ~(1 << 2); //A2 дисплей Light
  }
  if (podsvetka == 0) {
    PORTC |= (1 << 2); //A2 дисплей Light
  }
  if (millis() - lcd_milis >= 300) { //скорость отрисоаки дисплея
    lcd_milis = millis();
    if (menu == 0) {
      lcd_poisk();//вывод на дисплей режима поиск
      poisk_f();
    }
    if (menu == 1) {
      lcd_menu();//вывод на дисплей меню
    }
    if (menu == 2) {
      lcd_sys();//вывод на дисплей системного меню
    }
    if (menu == 3) {
      zamer_200s();//вывод на дисплей замер 180сек
    }
    if (menu == 4) {
      zamer_beta();
    }
  }
  generator();//накачка по обратной связи с АЦП
  if (shet_s != shet) {
    signa ();//подача сигнала о частичке
  }
  if (!(PIND & (1 << PIND3))) { //нажатие ок
    _delay_ms(500);//антидребезг
    OK();
  }
  if (menu == 1) {
    if (!(PIND & (1 << PIND4))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      if (n_menu == 0) {
        treviga_1++;
      }
      if (n_menu == 1) {
        treviga_2++;
      }
      if (n_menu == 2) {
        podsvetka = !podsvetka;
      }
      if (n_menu == 3) {
        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))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      if (sys_menu == 0) {
        opornoe = opornoe + 0.01;
        if (opornoe < 0.98) {
          opornoe = 1.20;
        }
        if (opornoe > 1.20) {
          opornoe = 0.98;
        }
      }
      if (sys_menu == 1) {
        puls++;
        if (puls < 1) {
          puls = 200;
        }
        if (puls > 200) {
          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 (sys_menu == 5) {
        beta_time++;
      }
    }
  }
  if (menu == 1) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      _delay_ms(500);//антидребезг
      if (n_menu == 0) {
        treviga_1--;
      }
      if (n_menu == 1) {
        treviga_2--;
      }
      if (n_menu == 2) {
        podsvetka = !podsvetka;
      }
      if (n_menu == 3) {
        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))) { //нажатие <<<
      _delay_ms(500);//антидребезг
      if (sys_menu == 0) {
        opornoe = opornoe - 0.01;
        if (opornoe < 0.98) {
          opornoe = 1.20;
        }
        if (opornoe > 1.20) {
          opornoe = 0.98;
        }
      }
      if (sys_menu == 1) {
        puls--;
        if (puls < 1) {
          puls = 200;
        }
        if (puls > 200) {
          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 (sys_menu == 5) {
        beta_time--;
      }
    }
  }
}
//-------------------------------------------------------------
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 > 5) {
      sys_menu = 0;
    }
  }
  if (menu == 1) {
    n_menu++;
    if (n_menu > 7) {
      n_menu = 0;
    }
  }
  if (menu == 0) {
    menu = 1;
  }
  if (menu == 3) {
    menu = 1;
  }
}
//--------------------------------------------------------------
void gif_nabor() {
  myGLCD.drawLine(0, 24, 84, 24); myGLCD.drawLine(0, 38, 84, 38);
  for (int i = 83 - zam_180p * 0.47; i < 84; i++) {
    myGLCD.drawLine(i, 24, i, 38);
  }
  g_fl = !g_fl;
  if (g_fl == 0) {
    myGLCD.drawBitmap(gif_x, 27, gif_chast_1, 8, 8);
  } else {
    myGLCD.drawBitmap(gif_x, 27, gif_chast_2, 8, 8);
  }
  if (zam_180p < 200) {
    gif_x = gif_x + 1;
    if (gif_x >= 83 - zam_180p * 0.47) {
      gif_x = 0;
    }
    myGLCD.print("ANALIZ", CENTER, 40);
  }

  if (zam_180p >= 200) {
    myGLCD.print("OBNOVLENIE", CENTER, 40);
  }
}
//--------------------------------------------------------------
void zamer_200s() {
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("%", 20, 0); myGLCD.printNumF(stat_percent, 1, 26, 0);
  myGLCD.setFont(MediumNumbers);
  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);
  gif_nabor();
  battery();
  myGLCD.update();
  if (millis() - toch_milis >= 1000) {
    toch_milis = millis();
    for (int i = 0; i < 200; i++) { //сдвигаем
      mass_toch[i] = mass_toch[i + 1];
    }
    mass_toch[199] = shet;
    shet = 0;
    if (zam_180p < 200) { //первый набор массива
      zam_180p++;
      int fon_vr1 = 0;
      for (int i = 200 - zam_180p; i < 200; i++) {
        fon_vr1 = fon_vr1 + mass_toch[i];
      }
      fon = fon_vr1 * (40.0 / zam_180p);
    }
    if (zam_180p >= 200) { //набор массива
      int fon_vr1 = 0;
      for (int i = 0; i < 200; i++) {
        fon_vr1 = fon_vr1 + mass_toch[i];
      }
      fon = fon_vr1 / 5;
    }
    if (zam_180p <= 36) {
      stat_percent = stat_percent - 2.0;
    }
    if (zam_180p > 36 && zam_180p <= 72) {
      stat_percent = stat_percent - 0.3;
    }
    if (zam_180p > 72 && zam_180p <= 100) {
      stat_percent = stat_percent - 0.2;
    }
    if (zam_180p > 100 && zam_180p <= 200) {
      stat_percent = stat_percent - 0.1;
    }
    if (stat_percent < 5) {
      stat_percent = 5.0;
    }
  }
  if (!(PIND & (1 << PIND7))) { //нажатие <<<
    _delay_ms(500);//антидребезг
    menu = 0;
    shet = 0; fon = 0; zam_36p = 0;
    for (int i = 0; i < 18; i++) { //чистим
      mass_36[i] = 0;
    }
    if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
      val_kl++;
      if (val_kl == 6) {
        val_kl = 0;
        fonarik = !fonarik;
      }
    }
  }
}
//--------------------------------------------------------------
void lcd_poisk() {//вывод на дисплей режима поиск
  if (shet < treviga_1 && fon < treviga_1) {//проверяем тревогу
    tr = 0;
  }
  if (shet > treviga_1 || fon > treviga_1) {//проверяем тревогу
    tr = 1;
  }
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  if (tr == 1) { //опасно
    myGLCD.drawBitmap(0, 0, logo_tr, 24, 8);
  }
  myGLCD.print("%", 20, 0); myGLCD.printNumF(100 - (zam_36p * 2.0), 1, 26, 0);
  myGLCD.setFont(MediumNumbers);
  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", 13, 26);
  }
  if (HOUR < 9) {
    myGLCD.print("h", 5, 26);
  }
  myGLCD.printNumI(MIN, 18, 26);
  if (MIN >= 9) {
    myGLCD.print("m", 26, 26);
  }
  if (MIN < 9) {
    myGLCD.print("m", 23, 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);//верхняя
  battery();
  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("------", 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("BETA", 0, 30); myGLCD.printNumI(beta_time, CENTER, 30); myGLCD.print("MIN", RIGHT, 30);
  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 zamer_beta() {// замер бета или продуктов
  if (gotovo == 0) {
    if (!(PIND & (1 << PIND3))) { //нажатие OK
      gotovo = 1;
    }
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("Zamer ", 20, 10); myGLCD.printNumI(bet_z, 55, 10);
    myGLCD.print("nagmi OK", CENTER, 20);
    myGLCD.update();
  }
  if (gotovo == 1) {
    timer_soft();
    byte otsup = 0;
    if (minute > 9) {
      otsup = 5;
    }
    myGLCD.clrScr();
    battery();
    myGLCD.setFont(TinyFont);
    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("time", 23 + otsup, 0);
    myGLCD.drawLine(0, 8, 83, 8);
    myGLCD.setFont(SmallFont);
    myGLCD.drawLine(40, 8, 40, 28);
    myGLCD.print("Zamer0", LEFT, 10); myGLCD.print("Zamer1", 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("Idet zamer", CENTER, 30); myGLCD.printNumI(bet_z, RIGHT, 30);
      myGLCD.printNumI(bet_r, CENTER, 38);
    }
    if (bet_z == 2) {
      myGLCD.print("Rezultat", CENTER, 30);
      myGLCD.printNumI(bet_r, CENTER, 38); myGLCD.print("mkR/h", 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;
      }
    }
    if (bet_z == 1) { //второй замер
      bet_z1 = bet_z1 + shet;
      shet = 0;
      if (minute >= beta_time) {
        bet_z = 2;
        sek = 0;
        minute = 0;
      }
    }
    if (bet_z == 2) { //результат
      bet_r = bet_z1 - bet_z0;
      bet_r = bet_r / (1.5 * beta_time);
    }
  }
  if (!(PIND & (1 << PIND4))) { //нажатие >>>
    _delay_ms(500);//антидребезг
    menu = 0;
    shet = 0; fon = 0; zam_36p = 0;
    for (int i = 0; i < 18; i++) { //чистим
      mass_36[i] = 0;
    }
  }
}
//-------------------------------------------------------------
void poisk_f() {//режим поиска
  if (poisk == 1) {
    if (millis() - gr_milis >= scrin_GRAF * 1000) { //счет для графика
      gr_milis = millis();
      val_ok = 0;//сброс удержания системного меню
      shet_gr = shet - shet_n;
      if (shet_gr < 0) {
        shet_gr = 1;
      }
      mass_p[m] = shet_gr ;
      shet_n = shet;
      if (m < 82) {
        m++;
      }
      if (m == 82) {
        for (int i = 0; i < 83; i++) {
          mass_p[i] = mass_p[i + 1];
        }
        mass_p[82] = shet_gr;
      }
    }
    if (millis() - toch_milis >= 1000) {
      toch_milis = millis();
      for (int i = 0; i < 40; i++) { //сдвигаем
        mass_36[i] = mass_36[i + 1];
      }
      mass_36[40] = shet;
      if (zam_36p < 40) { //первый набор массива
        zam_36p++;
        fon = fon + shet;
      }
      if (zam_36p >= 40) { //набор массива
        int fon_vr1 = 0;
        for (int i = 0; i < 40; i++) {
          fon_vr1 = fon_vr1 + mass_36[i];
        }
        fon = fon_vr1;
      }
      shet = 0;
      doz_v = doz_v + fon / 100.0 / 40.0;
      time_doza = time_doza + 1;
      if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
        eeprom_wrD ();
        doza_vr = doz_v;
      }
    }
  }
}
//-------------------------------------------------------------
void signa () { //индикация каждой частички звуком светом
  shet_s = shet;
  if (buzz_ON == 1) {//включаем бузер
    PORTB |= (1 << 5); //светодиод
    int d = 30;
    while (d > 0) {
      PORTD |= (1 << 6);
      _delay_us(ton_BUZZ);
      PORTD &= ~(1 << 6);
      _delay_us(ton_BUZZ);
      d--;
    }
    PORTB &= ~(1 << 5);//светодиод
  }
  //generator();//накачка по обратной связи с АЦП
}
//-------------------------------------------------------------
void Schet() { //прерывание от счетчика на пин 2
  shet++;
}
//-------------------------------------------------------------
void generator() {//накачка по обратной связи с АЦП
  hv_adc  = Read_HV();
  if (hv_adc < ADC) { //Значение АЦП при котором на выходе 400В
    int c = puls;
    PORTD |= (1 << 5); //пин накачки
    while (c > 0) {
      asm("nop");
      c--;
    }
    PORTD &= ~(1 << 5);//пин накачки
    speed_nakT++;
  }
}
//-------------------------------------------------------------
byte Read_HV () {
  ADCSRA = 0b11100111;
  ADMUX = 0b11100110;//выбор внутреннего опорного 1,1В и А6
  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(TinyFont);
  myGLCD.printNumF(VCC, 2, 63, 2);
}
//-------------------------------------------------------------
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(SmallFont);
  myGLCD.print("Arduino+", CENTER, 32);
  myGLCD.print("Dosimetr v1.06", 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, 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);
  EEPROM.write(13, beta_time);
  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);
    beta_time = EEPROM.read(13);
  }
  _delay_ms(10);
}
//-------------------------------------------------------------
void nakachka() {//первая накачка
  byte n = 0;
  while (n < 30) {
    PORTD |= (1 << 5);//дергаем пин
    int c = puls;
    while (c > 0) {
      asm("nop");
      c--;
    }
    PORTD &= ~(1 << 5);//дергаем пин
    n++;
    _delay_us(100);
  }
}
//-------------------------------------------------------------
void speed_nakachka () { //скорость накачки имлульсы/сек
  if (millis() - spNAK_milis >= 1000) {
    spNAK_milis = millis();
    speed_nak = speed_nakT;
    speed_nakT = 0;
  }
}
//-------------------------------------------------------------
void time_d() {
  HOUR = time_doza / 3600;
  MIN = (time_doza / 60) % 60;
}
//-------------------------------------------------------------
void timer_soft() {
  if (millis() - timer_mil >= 1000) {
    timer_mil = millis();
    sek++;
    toch = !toch;
    if (sek > 60) {
      sek = 0;
      minute++;
    }
  }
}

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

До багфикса:

После багфикса:

Вверху накачка, внизу высокое.