Время счёта может варьироваться в небольших пределах (в зависимости от характеристик конкретного экземпляра датчика, толщины и материала корпуса дозиметра и/или компенсирующего экрана счётчика). Для того же СБМ-20 в разных конструкциях применяли от 34 до 42 секунд.
ImaSoft пишет:
Не кто не подскажет какой допустимый фон может быть от мрамора?
8мкРн/час это опасно или нет?
Это естественный фон. Мрамор не радиоактивен, а вот гранит вполне может светить условно под сотню микрорентген (если мерять гамму вместе с бетой).
Поэтому в радиометрах для обнаружения беты используется съёмная крышка (совмещённая с металлическим экраном). Для предотвращения загрязнения датчика под крышкой приклеивается тонкая плёнка, можно взять прозрачную с сигаретной пачки. Для слюдников, правда, такая защита не подойдёт (снизит чувствительность).
Опыты показывают, что практически монопенесуально.
Мягкую бету от Ni-63 сбм-ка практически не чувствует. Там долампочки есть корпус, или его нет.
А жетская бета от Sr/Y-90 легко прошивает классический пластик 1-2мм. Конечно с ослабленем некоторым, но сделал вывод, что для стронция-иттрия ненадо окна резать, оно и так шъет неплохо.
Так-что если у вас-товарищи не слюда, не режте окон, всеравно плотность потока вам нечем измерять.
Почти ползком продвигаюсь к своей цели :), но иду своим путем. Отличие от авторского проекта - преобразователь на 400 вольт на mc34063, и в приборе будут установлены 2 счетчика. Почти собрал экспериментальную установку, приделал плату защиты-зарядки литиевого аккумулятора, преобразователь, два счетчика и плату съема импульсов. Плату съема импульсов тоже слелал по-своему, без конденсаторов. Работает, вроде нормально. Выдает такой сигнал
Остается присабачить ардуинку с монитором и придумать как считать импульсы с двух счетчиков.
Запустил свой макет, присоединил ардуинку, пока без дисплея. Результат выводил через сериал. Счетчики ставил для испытаний парами (у меня два домика для счетчиков). Самих счетчиков 8 штук. Они находились в неисправных бытовых дозиметрах заводского производства, по 4 штуки в каждом. Пока разобрал один. Счетчики в них обмотаны свинцовой фольгой. 2 раздел, два оставил в фольге. Ставил по очереди пару раздетую (пронумеровал 1 и 2), затем пару одетую (3 и 4). Ставил их на подсчет импульсов за 30 минут. Вот результат:
Сч1 - 406 имп.
Сч2 - 461 имп.
Сч3 - 464 имп.
Сч4 - 469 имп.
Знатоки, какой можно сделать вывод?
Потом поэксперементирую еще, постараюсь узнать, зачем счетчики обмотали фольгой, и почему один из раздетых счетчиков выдал гораздо меньше импульсов?
Спасибо. По поводу поменять местами, приходила такая мысль. Но, вроде, условия в обоих местах одинаковые. Плюс (+) на оба счетчика подается с одного провода преобразователя, минусы счетчиков идут каждый на свой каскад съема импульса, т.е., каждый минус присоединен к своему резистору с которых снимается напряжение опять же с каждого своим каскадом на транзисторе. Эти абсолютно независимые сигналы с двух счетчиков запускают прерывания 0 и 1, которые вызывают функции подсчета импульсов на каждом из счетчиков. Завтра нарисую схемку и покажу фотку своей установки (если успею дисплейчик прикрутить).
Плюс (+) на оба счетчика подается с одного провода преобразователя, минусы счетчиков идут каждый на свой каскад съема импульса, т.е., каждый минус присоединен к своему резистору с которых снимается напряжение опять же с каждого своим каскадом на транзисторе.
Лучше в анод каждого счётчика поставить свой высокоомный резистор. В ином случае при сработке одного счётчика падает напряжение на втором, и он в этот момент неспособен зарегистрировать частицу. Так теряется смысл в раздельных каналах снятия импульса для каждого счётчика.
Лучше в анод каждого счётчика поставить свой высокоомный резистор.........
Согласен. Спасибо за подсказку, тем более, что добавить один резистор нет ни какой проблемы. Завтра добавлю.
Вот только насчет прерываний....Наверное какие-то импульсы все же будут теряться, ведь два прерывания не смогут сработать одновременно..но и одновременных импульсов, надеюсь, тоже немного.
счет прерываний....Наверное какие-то импульсы все же будут теряться, ведь два прерывания не смогут сработать одновременно..но и одновременных импульсов, надеюсь, тоже немного.
Если на разных INT-0 и INT-1, то смогут, если обработчик прерывания выполняет сейчас какое то действие и в этот момент срабатывает прерывание скажем INT-1 то будет вставлен флажок прерывания и ано сработает когда закончит выполнятся программа прерывания INT-0...
Если на разных INT-0 и INT-1, то смогут, если обработчик прерывания выполняет сейчас какое то действие и в этот момент срабатывает прерывание скажем INT-1 то будет вставлен флажок прерывания и ано сработает когда закончит выполнятся программа прерывания INT-0...
Спасибо. Это радует. Значит импульсы не потерям.
P.S. Снимаю импульсы по такой схеме. Их к ардуинке подключено две. Одна к пину2 (int0), вторая к пину 3(int1)
Сначала попробовал по схеме bodriy2014_го. Осциллограф показал импульс на резисторе больше 10 вольт, т.е. на базу транзистора поступало более 10 вольт, и сигнал на выходе получался с большими помехами. Сделал делитель, чтобы уменьшить напряжение, поступающее на базу. После этого импульс стал чистеньким, без помех, как на осциллограме из #508.
P.S. Снимаю импульсы по такой схеме. Их к ардуинке подключено две. Одна к пину2 (int0), вторая к пину 3(int1)
Сначала попробовал по схеме bodriy2014_го. Осциллограф показал импульс на резисторе больше 10 вольт, т.е. на базу транзистора поступало более 10 вольт, и сигнал на выходе получался с большими помехами. Сделал делитель, чтобы уменьшить напряжение, поступающее на базу. После этого импульс стал чистеньким, без помех, как на осциллограме из #508.
Что то я не заметил чем эта схема отличается от схемы Ардоса, номиналами?
Что то я не заметил чем эта схема отличается от схемы Ардоса, номиналами?
Ардос я взял за основу и продвигаюсь по теме, начиная с первого сообщения. Но пробую внести какие-то изменения, просто...как мне хочется попробовать. И некоторые отличия, все таки есть. У меня преобразователь работает без ардуинки, транзистор не кт315, а буржуйский 2N2222 :), и между базой и землей транзистора установлен резистор не 470 ком, а 3.3 ком, по моим подсчетам на нем импульс всего 0.12 вольта.
Не подумайте, что я хочу доказать что лучше, что хуже....просто пробую немного другие варианты. Так интереснее, чем просто повторить готовый проект. А готовый проект просто является хорошим фундаментом, на что можно надежно опереться.
Вот уже вторую неделю пытаюсь оживить аналогичное устройство, но пока безрезультатно. Ардуинщик я начинающий, поэтому все дается не быстро. Собрано аналогичное устройство, целью которого будет измерение дозы, с выдачей результатов в COM порт. Из схемы исключены кнопки, индикатор, вибро и фонарик. Не поможете со скетчем? Мои попытки адаптировать Ваш скетч не привели к желаемому результату. Обкатываю на Arduino Nano V3.0 ATmega328 CH340. Не удалось даже запустить генератор 400V.
Вот уже вторую неделю пытаюсь оживить аналогичное устройство, но пока безрезультатно. Ардуинщик я начинающий, поэтому все дается не быстро. Собрано аналогичное устройство, целью которого будет измерение дозы, с выдачей результатов в COM порт. Из схемы исключены кнопки, индикатор, вибро и фонарик. Не поможете со скетчем? Мои попытки адаптировать Ваш скетч не привели к желаемому результату. Обкатываю на Arduino Nano V3.0 ATmega328 CH340. Не удалось даже запустить генератор 400V.
Привет.
Зачем вы все убираете лишнее, это ненужная работа.
Вы просто в Сетап раскоментируйте строку
//Serial.begin(19200);
И дальше выводите нужный вам параметр в ком порт
Serial.println(fon);
Займет всего минуту времени такая переделка.
Остальное пусть крутится, оно кушать не просит, подтяните свои знания в будущем подчистите или напишите свое.
Вчера, наконец, собрал макет для дозиметра. Решил сначала на макете все отладить, а потом уже делать на печатке и в корпусе. Макет получился монстроидальный и под лозунгом - сделано через Ж... Но работает, надеюсь, что правильно. А почему через Ж..., потому что блоки устройства расположил по самому наихудшему варианту. Например, высоковольтный преобразователь расположил на противоположном от источника питания и счетчиков конце доски. Это надо же было так придумать! Вот оно
Сегодня залил скетчик, который подсчитывает импульсы каждого счетчика за 10 минут. После 10-ти минут все останавливается и начинает орать, я записываю показания и процедуру повторяю несколько раз. Потом меняю местами счетчики и процедуру повторяю.
Сегодня поизмерял фон в своей квартире. Так как нормального скетча еще не написал, измерял по количеству импульсов за 10 минут, с последующим ручным переводом в микрорентгены/час. По всей квартире фон составил примерно 10-12 мкр/ч, а в ванной комнате аж 20 мкр/ч !!! Видимо плитка немного фонит. Как понимаю 20 мкр/ч это верхний предел безопасного фона.
Собрал я Ардос на смд элементах- версия 1.04 –заработала сразу без настройки.
Спасибо автору.
Только с печаткой намучался. Сразу не разбирался и плату из архива распечатал и Ардуинку на 8Мгц, 3,3в пришлось прилепить вверх ногами, вернее вниз элементами, и транзисторы пришлось поставить вверх ногами, а так все замечательно, но это мелочи. Делитель получился 120МОм/200Ком=600.
Прошу помощи.
1)Использую синий дисплей 5110 вместо красного.
Работает нормально, только не знаю что можно изменить в скетче чтоб при засыпании не включалась подсветка.
2) И еще столкнулся с проблемкой: вот идешь случайно мимо возле источника излучения Ардос в кармане лежит выходит из режима сна и там тихонечко начинает попискивать и нифига не слышно. Что можно изменить в скетче чтоб этот бузер (или лучше еще один громкий бузер добавить)при срабатывании тревоги действительно громко запищал какую нибудь громкую мелодию хотя бы секунд 30 чтоб успеть среагировать на угрозу,
3)и еще хочется вибромоторчик куда нибудь подцепить вместо фонарика чтоб при тревоге в очень шумных местах понять что ты начал облучаться.
Нумерация взята из скетча 1.04 с сайта автора. Перепаивать другой дисплей для теста не хочется, отпишитесь, если получится.
diana221323 пишет:
2) Что можно изменить в скетче чтоб этот бузер ... при срабатывании тревоги действительно громко запищал какую нибудь громкую мелодию хотя бы секунд 30 чтоб успеть среагировать на угрозу.
Тоже столкнулся с подобной проблемой. Пока склоняюсь к мысли поставить полевик (по такой же схеме, как на фонарик) и пятивольтовый бузер со встроенным генератором, и в функции void signa () поменять ногодрыг на более медленный, и без цикла while.
bodriy2014, если я правильно понял, GND дисплея в режиме сна не отключается? Может стоит посадить её на общий, и освободить пин под другой функционал? Тогда можно будет и красный/синий дисплей в дефайны вынести. И ещё вопрос, treviga_2 в коде не используется?
tekagi спасибо , код поменял теперь синий дисплей 5110 работает корректно,
для усиления звука приделал к выходу бузера усилитель на pam8403 , используется 1 канал. питание на плату усилителя подается вместо светодиода.
при выходе и сна слышны щелчки на 100 м вокруг, аж подпрыгиваешь от неожиданности, все думают что у тебя в кармане петарды взрываются. Надо чего то доработать програмно.
для tekagi перерезал дорожку с выхода А3 , а 8 выход синего дисплея 5110 припаял перемычкой на GND pro mini. Работа Ардоса не изменилась. Поэтому наверное выход А3 можно использовать для других целей
Так в моём предыдущем посте весь код выложен. Развернуть спойлер, нажать на кнопку с двумя стрелочками в правом верхнем углу кода, откроется окно, откуда скетч целиком копируется по Ctrl+A Ctrl+C прямо в Ардуино ИДЕ. Строки я подсветил для bodriy2014, чтобы были видны отличия от оригинального 1.4.3 - может чем-то в дальнейших версиях пригодятся.
Эти кондеры должны обладать очень низким ESR, поэтому рекомендую туда ставить или параллельно несколько керамических или тантал. Электролит один у меня стоял долго не выдержал, пробил.
Если совсем нет керамики или тантала такой емкости, тогда один электролит и параллельно керамики 2штуки чтоб его шунтировать и разгрузить.
Попытался с ходу реализовать свой алгоритм измерения радиации, получилась полнейшая фигня. Или в скетче ошибки, или подход неправильный. Придется изучать подходы автора темы, брать их на вооружение. Сразу разобраться не удалось, посмотрел мельком..........., пока нет времени и знаний. Не понимаю что означают разные символы типа <1>>11 и что-то в этом роде......
Это прямое управение пинами ардуины через регистры. Более быстродействующий (хоть и более сложный для понимания) вариант digitalWrite. Собственно к агоритму измерения отношения не имеют. Хотя подобные конструкции здесь используются и для работы с АЦП, поскольку analogRead в данном случае не совсем подходит.
А можно в двух словах алгоритм измерения радиации по импульсам? Я попробовал по типу тахометра измерять время между импульсами, а потом усреднять в массиве (размер массива изменял чтобы посмотреть как влияет на результаты), получилась полнейшая фигня. Самый "лучший" результат - посчитать кол-во импульсов за какой-то промежуток времени, а потом вычислить результат в микрорентгенах в час.
Увы, сам не настолько силён в кодинге. Знаю лишь, что используется алгоритм "скользящего окна". Но основан всё равно на подсчёте количества импульсов за период.
Увы, сам не настолько силён в кодинге. Знаю лишь, что используется алгоритм "скользящего окна".......
А я сделал массив, размер которого для экспериментов можно менять. По прерываниям определяется время между импульсами и на этой основе вычисляется частота, а из нее уровень радиации. Полученные значения значения, по мере поступления заносятся в массив начиная с первой ячейки. По достижении последней, начинает снова с первой. Это делается в обработчике прерываний. А программа, между делом, вычисляет среднее значение по массиву и один раз в пол_секунды выводит значение на экран.
По теории должно работать, но, видимо, что-то напутал. Должно быть так - маленький массив - быстрая реакция, маленькая точность, а большой массив - все наоборот. Но у меня что-то значения сильно прыгают. :(
... По прерываниям определяется время между импульсами и на этой основе вычисляется частота, а из нее уровень радиации...
Как мне кажется, измерять время между импульсами не лучшая идея, уж слишком хаотично они идут, может каждые 2-3 секунды, а может и через 15 секунд пролететь пачка импульсов с минимальным интервалом и опять затишье.
У автора принцип более логичный (измерение кол-ва импульсов за определенный период), который, я думаю, в той или иной мере используют и многие другие дозиметры.
Кстати исполнять в прерывании много кода, как я помню, не лучшая идея, хотя могу и ошибаться (я тоже в кодописании не более чем начальный тыкатель)
Как мне кажется, измерять время между импульсами не лучшая идея..................
У автора принцип более логичный (измерение кол-ва импульсов за определенный период), который, я думаю, в той или иной мере используют и многие другие дозиметры.
Кстати исполнять в прерывании много кода, как я помню, не лучшая идея, хотя могу и ошибаться (я тоже в кодописании не более чем начальный тыкатель)
Согласен. Наверное по этому у меня получается полная ерунда даже с большим массивом. Буду учиться дальше .... Попробую запустить скетч автора на своем макете. Будет интересно посмотреть как это работает.
Тоже столкнулся с подобной проблемой. Пока склоняюсь к мысли поставить полевик (по такой же схеме, как на фонарик) и пятивольтовый бузер со встроенным генератором, и в функции void signa () поменять ногодрыг на более медленный, и без цикла while.
В общем(Зацепила меня тема громкости бузера), в моем варианте, та же проблема была с громкостью бузера (Пьезокерамический излучатель), менять на генераторный не захотел и тот, что у меня был особой громкостью не отличался, и решил сделать, что то на том, что был и вот что с этого >>ВЫШЛО<<
п.с. Если не секрет, откуда данные про время?
http://forum.rhbz.org/topic.php?forum=80&topic=49&postid=1442631884#1442631884
Время счёта может варьироваться в небольших пределах (в зависимости от характеристик конкретного экземпляра датчика, толщины и материала корпуса дозиметра и/или компенсирующего экрана счётчика). Для того же СБМ-20 в разных конструкциях применяли от 34 до 42 секунд.
Не кто не подскажет какой допустимый фон может быть от мрамора?
8мкРн/час это опасно или нет?
Это естественный фон. Мрамор не радиоактивен, а вот гранит вполне может светить условно под сотню микрорентген (если мерять гамму вместе с бетой).
можно сразу под два варианта ПП (dip и smd детали), уменя как раз дисплей Красный 5110
В архивах с скетчем лежат печатки, те что я использовал.
http://srukami.inf.ua/ardos.html
Спасибо!!!
(если мерять гамму вместе с бетой).
Еще вопрос, пластик задерживает бето излучение?
Да. (Зависит от толщины). http://www.water.ru/bz/param/radiology-common_beta.php
Поэтому в радиометрах для обнаружения беты используется съёмная крышка (совмещённая с металлическим экраном). Для предотвращения загрязнения датчика под крышкой приклеивается тонкая плёнка, можно взять прозрачную с сигаретной пачки. Для слюдников, правда, такая защита не подойдёт (снизит чувствительность).
Опыты показывают, что практически монопенесуально.
Мягкую бету от Ni-63 сбм-ка практически не чувствует. Там долампочки есть корпус, или его нет.
А жетская бета от Sr/Y-90 легко прошивает классический пластик 1-2мм. Конечно с ослабленем некоторым, но сделал вывод, что для стронция-иттрия ненадо окна резать, оно и так шъет неплохо.
Так-что если у вас-товарищи не слюда, не режте окон, всеравно плотность потока вам нечем измерять.
Доброй ночи. Посоветуйте про быстрый диод, ямогу вместо UF4007 поставить HER208?
[quote=1707]
Доброй ночи. Посоветуйте про быстрый диод, ямогу вместо UF4007 поставить HER208?
[/quote
Пойдут в полне...]
Почти ползком продвигаюсь к своей цели :), но иду своим путем. Отличие от авторского проекта - преобразователь на 400 вольт на mc34063, и в приборе будут установлены 2 счетчика. Почти собрал экспериментальную установку, приделал плату защиты-зарядки литиевого аккумулятора, преобразователь, два счетчика и плату съема импульсов. Плату съема импульсов тоже слелал по-своему, без конденсаторов. Работает, вроде нормально. Выдает такой сигнал
Остается присабачить ардуинку с монитором и придумать как считать импульсы с двух счетчиков.
Запустил свой макет, присоединил ардуинку, пока без дисплея. Результат выводил через сериал. Счетчики ставил для испытаний парами (у меня два домика для счетчиков). Самих счетчиков 8 штук. Они находились в неисправных бытовых дозиметрах заводского производства, по 4 штуки в каждом. Пока разобрал один. Счетчики в них обмотаны свинцовой фольгой. 2 раздел, два оставил в фольге. Ставил по очереди пару раздетую (пронумеровал 1 и 2), затем пару одетую (3 и 4). Ставил их на подсчет импульсов за 30 минут. Вот результат:
Сч1 - 406 имп.
Сч2 - 461 имп.
Сч3 - 464 имп.
Сч4 - 469 имп.
Знатоки, какой можно сделать вывод?
Потом поэксперементирую еще, постараюсь узнать, зачем счетчики обмотали фольгой, и почему один из раздетых счетчиков выдал гораздо меньше импульсов?
....Знатоки, какой можно сделать вывод?
....
Привет.
Поздравляю с первыми замерами.
Не знаток, но выскажусь.
---По данным замера фон ~ 10мкР/ч.
---Желательно датчики Сч1 и Сч2 поменять местами и повторить замер.
---На первый взгляд счетчик Сч1 стал немного слеповат от времени.
Привет.
Поздравляю с первыми замерами.
..........
Плюс (+) на оба счетчика подается с одного провода преобразователя, минусы счетчиков идут каждый на свой каскад съема импульса, т.е., каждый минус присоединен к своему резистору с которых снимается напряжение опять же с каждого своим каскадом на транзисторе.
Лучше в анод каждого счётчика поставить свой высокоомный резистор. В ином случае при сработке одного счётчика падает напряжение на втором, и он в этот момент неспособен зарегистрировать частицу. Так теряется смысл в раздельных каналах снятия импульса для каждого счётчика.
Лучше в анод каждого счётчика поставить свой высокоомный резистор.........
Вот только насчет прерываний....Наверное какие-то импульсы все же будут теряться, ведь два прерывания не смогут сработать одновременно..но и одновременных импульсов, надеюсь, тоже немного.
счет прерываний....Наверное какие-то импульсы все же будут теряться, ведь два прерывания не смогут сработать одновременно..но и одновременных импульсов, надеюсь, тоже немного.
Если на разных INT-0 и INT-1, то смогут, если обработчик прерывания выполняет сейчас какое то действие и в этот момент срабатывает прерывание скажем INT-1 то будет вставлен флажок прерывания и ано сработает когда закончит выполнятся программа прерывания INT-0...
Если на разных INT-0 и INT-1, то смогут, если обработчик прерывания выполняет сейчас какое то действие и в этот момент срабатывает прерывание скажем INT-1 то будет вставлен флажок прерывания и ано сработает когда закончит выполнятся программа прерывания INT-0...
P.S. Снимаю импульсы по такой схеме. Их к ардуинке подключено две. Одна к пину2 (int0), вторая к пину 3(int1)
Сначала попробовал по схеме bodriy2014_го. Осциллограф показал импульс на резисторе больше 10 вольт, т.е. на базу транзистора поступало более 10 вольт, и сигнал на выходе получался с большими помехами. Сделал делитель, чтобы уменьшить напряжение, поступающее на базу. После этого импульс стал чистеньким, без помех, как на осциллограме из #508.
.....
P.S. Снимаю импульсы по такой схеме. Их к ардуинке подключено две. Одна к пину2 (int0), вторая к пину 3(int1)
Сначала попробовал по схеме bodriy2014_го. Осциллограф показал импульс на резисторе больше 10 вольт, т.е. на базу транзистора поступало более 10 вольт, и сигнал на выходе получался с большими помехами. Сделал делитель, чтобы уменьшить напряжение, поступающее на базу. После этого импульс стал чистеньким, без помех, как на осциллограме из #508.
Что то я не заметил чем эта схема отличается от схемы Ардоса, номиналами?
Делитель с другим соотношением и нет фильтрующего конденсатора, помехи фильтруются за счёт их малого уровня по сравнению с полезным импульсом.
Что то я не заметил чем эта схема отличается от схемы Ардоса, номиналами?
Не подумайте, что я хочу доказать что лучше, что хуже....просто пробую немного другие варианты. Так интереснее, чем просто повторить готовый проект. А готовый проект просто является хорошим фундаментом, на что можно надежно опереться.
Добрый день! Прошу помощи у автора.
Вот уже вторую неделю пытаюсь оживить аналогичное устройство, но пока безрезультатно. Ардуинщик я начинающий, поэтому все дается не быстро. Собрано аналогичное устройство, целью которого будет измерение дозы, с выдачей результатов в COM порт. Из схемы исключены кнопки, индикатор, вибро и фонарик. Не поможете со скетчем? Мои попытки адаптировать Ваш скетч не привели к желаемому результату. Обкатываю на Arduino Nano V3.0 ATmega328 CH340. Не удалось даже запустить генератор 400V.
Добрый день! Прошу помощи у автора.
Вот уже вторую неделю пытаюсь оживить аналогичное устройство, но пока безрезультатно. Ардуинщик я начинающий, поэтому все дается не быстро. Собрано аналогичное устройство, целью которого будет измерение дозы, с выдачей результатов в COM порт. Из схемы исключены кнопки, индикатор, вибро и фонарик. Не поможете со скетчем? Мои попытки адаптировать Ваш скетч не привели к желаемому результату. Обкатываю на Arduino Nano V3.0 ATmega328 CH340. Не удалось даже запустить генератор 400V.
Привет.
Зачем вы все убираете лишнее, это ненужная работа.
Вы просто в Сетап раскоментируйте строку
//Serial.begin(19200);
И дальше выводите нужный вам параметр в ком порт
Serial.println(fon);
Займет всего минуту времени такая переделка.
Остальное пусть крутится, оно кушать не просит, подтяните свои знания в будущем подчистите или напишите свое.
Вчера, наконец, собрал макет для дозиметра. Решил сначала на макете все отладить, а потом уже делать на печатке и в корпусе. Макет получился монстроидальный и под лозунгом - сделано через Ж... Но работает, надеюсь, что правильно. А почему через Ж..., потому что блоки устройства расположил по самому наихудшему варианту. Например, высоковольтный преобразователь расположил на противоположном от источника питания и счетчиков конце доски. Это надо же было так придумать! Вот оно
Сегодня залил скетчик, который подсчитывает импульсы каждого счетчика за 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)
Не ожидал таких разных результатов. Время отсчитывал микроконтроллер.
Подскажите, пожалуйста, у вас тоже результаты замеров количества импульсов за определенный промежуток так разнятся, или у меня что-то не так работает?
Я конечно же не удалял, а комментировал. Но при компиляции постоянно ругань.
Спасибо! Удалось скомпилировать. Достаю бубен.
.....
Вот результаты:
Счетчик №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%
Усреднением во времени мы уменьшаем только статистическую погрешность, а погрешность измерения остается.
А что .............
Сегодня начну читать тему с начала, буду ваять скетч для измерения радиации.
Сегодня поизмерял фон в своей квартире. Так как нормального скетча еще не написал, измерял по количеству импульсов за 10 минут, с последующим ручным переводом в микрорентгены/час. По всей квартире фон составил примерно 10-12 мкр/ч, а в ванной комнате аж 20 мкр/ч !!! Видимо плитка немного фонит. Как понимаю 20 мкр/ч это верхний предел безопасного фона.
Собрал я Ардос на смд элементах- версия 1.04 –заработала сразу без настройки.
Спасибо автору.
Только с печаткой намучался. Сразу не разбирался и плату из архива распечатал и Ардуинку на 8Мгц, 3,3в пришлось прилепить вверх ногами, вернее вниз элементами, и транзисторы пришлось поставить вверх ногами, а так все замечательно, но это мелочи. Делитель получился 120МОм/200Ком=600.
Прошу помощи.
1)Использую синий дисплей 5110 вместо красного.
Работает нормально, только не знаю что можно изменить в скетче чтоб при засыпании не включалась подсветка.
2) И еще столкнулся с проблемкой: вот идешь случайно мимо возле источника излучения Ардос в кармане лежит выходит из режима сна и там тихонечко начинает попискивать и нифига не слышно. Что можно изменить в скетче чтоб этот бузер (или лучше еще один громкий бузер добавить)при срабатывании тревоги действительно громко запищал какую нибудь громкую мелодию хотя бы секунд 30 чтоб успеть среагировать на угрозу,
3)и еще хочется вибромоторчик куда нибудь подцепить вместо фонарика чтоб при тревоге в очень шумных местах понять что ты начал облучаться.
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 с сайта автора. Перепаивать другой дисплей для теста не хочется, отпишитесь, если получится.
2) Что можно изменить в скетче чтоб этот бузер ... при срабатывании тревоги действительно громко запищал какую нибудь громкую мелодию хотя бы секунд 30 чтоб успеть среагировать на угрозу.
Тоже столкнулся с подобной проблемой. Пока склоняюсь к мысли поставить полевик (по такой же схеме, как на фонарик) и пятивольтовый бузер со встроенным генератором, и в функции void signa () поменять ногодрыг на более медленный, и без цикла while.
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 в коде не используется?
tekagi спасибо , код поменял теперь синий дисплей 5110 работает корректно,
для усиления звука приделал к выходу бузера усилитель на pam8403 , используется 1 канал. питание на плату усилителя подается вместо светодиода.
при выходе и сна слышны щелчки на 100 м вокруг, аж подпрыгиваешь от неожиданности, все думают что у тебя в кармане петарды взрываются. Надо чего то доработать програмно.
для tekagi перерезал дорожку с выхода А3 , а 8 выход синего дисплея 5110 припаял перемычкой на GND pro mini. Работа Ардоса не изменилась. Поэтому наверное выход А3 можно использовать для других целей
tekagi выложи код для бузера с генератором в архиве куда нибудь. а то чего то запутался делать изменения.
Так в моём предыдущем посте весь код выложен. Развернуть спойлер, нажать на кнопку с двумя стрелочками в правом верхнем углу кода, откроется окно, откуда скетч целиком копируется по Ctrl+A Ctrl+C прямо в Ардуино ИДЕ. Строки я подсветил для bodriy2014, чтобы были видны отличия от оригинального 1.4.3 - может чем-то в дальнейших версиях пригодятся.
Пока кинул на дропбокс.
Не подскажите, емкость С2 насколько критична (допустимый диапазон)?
По схеме из какого поста? В топике немало вариантов, нумерация элементов различается. В схеме на сайте автора С2 нет.
С17, С8 в цепи первичной обмотки
С17, С8 в цепи первичной обмотки
Эти кондеры должны обладать очень низким ESR, поэтому рекомендую туда ставить или параллельно несколько керамических или тантал. Электролит один у меня стоял долго не выдержал, пробил.
Если совсем нет керамики или тантала такой емкости, тогда один электролит и параллельно керамики 2штуки чтоб его шунтировать и разгрузить.
Емкость несильно важна в пределах 10мкФ.
Попытался с ходу реализовать свой алгоритм измерения радиации, получилась полнейшая фигня. Или в скетче ошибки, или подход неправильный. Придется изучать подходы автора темы, брать их на вооружение. Сразу разобраться не удалось, посмотрел мельком..........., пока нет времени и знаний. Не понимаю что означают разные символы типа <1>>11 и что-то в этом роде......
Joiner, строки вроде:
?
Это прямое управение пинами ардуины через регистры. Более быстродействующий (хоть и более сложный для понимания) вариант digitalWrite. Собственно к агоритму измерения отношения не имеют. Хотя подобные конструкции здесь используются и для работы с АЦП, поскольку analogRead в данном случае не совсем подходит.
Joiner, строки.......
Увы, сам не настолько силён в кодинге. Знаю лишь, что используется алгоритм "скользящего окна". Но основан всё равно на подсчёте количества импульсов за период.
Спасибо! В начальных страницах фигурирует 100.0 uF
Увы, сам не настолько силён в кодинге. Знаю лишь, что используется алгоритм "скользящего окна".......
По теории должно работать, но, видимо, что-то напутал. Должно быть так - маленький массив - быстрая реакция, маленькая точность, а большой массив - все наоборот. Но у меня что-то значения сильно прыгают. :(
... По прерываниям определяется время между импульсами и на этой основе вычисляется частота, а из нее уровень радиации...
Как мне кажется, измерять время между импульсами не лучшая идея, уж слишком хаотично они идут, может каждые 2-3 секунды, а может и через 15 секунд пролететь пачка импульсов с минимальным интервалом и опять затишье.
У автора принцип более логичный (измерение кол-ва импульсов за определенный период), который, я думаю, в той или иной мере используют и многие другие дозиметры.
Кстати исполнять в прерывании много кода, как я помню, не лучшая идея, хотя могу и ошибаться (я тоже в кодописании не более чем начальный тыкатель)
Как мне кажется, измерять время между импульсами не лучшая идея..................
У автора принцип более логичный (измерение кол-ва импульсов за определенный период), который, я думаю, в той или иной мере используют и многие другие дозиметры.
Кстати исполнять в прерывании много кода, как я помню, не лучшая идея, хотя могу и ошибаться (я тоже в кодописании не более чем начальный тыкатель)
Тоже столкнулся с подобной проблемой. Пока склоняюсь к мысли поставить полевик (по такой же схеме, как на фонарик) и пятивольтовый бузер со встроенным генератором, и в функции void signa () поменять ногодрыг на более медленный, и без цикла while.
В общем(Зацепила меня тема громкости бузера), в моем варианте, та же проблема была с громкостью бузера (Пьезокерамический излучатель), менять на генераторный не захотел и тот, что у меня был особой громкостью не отличался, и решил сделать, что то на том, что был и вот что с этого >>ВЫШЛО<<
Imasoft выложи скетч пожалуйста.
Если, автор bodriy2014 не будет против я здесь выложу!
Если, автор bodriy2014 не будет против я здесь выложу!
Только ЗА, любые сообщения по данной теме приветствуются.
Файлы проекта на Github: >>ТУТ<<