Спасибо. В вашем zip файле только схема, а меня заинтересовала сама печатная плата для травления. А фотографии хорошего качества с подписанными элементами на печатной плате (как из поста #788) у вас не найдётся?
Большое спасибо разработчикам Дозиметра Ardos. Когда я решил сделать дозиметр, то выбрал именно эту схему. Простота, малое количество деталей, хорошая поддержка - вот достоинства этой схемы. ( Когда делал, наступил на все "грабли" какие возможно, наладил, заработало и только тогда догадался дочитать форум до конца...)
Мой вариант печатной платы, размер 102х60 мм (у СБМ20 отпилен плюсовой изолятор) Детали использованы от старых мониторов, лазерных принтеров...
Плата рассчитана на AtMega328 в DIP корпусе, без кварца (внутренний генератор 8 мГц). Нарисовано в Спринт лайоут 5. Элементы не подписаны... Программировл процессор в Ардуино, потом ставил в плату.
ПС: у AtMega328 в DIP нет "ардуино пин А6", я использовал "пин А5", и программу немного поправил...
ППС: Версия платы 2 (односторонняя под ЛУТ), исправлены явные огрехи, высоковольтная часть сделана на SMD резисторах... (много перемычек - красный слой)
http://easyelectronics.ru/usb-programmator-avr-usbasp.html ,(вытащил родной чип из Ардуины, вставил чистый, подключил программатор, зашил, прочитал фьюзы, поменял - ТОЛЬКО СНЯЛ ГАЛКУ - CKDIV8, записал фьюзы). Есть методика записи при помощи только Ардуино УНО.
ПС: По фьюзам из всего прочитанного я понял, что с завода процессор идет с включенным внутренним генератором и делителем на 8 т.е тактовая частота 1мГц (втыкай в любую схему и заработает без кварца). То есть чтобы частота была 8 Мгц надо снять галку CKDIV8, и больше ничего не трогать!
Доброго времени суток! Решил тоже себе запилить дозик, спасибо автору за проект и за его поддержку. Возник вопрос, при прилете одного гамма-кванта, ардуинка выдает двойной сигнал, что это может быть?
К сожалению ослика нет, другого сбм-20 так же нет, остались только сбт11(((( на подсевших при прилете частицы на выходе угасающий треск, здесь же ровно два импульса, покрутил в настройках накачку на 4-6 эффект частично пропадает...
Странно. Напряжение на высокой стороне калибровали, не превышает допустимое для счётчика? Я ранее описывал настройку.
СБТ11, емнип, тоже работает на 400В, для проверки использовать можно. Показания, конечно, соответствовать не будут, но удвоение импульса проверить можно. Но только после проверки соответствия высокого, жалко будет хороший счётчик загубить завышенным.
проверил, опорное верно, накачка верно, заметил одну особенность когда нахожусь в меню настройки опорного и накачки эффект пропадает, щелкает один раз на каждый прилет.... сейчас попробую перепрошить с крайней версии на более старую...
проверил, опорное верно, накачка верно, заметил одну особенность когда нахожусь в меню настройки опорного и накачки эффект пропадает, щелкает один раз на каждый прилет.... сейчас попробую перепрошить с крайней версии на более старую...
У меня точно также как и у товарища ortus, но я както не обращал на это внимания. Прошивка тоже стоит последняя. Кстати я собирал прибор по схеме с умножителем, может в этом дело ?
Доброго времени суток! Решил тоже себе запилить дозик, спасибо автору за проект и за его поддержку. Возник вопрос, при прилете одного гамма-кванта, ардуинка выдает двойной сигнал, что это может быть?
Это баги программы, я уже и не помню подробностей, в общем посмотрел программу v1,05(04), когда в подпрограмме "void poisk_f() {//режим поиска" происходит обнуление значения "shet = 0;" ПРОИСХОДИТ ДОПОЛНИТЕЛЬНЫЙ щелчек с интервалом от 100мс до 1000мс, в режиме меню такого не происходит!
Лечение в подпрограмме: "void poisk_f() {//режим поиска"
исправить строку:
if (buzz_ON == 1) {//включаем бузер
на
if ((buzz_ON == 1) && (shet_s > 0)) {//включаем бузер
У меня точно также как и у товарища ortus, но я както не обращал на это внимания.
Это потому что вы им не пользуетесь, если бы пользовались то подобный баг обнаружился быстро, я про это писал месяцев этак(надо смотреть сколько), в прошивке есть еще куча багов не исправленных, в своем варианте я подобное давным давно исправил и уже успел забыть за это...
* Вторник- v1.07 от 23.05.17, Много было внесено изменений с версии ArDOS v1.05
* Среда v1.18 от 12.07.17, Исправил битность сохранение значения time_doza, так как сохранялось только 2 байта 16бит, что приводило к неправильному отображения накопленного времени дозы, после включения устройства, так же сделал ограничение счетчика до 999h59m
Все основные баги были сделаны до версии v1.07 от 23.05.17, но небыли записаны.
проблема нет генераций высокого напряежения (модерн-я ДБГ-05Б) отсутвуют импульсы
при дотрагивание до отверткой до радиодеталей части ВН или где снимается и обратный сигнал приосхдит тактирование завышенного фона ардуинке, на примере ардоса на схеме укажите точки замеровом осциллографом , впервый раз сталкиваюсь с дозиметрами и трансформаторами ВН
придотрагивание до ВН части напряжения (пальцам руки)
кто сталкивался с такой проблемой
вопрос по дозиметру Ардос какие можно применить транзисторы в корпусе то-92 в вн части (я поставил кт3117а1) и импульсной части поставил кт3102вм
Surikat, cобираете по принципу bodriy2014, из частей оригинального ДБГ? В точках, отмеченных стрелками импульсы накачки есть? Длительность импульса в меню увеличивали?
Транзистор накачки поставьте тот же, что и был в ДБГ (КТ940 А или Б), он более-менее высоковольтный. 3117 и 3102 имеют малое допустимое напряжение КЭ и работать не будут (с большой долей вероятности уже пробило). Там с индуктивности импульс четыреста и более вольт. Возможно будет работать MJE13003 (13001, 13002).
В формирователе импульса - родной кт3107 или любой маломощный pnp (bc557, кт361...).
Не самый лёгкий путь выбрали, с большинством возникающих проблем Вам придётся разбираться самостоятельно. Базовая схема АрДоса попроще в настройке будет.
Однако доброго времени суток! Проверил ардос на источнике от дп-5в, за пределом в 1000 микрорентген ожидал, что прибор автоматически сконвертирует в милирентгены, оного не произошло, чему был удивлен(((, источник прокисший уже, но 3,5 милирентгена выдавливает, колокольчик оповещения опасных уровней ввергает в уныние, заменить бы на значок радиации, и при привышении пороговых значений уровней опасности отсутствует звуковое оповещение((( баги вроде не критичные, но заставляют обращать на них внимание. Уважаемый IMASOFT так как я сам в программировании ардуинок полный нуб, возможно Вы посодействуете в решении данных багов? Участники проекта были бы благодарны Вам за допил программы...
У кого есть поверочные источники проверьте реакцию Ардоса на высокие уровни, на моем экземпляре с крайней прошивкой начиная от 1500 uR начинает самопроизвольно выходить в меню, замер или в анализ, такое ощущение что идут глюки проги или начинает прошивать по схеме....
Только С11 на 630В. Транс выдирал с платы бесперебойника, они по параметрам один в один, но у меня не завелись толком. Потом заменил транзистор на 6346, и мотал с провода который достал из старого допотопного радио. Так же на Али продаются 0,1 диаметром.
Я лично брал от старой 15 ваттной энергосберегайки, до этого на гантельке смотал, но по напруге не дотянул, не сталморочить себе голову и использовал транс, добавил 3.5 витка медного проводника в лаке, толщина по лаку составила 0.8 мм
Ториевая ручка)) Кстати, не проверяли, торон она не выделяет? Айзон за китайские ториевые артефакты рассказывал, а про такую возможность не упоминал.
Surikat пишет:
УМЕНЯ ОГРОМНЫЙ ВОПРОС ПО ТРАНСФОРМАТОРУ КТО ИЗ ЧЕГО ДЕЛАЛ, УМЕНЯ НЕТ ВОЗМОЖНОСТИ ДОСТАТЬ ПРОВОД.
Тонкий провод всречается в высоковольтных катушках, маломощных реле, контурных катушках длинно-и средневолновых приёмников и т.д. Для намотки его надо немного (два-три метра максимум), если сматывать б/у - выбирать катушки, не залитые лаком, следить, чтобы не повредилась лаковая изоляция.
Ш-образный сердечник можно взять от китайских зарядок (об этом не раз говорилось в теме). Как разобрать такой сердечник для перемотки, не повредив - листайте гугль/ютуб, примеров масса. Гантельки встречаются в разной технике (свои брал с электронных балластов для люминисцентных ламп и компового блока питания). Верхний правый на картинке трансформатор и вовсе был намотан на стержневом сердечнике выходного дросселя от БП АТХ, но в работе оказался крайне неэкономичным (около 10мА при ЕРФ). Если появится свободное время - проведу эксперимент с внутренней частью дросселя от DC-DC конвертера (синяя платка на фото), она тоже имеет форму гантельки, но места для намотки там намного больше.
...колокольчик оповещения опасных уровней ввергает в уныние, заменить бы на значок радиации,...
Берёте программку Image Generate, ставите поле 24х8 пикселов, рисуете картинку по душе :) Сгенерированый софтиной код вставляется в несколько кликов.
Вопос к ortus и остальным собирающим проект. Как должна работать авария по превышению заданного порога? В последней версии с поддержкой сна (ЕМНИП 1.043) я делал так. Сработка - непрерывный сигнал 7 секунд (длительность задаётся в скетче) - выключение сигнала. Или лучше держать сигнал включённым, пока измеряемый фон выше порога?
Доброго времени суток! Уважаемый Tekaji, спасибо за наводку по программе! Касаемо сигнала тревоги, лично мое, сугубо мое мнение такое, так как оповещений по привышению уровня в программе заведено два (у меня первое привышение порога стоит на 35 микрорентген, до 35 микрорентген включительно является нормой, второй порог у меня стоит 50 микрорентген, это допустимые санитарные значения) При привышении первого порога должен отрабатывать прирывистый короткий сигнал, а вот при сработке второй аварии должен долбить постоянный сигнал секунд 5-7, в общем как реализованно у Вас, но с учетом, что если уровень выше допустимой и санитарной срабатывает вторая авария минуя первую, тем самым человек будет знать какой уровень аварии происходит, так же следует учесть, что варианты реализации звуковой схемы у людей могут быть разные, у кого то по схеме с пассивным бузером, а у кого то и с схемой усиления с генераторным бузей...
Уровня в дефайнах то два, но тревога в коде (к которой я цеплялся) реализована одна... У меня как раз с активным бузером и транзисторным ключом на выходе ардуинки, попробую сделать и под пассивный бузер. Пока тестирую не наделал ли новых багов при переносе со старой версии (с 11й страницы топика).
З.Ы. Трилистник радиации в 24х8 не влазит. Черепушка тоже)
Просто с одной стороны, постоянно вопящий прибор, заставляет быстрее двигать булками (вспоминаем самый яркий пример: Терра-П), с другой стороны, у человека который мало знаком с микро, мили, рентгенами с зивертами и тд. , вопящий прибор скорее вызывать будет психосоматическую реакцию, что тоже не айс допустим, не дай боги в критической ситуации, да и вопящий постоянно прибор не кисло так раздражает....
На счет черепушек и трилистников не столь актуально как тревога по звуку, а есть ли возможность заставить включаться и отключаться подсветку в купе с звуковым сигналом аварии?
Думаю, в этом смысла нет, мигающая подсветка снизит информативность дисплея. На полной схеме АрДоса есть вибра (на тестовой плате у меня распаяна) и фонарик, при желании можно прикрутить тактильную тревогу и стробоскоп. А пока со звуком бы разобраться...
Думаю, в этом смысла нет, мигающая подсветка снизит информативность дисплея. На полной схеме АрДоса есть вибра (на тестовой плате у меня распаяна) и фонарик, при желании можно прикрутить тактильную тревогу и стробоскоп. А пока со звуком бы разобраться...
я поддерживаю! например звук5 секунд ; вибра + светоиндикацией
Спасибо. В вашем zip файле только схема, а меня заинтересовала сама печатная плата для травления. А фотографии хорошего качества с подписанными элементами на печатной плате (как из поста #788) у вас не найдётся?
Solid_niy, в архиве три файла:
Прочти.txt короткое текстовое описание
ardosv1_01.lay6 печатная плата в формате SprintLayot6
ARD_dos_м1_04.JPG схема
Спасибо большое. Невнимательно прочитал.
А полностью схему сбросте с прошивкой
Схема такая и есть как выложил.
/* Версия 1-9 04.09.2017 ДОЗИМЕТР датчик СМБ-20 Текущее излучение Накопление сумму за час За сутки с интервалом 1 час запись в EEPROM ( с промежуточными итогами 15-30-45 мин) При запуске возможна корректировка даты и времени Отображение предыдущих дней - 5 мин потом возврат к текущей дате */ #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_TFTLCD.h> // Hardware-specific library #include <TouchScreen.h> // тачпанель #include <iarduino_RTC.h> // часы #include <EEPROM.h> // флешпамять #include <string.h> // #include <Wire.h> //#include <Adafruit_BMP085.h> // Управление экраном #define LCD_CS A3 // Chip Select goes to Analog 3 #define LCD_CD A2 // Command/Data goes to Analog 2 #define LCD_WR A1 // LCD Write goes to Analog 1 #define LCD_RD A0 // LCD Read goes to Analog 0 #define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin // Шина данных экрана // D0 connects to digital pin 8 (Notice these are // D1 connects to digital pin 9 NOT in order!) // D2 connects to digital pin 2 // D3 connects to digital pin 3 // D4 connects to digital pin 4 // D5 connects to digital pin 5 // D6 connects to digital pin 6 // D7 connects to digital pin 7 // For the Arduino Mega, use digital pins 22 through 29 // (on the 2-row header at the end of the board). // управление тачпанелью #define YP A1 // must be an analog pin, use "An" notation! #define XM A2 // must be an analog pin, use "An" notation! #define YM 7 // can be a digital pin #define XP 6 // can be a digital pin // параметры резистивной матрицы тачпанели X-240 Y-320 при любом повороте экрана #define TS_MINX 175 #define TS_MINY 200 #define TS_MAXX 928 #define TS_MAXY 950 #define MINPRESS 10 #define MAXPRESS 1000 //пропорция пересчета в пикселы экрана #define TochXProp 2.40 //пропорция пересчета в пикселы экрана Х 2.53 #define TochYProp 3.16 //пропорция пересчета в пикселы экрана Y 3.29 #define VIDEOROTAT 3 // ориентация экрана (значения 0-3 ( 3- горизонтальное начальный угол возле шлейфа тачпанели) TSPoint pXY; // данные от тач панели // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define BLUE2 0x0012 #define RED 0xF800 // 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF // цвета на экране #define COLOR_FON1 BLUE2 // BLUE2 #define COLOR_FON2 BLUE2 // BLUE2 #define COLOR_FON3 RED // BLUE2 #define COLOR_CIFR WHITE // циферблат #define COLOR_RAD1 GREEN // уровень радиации в норме #define COLOR_RAD2 YELLOW // уровень попышеный #define COLOR_RAD3 RED // уровень высокий #define COLOR_IZMER WHITE // индикатор процесса измерения #define RAD_UROVEN_POVISHEN 30 // повышеный уровень радиации #define RAD_UROVEN_VISOKIY 100 // высокий уровень радиации //прерывание (счетчик импульсов) volatile int iKolImp; // подсчет импульсов за интервал измерения int iImpMas[8]; // кол-во импульсов в пред периоды int iRadPredSek; // пред секунда для проверки 15 сек интервала char chTextTFT[30]; // общий буфер для вывода на экран unsigned long iRadPulsTekChas; // количество импульсов за час int iKolPer15Chas; // кол-во полных периодов по 15 сек за час int iDataTek; // текущая дата int iDataPokaz24; // какую дату показывать из EEPROM 0-текущая,1-пред2-два дня назад 6-неделю назад int iPokazRZ; // отображение в ренгенах=0 или зивертах=1 #define PIN_INT_SCHET 19 // номер цифрового входа для прерывания 4 D19 Mega #define NOMER_INT_SCHET 4 // номер прерывания 4 ( D19 Mega) #define KOL_MIN_POKAZ_PRED_DNEY 5 // кол-во мин показа экрана с пред датой unsigned long ulTimePokaz,ulTimePokaz1Sek; // время предыдущего показа экрана unsigned long ulTimePressTch; // время предыдущего нажатия на тач unsigned long ulTimeDataPokaz24; // время начала показа экрана с пред датой // генератор для преобразователя 400В #define PIN_PWR_GEN 46 // номер цифрового входа для генератора преобразователя #define SHIM_NORM 7 #define SHIM_MIN 1 #define SHIM_MAX 34 int iParamSHIM; //значение ШИМ // измерение напряжения #define PIN_READ_U400 12 // порт измерения папряжения #define KOEF_ACP_400 1.99 // коэф пересчета АЦП в вольты на датчике СБМ20 // рабоота с EEPROM #define EEPROM_ADR_RAD 50 // начало блока данных в EEPROM с почасовой радиацией 50-дата,51-мес,52-год в формате 17,18,19, 53-0 час(2 байта),55- 1 час 99- 23 час // create buttons--------------------- #define BUTTON_TEXTSIZE 2 char buttonlabels[9][5] = { "X","<<", ">>", "14", "21", "28", "All", "Clr", "Scan"}; uint16_t buttoncolors[9] = {BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, GREEN, RED }; //фон кнопки // объявляем массив кнопок; Adafruit_GFX_Button buttons[9]; // объявление устройств Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); iarduino_RTC time(RTC_DS3231); // Объявляем объект time для модуля TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); int iSignalSchet; //включение звукрвого сигнала на щелчек //??? отладка int iKolPr; // давление //Adafruit_BMP085 datBMP185; int32_t iDavPas,iDavRt; // давление в Паскалях и ммРтутfloat flDavKorKoeff=1.0027; //============================================================================== void setup(void) { int i; time.begin(); // Инициируем RTC модуль // инициализация экрана tft.reset(); uint16_t identifier = tft.readID(); tft.begin(identifier); tft.cp437(true); tft.setRotation(VIDEOROTAT); // настройки iPokazRZ=1; // отображегние в зивертах SetDataTime(); // установки счетчика импульсов RadKolImp(0); RadChas(0,0,0); // настройка перывания от разрядника pinMode(PIN_INT_SCHET, INPUT); digitalWrite(PIN_INT_SCHET, HIGH); attachInterrupt(NOMER_INT_SCHET, InterSchet, FALLING ); // установка функции обработки прерывания на № 4 пин 19 (MEGA) при переходе с высокого на низкий уровень // интервалы времени ulTimePokaz1Sek=ulTimePokaz=ulTimePressTch=millis(); // time.settime(0,34,16,01,6,17,4); // Устанавливаем время: // настройка генератора pinMode(PIN_PWR_GEN, OUTPUT); // настройка тамера 1 на 1.5 кГц ШИМ выхода TCCR5A = TCCR5A & 0xe0 | 3; TCCR5B = TCCR5B & 0xe0 | 0x0a; // установка оптимальной длины импульса ШИМ iParamSHIM=SHIM_NORM; pinMode(PIN_PWR_GEN, OUTPUT); analogWrite(PIN_PWR_GEN,iParamSHIM); // // инициализация данных в EEPROM time.gettime(); iDataTek=time.day; // текущая дата для контроля смены суток RadDenInitEEPROM(0,time.day,time.month,time.year,0); // проверяем текущий день в памяти или другой и инициализируем при необходимости iDataPokaz24=0; // показ графика за сегодняшний день // сиглал разрядника откл iSignalSchet=0; // ОТЛАДКА iKolPr=0; // buttonlabels[0][0]=178; // значек динамика // ссылка на экран, х-центр кнопки, Y - центр кнопки, ширина, высота, цвет рамки,цвет кнопки, цвет текста, текст, размер текста buttons[0].initButton(&tft, 20, 20,40,40, WHITE, buttoncolors[0], WHITE, buttonlabels[0], BUTTON_TEXTSIZE); buttons[1].initButton(&tft, 20, 215,36,50, WHITE, buttoncolors[1], WHITE, buttonlabels[1], BUTTON_TEXTSIZE); buttons[2].initButton(&tft, 298, 215,36,50, WHITE, buttoncolors[2], WHITE, buttonlabels[2], BUTTON_TEXTSIZE); // датчик давления // datBMP185.begin(); } //================================================================================== void loop(void) { int iPeriodScheta=0,iReg400,iTouchZ; // временные параметры int i,i2=0; // проверка и регул напр 400В iReg400=TestRegNapreg400(); // проверяем тачпанель pXY = ts.getPoint(); pinMode(YP, OUTPUT); pinMode(XM, OUTPUT); iTouchZ=pXY.z; if(iTouchZ>10) // нажатие на экран { i=(millis()-ulTimePressTch)/500; //если i>1 время пред нажатия больше 0.5 сек i=2; if(i>1) { ulTimePressTch=millis(); // вкл -выкл пищалки if(buttons[0].contains(TCGetX(), TCGetY())) { if(iSignalSchet==0) { iSignalSchet=1; buttonlabels[0][0]=178; buttons[0].initButton(&tft, 20, 20,40,40, WHITE, buttoncolors[0], WHITE, buttonlabels[0], BUTTON_TEXTSIZE); buttons[0].drawButton(); } else { iSignalSchet=0; buttonlabels[0][0]=88; buttons[0].initButton(&tft, 20, 20,40,40, WHITE, buttoncolors[0], WHITE, buttonlabels[0], BUTTON_TEXTSIZE); buttons[0].drawButton(); } } // показ почасовое пред суток if(buttons[1].contains(TCGetX(), TCGetY())) { if(iDataPokaz24<6) iDataPokaz24++; DataPokaz24TimerVozvrata(0); drawDispley1(); } // показ данных за след сутки if(buttons[2].contains(TCGetX(), TCGetY())) { if(iDataPokaz24>0) iDataPokaz24--; DataPokaz24TimerVozvrata(0); drawDispley1(); } } } // контроль показа предыдущей даты более 5 мин и перехлд к тек дате DataPokaz24TimerVozvrata(1); // обновляем часы time.gettime(); //контроль периода сбора импульсов 15 сек iPeriodScheta=RadKontrolPeriodScheta(); // отображение информации каждые 15 сек if(iPeriodScheta==1) { // получение текущего давления // iDavPas=datBMP185.readPressure(); iDavRt=iDavPas*flDavKorKoeff/133.322; // перерисовка экрана drawDispley1(); ulTimePokaz=millis(); drawIndikIzmer(0); } // проверяем смену даты RadKontrolDataTek(); // показ части данных каждую секунду i=(millis()-ulTimePokaz1Sek)/1000; if(i>0) //i>0 { ulTimePokaz1Sek=millis(); // показ индикатора измерений i=(millis()-ulTimePokaz)/1000; drawIndikIzmer(i); // подсчет среднего за 1 час // печать контрольных величин /* i=0; if(i==1) { // отчищаем участок экрана tft.drawRect(0,59,62,122,WHITE); // рисуем рамку tft.fillRect(1,60,60,120,COLOR_FON1); // заливаем внутри рамки белым tft.setTextSize(2); tft.setTextColor(WHITE); // печать кол-ва импульсов i=iKolImp; i=pXY.z; itoa(i,chTextTFT, 10); tft.setCursor(10,62); tft.println(chTextTFT); // результат проверки напр преобразователя itoa(iReg400,chTextTFT, 10); tft.setCursor(4,80); tft.println(chTextTFT); // параметр ШИМ itoa(iParamSHIM,chTextTFT, 10); tft.setCursor(4,80); tft.println(chTextTFT); // напряжение преобразователя itoa(GetNapreg400(),chTextTFT, 10); tft.setCursor(4,98); tft.println(chTextTFT); // itoa(iRadPulsTekChas,chTextTFT, 10); tft.setCursor(4,116); tft.println(chTextTFT); // itoa(iKolPer15Chas,chTextTFT, 10); tft.setCursor(4,134); tft.println(chTextTFT); // itoa(iKolPr,chTextTFT, 10); tft.setCursor(4,152); tft.println(chTextTFT); // itoa(RadChas(2, 8,0),chTextTFT, 10); tft.setCursor(4,150); tft.println(chTextTFT); iKolPr=0; } */ } iKolPr++; // delay(100); } //======================================================================= // контроль показа предудущей даты не более 5 мин // 0-сброс счетчика 1 - контроль void DataPokaz24TimerVozvrata(int iDeistvie) { int i; if(iDataPokaz24>0) { if(iDeistvie==0) ulTimeDataPokaz24=millis(); // запоминаем время начала показа if(iDeistvie==1) // проверяем время показа { i=(millis()-ulTimeDataPokaz24)/1000; if(i>60*KOL_MIN_POKAZ_PRED_DNEY) iDataPokaz24=0; // если показываем больше 5 мин - возвращаемся к текущей дате } } } //========================================================================== // контроль интервала подсчета импульсов // возвращает 1 если данные обновили int RadKontrolPeriodScheta(void) { int iTesSek=time.seconds,iTekHours=time.Hours,iTekMinutes=time.minutes; int iNew=0; if(iTesSek==0||iTesSek==15||iTesSek==30||iTesSek==45) { if(iRadPredSek!=iTesSek) { iNew=1; // накопление данных за час RadChas(1,0,0); // проверка сохранения промежуточного результата if((iTekMinutes==15||iTekMinutes==30||iTekMinutes==45)&&iKolPer15Chas>8&&iTesSek==30) { RadChas(8,iTekHours,0); } // проверка закрытия часа if(iTekMinutes==0&&iKolPer15Chas>8) { if(iTekHours==0) RadChas(9,23,0); else RadChas(9,iTekHours-1,0); } // закрытие 15 сек интервала RadKolImp(1); } } iRadPredSek=iTesSek; return iNew; } //========================================================================== // контроль смены даты // возвращает 1 если данные обновили int RadKontrolDataTek(void) { int i,iNew=0; time.gettime(); // проверяем смену даты if(iDataTek!=time.day&&time.minutes>10) // в течении первого часа (10 мин) показываем график предыдущих суток { iDataTek=time.day; iNew=1; // перепысываем данные по суткам в EEPROM for(i=5;i>=0;i--) RadWriteIshToPri(i,i+1); // обнуляем текущие сутки RadDenInitEEPROM(0,time.day,time.month,time.year,0); // проверяем текущий день в памяти или другой и инициализируем при необходимости } return iNew; } //========================================================================== // учет инмпульсов iVid 0-сброс параметров 1- закрытие интервала void RadKolImp(int iVid) { int i; switch(iVid) { case 0: for(i=0;i<8;i++) iImpMas[i]=0; iKolImp=0; break; case 1: // сбор 15 сек интервалов в массив for(i=7;i>0;i--) { iImpMas[i]=iImpMas[i-1]; } iImpMas[0]=iKolImp; iKolImp=0; break; } } //========================================================================== // учет инмпульсов за час iVid // 0-сброс параметров 1-накопление текущего часа // 2- возвращает мкР за iChas // 3-возвращает записаную дату (если iChas 0-дата, 1-месяц,2-год) // 8 - запись в ПЗУ пром итогов за час (15-30-45 мин) без обнуления данных за час // 9- закрытие часа iChas // iChas от 0 до 23 (при получении даты значение от 0 до 2) // iSmeDen - смещение в днях - текущий 0, вчерашний 1, позавчерашний 2 и последний неделю назад 6. int RadChas(int iVid, int iChas,int iSmeDen) { int i,iRez=0; byte bHi,bLo; // проверка входных условий if(iChas<0||iChas>23) return 0; if(iSmeDen<0||iSmeDen>6) return 0; switch(iVid) { case 0: iRadPulsTekChas=iKolPer15Chas=0; break; case 1: // накопление данных за час iRadPulsTekChas=iRadPulsTekChas+iKolImp; iKolPer15Chas++; break; case 2: if(iChas>=0&&iChas<24) { bHi=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+3+iChas*2); bLo=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+3+iChas*2+1); // получение int из двух байт iRez=word(bHi, bLo); } break; // получаем дату case 3: if(iChas>=0&&iChas<3) { bLo=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+iChas); // получение int из двух байт iRez=bLo; } break; case 8: //подсчет радиации в мкР за час и сохранение в EEPROM без обнуления данных за час case 9: //подсчет радиации в мкР за час и сохранение в EEPROM i=iRadPulsTekChas*8*18/78/iKolPer15Chas; bHi = highByte(i); // старший байт bLo = lowByte(i); // младший байт EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+3+iChas*2,bHi); EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+3+iChas*2+1,bLo); // сбразываем счетчики с наступлением нового часа if(iVid==9) iRadPulsTekChas=iKolPer15Chas=0; break; } return iRez; } //========================================================================== // iVid 0-проверить совпадает ли дата в ячейках памяти со смещением iSmeDen , если нет - отчистить день // iSmeDen - смещение в днях - текущий 0, вчерашний 1, позавчерашний 2 и последний неделю назад 6. int RadDenInitEEPROM(int iVid, byte bD,byte bM, byte bG,int iSmeDen) { int i,iRez=0; byte bDE,bME,bGE; // проверка входных условий if(iSmeDen<0||iSmeDen>6) return 0; switch(iVid) { case 0: bDE=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)); bME=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+1); bGE=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+2); if(bD!=bDE||bM!=bME||bG!=bGE) { EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen),bD); EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+1,bM); EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+2,bG); for(i=0;i<48;i++) EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+3+i,0); } break; } return iRez; } //========================================================================== // запись данных за сутки из iDenIst в iDenPri // возвращает 0 - ОК, 99- ошибка входных параметров int RadWriteIshToPri(int iDenIst, int iDenPri) { int i; byte bD; // проверка входных условий if(iDenIst<0||iDenIst>6) return 99; if(iDenPri<0||iDenPri>6) return 99; if(iDenPri==iDenIst) return 0; for(i=0;i<51;i++) { bD=EEPROM.read((EEPROM_ADR_RAD+51*iDenIst)+i); EEPROM.write((EEPROM_ADR_RAD+51*iDenPri)+i,bD); } return 0; } //========================================================================== // отображение основного экрана void drawDispley1(void) { tft.fillScreen(COLOR_FON1); tft.setTextColor(WHITE); tft.setTextSize(2); // отображаем название прибора tft.setCursor(55,2); tft.println(utf8rus("ДОЗИМЕТР-SVA-1.7")); // текущее время drawTime(); // текущая дата drawDate(); // отображение кнопок drawKnopki1(0); //радиация за день по часам drawRadDen(iDataPokaz24,2); // отображение радиации drawRadRZ(RadGetRengen(),iPokazRZ); } //========================================================================= // пересчет импульсов в излучение в мкрР/час int RadGetRengen(void) { int i,iSumImp=0,iRengen; if(iImpMas[0]!=0) { for(i=0;i<8;i++) if(iImpMas[i]!=0) iSumImp=iSumImp+iImpMas[i]; else iSumImp=iSumImp+iImpMas[0]; iRengen=iSumImp*18/78; // коэфф пересчета импульсов за 2 мин } else iRengen=0; return iRengen; } //========================================================================== // отображение излучения в ренгенах iZ==1 - показ в зивертах, иначе в ренгенах void drawRadRZ(int imkReng,int iZ) { double flRad; //imkReng=145; tft.setTextColor(COLOR_RAD1); if(imkReng>=RAD_UROVEN_POVISHEN) tft.setTextColor(COLOR_RAD2); if(imkReng>RAD_UROVEN_VISOKIY) tft.setTextColor(COLOR_RAD3); tft.setTextSize(4); if(iZ==1) { flRad=imkReng/100.0; tft.setCursor(120,100); dtostrf(flRad,0,2,chTextTFT); tft.println(chTextTFT); tft.setTextSize(3); tft.setCursor(120,140); tft.println(utf8rus("мкЗв/час")); } else { tft.setCursor(120,100); itoa(imkReng,chTextTFT, 10); tft.println(chTextTFT); tft.setTextSize(3); tft.setCursor(100,140); tft.println(utf8rus("мкР/час")); } } //========================================================================== // отображение времени void drawTime(void) { tft.setTextColor(COLOR_CIFR); tft.setTextSize(2); tft.setCursor(200,28); tft.println(utf8rus(time.gettime("H:i"))); } //========================================================================== // отображение даты void drawDate(void) { tft.setTextColor(COLOR_CIFR); tft.setTextSize(2); tft.setCursor(50,28); tft.println(utf8rus(time.gettime("d.m.Y"))); //time.gettime("d-m-Y, H:i:s, D"); } //========================================================================== // отображение индикатора замера void drawIndikIzmer(int iSec) { if(iSec==0) tft.drawRect(300,12,15,28,COLOR_IZMER); else tft.fillRect(300,40-2*iSec,15,3,COLOR_IZMER); } //========================================================================== // отображение кнопок основного экрана void drawKnopki1(int iSec) { switch(iSec) { case 0: buttons[0].drawButton(); buttons[1].drawButton(); buttons[2].drawButton(); break; } } //========================================================================== // отображение излучения за день 0- текущий 1-один день назад 2 два дня назад // iSmeY - 0 обычный, 1- поднять и в низу поставить дату 2- поднять и внизу дату кроме текущего дня void drawRadDen(int iSmeDney, int iSme) { int i,j,iRen,iColor,iSmeY=0; if(iSme==1||(iSme==2&&iSmeDney!=0)) iSmeY=18; // рисуем уровни for(i=0;i<24;i++) { iRen=RadChas(2,i,iSmeDney); j=iRen/1.5; if(iRen>=RAD_UROVEN_VISOKIY) iColor=COLOR_RAD3; else { if(iRen>=RAD_UROVEN_POVISHEN) iColor=COLOR_RAD2; else iColor=COLOR_RAD1; } tft.fillRect(40+i*10,221-j-iSmeY,8,1+j,iColor); } // рисуем линии приделов tft.drawLine(40,202-iSmeY,278,202-iSmeY,COLOR_RAD2); // рисуем часы с 1 до 23 tft.setTextColor(COLOR_IZMER); tft.setTextSize(1); for(i=1;i<24;i=i+2) { itoa(i,chTextTFT, 10); if(i<10) tft.setCursor(32+4+10*i,230-iSmeY); else tft.setCursor(29+4+10*i,230-iSmeY); tft.println(chTextTFT); } // печать даты в самом низу if(iSmeY>0) { tft.setTextColor(COLOR_IZMER); tft.setTextSize(2); tft.setCursor(100,222); sprintf(chTextTFT,"%02u.%02u.%u",RadChas(3,0,iSmeDney),RadChas(3,1,iSmeDney),RadChas(3,2,iSmeDney)+2000); tft.println(chTextTFT); } } //========================================================================== // проверка и регулировка напряжения //Возвращает 0-норма 1,2 пытаемся регулировать // 7-нет напряжения 8-низкое не получается поднять 9-повышеное но не более 420В, // 99-повышеное, не рег отстанавливаем преобраз int TestRegNapreg400(void) { int i=0,iRez=0; i=GetNapreg400(); if(i<10) return(7); if(i<388) //388 { if(iParamSHIM==SHIM_MAX) return(8); if(iParamSHIM<SHIM_MAX) iParamSHIM++; analogWrite(PIN_PWR_GEN,iParamSHIM); return(1); } if(i>404) //404 { if(iParamSHIM==SHIM_MIN) { if(i>420) // повышеное, не возможно понизить - отстанавливаем преобраз { digitalWrite(PIN_PWR_GEN,LOW); return(99); } return(9); } if(iParamSHIM>SHIM_MIN) iParamSHIM--; analogWrite(PIN_PWR_GEN,iParamSHIM); return(2); } return iRez; } //========================================================================== // получение значения напряжения на преобразвателе int GetNapreg400(void) { int i=0; i=analogRead(PIN_READ_U400)/KOEF_ACP_400; return i; } //========================================================================== // настройка дыты и времени int SetDataTime(void) { char chB1=24,chB2=25; int iExit=0,iTouchZ,iKor=9,iPause=3,iF0,iF1; unsigned ulTime; ulTime=millis(); while(iExit==0) { if(iKor!=0) { time.gettime(); tft.fillScreen(BLACK); tft.fillRect(1,30,318,40,COLOR_FON1); tft.fillRect(1,150,318,40,COLOR_FON1); tft.fillRect(1,200,318,40,GREEN); tft.setTextColor(COLOR_CIFR); tft.setTextSize(3); tft.setCursor(16,40); tft.println(chB1); tft.setCursor(72,40); tft.println(chB1); tft.setCursor(130,40); tft.println(chB1); tft.setCursor(184,40); tft.println(chB1); tft.setCursor(250,40); tft.println(chB1); tft.setCursor(16,160); tft.println(chB2); tft.setCursor(72,160); tft.println(chB2); tft.setCursor(130,160); tft.println(chB2); tft.setCursor(184,160); tft.println(chB2); tft.setCursor(250,160); tft.println(chB2); tft.setTextColor(COLOR_CIFR); tft.setTextSize(3); tft.setCursor(10,100); tft.println(utf8rus(time.gettime("H:i d.m.Y"))); tft.setCursor(100,210); tft.println(utf8rus("ВЫХОД")); if(iPokazRZ==1) { iF0=BLACK;iF1=GREEN; } else { iF1=BLACK;iF0=GREEN; } tft.fillRect(10,1,150,28,iF0); tft.setCursor(20,5); tft.println(utf8rus("Рентген")); tft.fillRect(162,1,150,28,iF1); tft.setCursor(180,5); tft.println(utf8rus("Зиверт")); iKor=0; } // проверяем тачпанель pXY = ts.getPoint(); pinMode(YP, OUTPUT); pinMode(XM, OUTPUT); iTouchZ=pXY.z; if(iTouchZ>10) // нажатие на экран { iKor=0; ulTime=millis(); iPause=60; if(TCGetY()>200) iExit=1; if(TCGetY()>30&&TCGetY()<70) iKor=1; // if(TCGetY()>150&&TCGetY()<190) iKor=-1; if(iKor!=0) { if(TCGetX()<40) time.settime(-1,-1,time.Hours+iKor,-1,-1,-1,-1); // час if(TCGetX()>50&&TCGetX()<90) time.settime(-1,time.minutes+iKor,-1,-1,-1,-1,-1); //мин if(TCGetX()>110&&TCGetX()<150) time.settime(-1,-1,-1,time.day +iKor,-1,-1,-1); //день if(TCGetX()>160&&TCGetX()<210) time.settime(-1,-1,-1,-1,time.month +iKor,-1,-1); //мес if(TCGetX()>230&&TCGetX()<270) time.settime(-1,-1,-1,-1,-1,time.year+iKor,-1); //год } if(TCGetY()<30) // переключение рентген-зиверт { if(TCGetX()<150) iPokazRZ=0; if(TCGetX()>170) iPokazRZ=1; iKor=9; } delay(200); } if(((millis()-ulTime)/1000)>iPause) iExit=1; } tft.fillScreen(BLACK); } //============================================================= // получение значения нажатия Х в интеравле разрешения экрана // возвращает 0 при ошибке или выходе за пределы int TCGetX(void) { int iRez=0; float flP; if(VIDEOROTAT==1||VIDEOROTAT==3) { if(pXY.y>TS_MINY&&pXY.y<TS_MAXY) { flP=(pXY.y-TS_MINY)/TochXProp; //пересчет в координаты дисплея iRez=flP; if(iRez>=320) iRez=319; if(VIDEOROTAT==1) iRez=320-iRez; if(iRez<1) iRez=1; } } if(VIDEOROTAT==0||VIDEOROTAT==2) { if(pXY.x>TS_MINX&&pXY.x<TS_MAXX) { flP=(pXY.x-TS_MINX)/TochYProp; //пересчет в координаты дисплея iRez=flP; if(VIDEOROTAT==2) iRez=240-iRez; if(iRez<1) iRez=1; if(iRez>240) iRez=240; } } return(iRez); } //============================================================= // получение значения нажатия Y в интеравле разрешения экрана // возвращает 0 при ошибке или выходе за пределы int TCGetY(void) { int iRez=0; float flP; if(VIDEOROTAT==1||VIDEOROTAT==3) { if(pXY.x>TS_MINX&&pXY.x<TS_MAXX) { flP=(pXY.x-TS_MINX)/TochYProp; //пересчет в координаты дисплея iRez=flP; if(VIDEOROTAT==1) iRez=240-iRez; if(iRez<1) iRez=1; if(iRez>240) iRez=240; } } if(VIDEOROTAT==0||VIDEOROTAT==2) { if(pXY.y>TS_MINY&&pXY.y<TS_MAXY) { flP=(pXY.y-TS_MINX)/TochXProp; //пересчет в координаты дисплея iRez=flP; if(iRez>=320) iRez=319; if(VIDEOROTAT==0) iRez=320-iRez; if(iRez<1) iRez=1; } } return(iRez); } /* void TEST_display_2() { byte i1,i2; tft.fillScreen(BLACK); tft.setCursor(0, 0); tft.setTextColor(WHITE); tft.setTextSize(2); for(i1=0; i1<16; i1++) { for(i2=0; i2<20; i2++) if((i1 == 0) && (i2 == 0x0A || i2 == 0x0D)) tft.write(0x20); else tft.write(i1*20+i2); tft.println(""); } } */ //============================================================= // обработка прерывания от импульса разрядника void InterSchet(void) { iKolImp++; if(iSignalSchet!=0) tone(18,1000,50); } //=============================================================== /* Recode russian fonts from UTF-8 to Windows-1251 */ String utf8rus(String source) { int i,k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x30; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB8; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x70; break; } } } m[0] = n; target = target + String(m); } return target; }Большое спасибо разработчикам Дозиметра Ardos. Когда я решил сделать дозиметр, то выбрал именно эту схему. Простота, малое количество деталей, хорошая поддержка - вот достоинства этой схемы. ( Когда делал, наступил на все "грабли" какие возможно, наладил, заработало и только тогда догадался дочитать форум до конца...)
Мой вариант печатной платы, размер 102х60 мм (у СБМ20 отпилен плюсовой изолятор) Детали использованы от старых мониторов, лазерных принтеров...
Не грех и печатку запилить от такого проекта :)
Не грех и печатку запилить от такого проекта :)
Не жалко, выложил: https://yadi.sk/d/fsmqV0gf3PEBdC
Плата рассчитана на AtMega328 в DIP корпусе, без кварца (внутренний генератор 8 мГц). Нарисовано в Спринт лайоут 5. Элементы не подписаны... Программировл процессор в Ардуино, потом ставил в плату.
ПС: у AtMega328 в DIP нет "ардуино пин А6", я использовал "пин А5", и программу немного поправил...
ППС: Версия платы 2 (односторонняя под ЛУТ), исправлены явные огрехи, высоковольтная часть сделана на SMD резисторах... (много перемычек - красный слой)
Sajsen, хекс (а лучше вместе с исходником) и фьюзы добавите? Без них по одной печатке тяжковато повторить будет :)
Заливали из ИДЕ с внешним кварцем и загрузчиком (через уну с панелькой), потом меняли фьюзы на внутренний генератор?
Sajsen, хекс (а лучше вместе с исходником) и фьюзы добавите? Без них по одной печатке тяжковато повторить будет :)
Заливали из ИДЕ с внешним кварцем и загрузчиком (через уну с панелькой), потом меняли фьюзы на внутренний генератор?
В программировании Arduino IDE ничего не понимаю, только Ассемблер (очень давно...) Выкладываю свой исходник (исправлено буквально несколько строк):
"#define ADC 160 //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)
Доброго времени суток! Решил тоже себе запилить дозик, спасибо автору за проект и за его поддержку. Возник вопрос, при прилете одного гамма-кванта, ардуинка выдает двойной сигнал, что это может быть?
В общем вот такое шасси получилось для установки в корпус...


В общем вот такое шасси получилось для установки в корпус...
Возник вопрос, при прилете одного гамма-кванта, ардуинка выдает двойной сигнал, что это может быть?
Есть возможность посмотреть сигнал после формирователя импульса осциллографом?
Если есть в запасе СБМ20 - попробуйте заменить, на "подсевших" трубках такой эффект иногда встречается.
К сожалению ослика нет, другого сбм-20 так же нет, остались только сбт11(((( на подсевших при прилете частицы на выходе угасающий треск, здесь же ровно два импульса, покрутил в настройках накачку на 4-6 эффект частично пропадает...
Странно. Напряжение на высокой стороне калибровали, не превышает допустимое для счётчика? Я ранее описывал настройку.
СБТ11, емнип, тоже работает на 400В, для проверки использовать можно. Показания, конечно, соответствовать не будут, но удвоение импульса проверить можно. Но только после проверки соответствия высокого, жалко будет хороший счётчик загубить завышенным.
проверил, опорное верно, накачка верно, заметил одну особенность когда нахожусь в меню настройки опорного и накачки эффект пропадает, щелкает один раз на каждый прилет.... сейчас попробую перепрошить с крайней версии на более старую...
проверил, опорное верно, накачка верно, заметил одну особенность когда нахожусь в меню настройки опорного и накачки эффект пропадает, щелкает один раз на каждый прилет.... сейчас попробую перепрошить с крайней версии на более старую...
У меня точно также как и у товарища ortus, но я както не обращал на это внимания. Прошивка тоже стоит последняя. Кстати я собирал прибор по схеме с умножителем, может в этом дело ?
Доброго времени суток! Решил тоже себе запилить дозик, спасибо автору за проект и за его поддержку. Возник вопрос, при прилете одного гамма-кванта, ардуинка выдает двойной сигнал, что это может быть?
Это баги программы, я уже и не помню подробностей, в общем посмотрел программу v1,05(04), когда в подпрограмме "void poisk_f() {//режим поиска" происходит обнуление значения "shet = 0;" ПРОИСХОДИТ ДОПОЛНИТЕЛЬНЫЙ щелчек с интервалом от 100мс до 1000мс, в режиме меню такого не происходит!
Лечение в подпрограмме: "void poisk_f() {//режим поиска"
исправить строку:
if (buzz_ON == 1) {//включаем бузер
на
if ((buzz_ON == 1) && (shet_s > 0)) {//включаем бузер
У меня точно также как и у товарища ortus, но я както не обращал на это внимания.
Это потому что вы им не пользуетесь, если бы пользовались то подобный баг обнаружился быстро, я про это писал месяцев этак(надо смотреть сколько), в прошивке есть еще куча багов не исправленных, в своем варианте я подобное давным давно исправил и уже успел забыть за это...
ImaSoft, в новых версиях эта строчка вынесена в подпрограмму "void signa () { //индикация каждой частички звуком светом"
Багфикс работает, спасибо. Навскидку остальных исправлений не помните? Багов, к сожалению, пока ещё хватает :(
/* ArDOs v106 без режима сна ***Дозиметр на Ардуино ***IDE Arduino 1.8.2 ветка форума arduino.ru/forum/proekty/delaem-dozimetr сайт srukami.inf.ua/ardos.html */ #include <util/delay.h> //уже есть #include <EEPROM.h>//уже есть #include <LCD5110_Graph.h>//нужно установить //настройки /////////////начало LCD5110 myGLCD(A1, A0, 12, 10, 11); //подключение дисплея //LCD5110 myGLCD(12, 11, 10, A4, A5); //подключение дисплея #define contrast 60 //контрастность дисплея byte treviga_1 = 30; //первая ступень тревоги byte treviga_2 = 60; //вторая ступень тревоги byte ton_BUZZ = 70; //тональность буззера #define ADC 163 //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255) #define k_delitel 576 //коефициент дельтеля напряжения, зависит от вашего делителя. 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) && (shet_s > 0)) {//включаем бузер 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++; } } }Если честно уже многое забыл!
Вот с коментов что вытянул:
* Вторник- v1.07 от 23.05.17, Много было внесено изменений с версии ArDOS v1.05
* Среда v1.18 от 12.07.17, Исправил битность сохранение значения time_doza, так как сохранялось только 2 байта 16бит, что приводило к неправильному отображения накопленного времени дозы, после включения устройства, так же сделал ограничение счетчика до 999h59m
Все основные баги были сделаны до версии v1.07 от 23.05.17, но небыли записаны.
Что ж, похоже придётся ждать, пока кто-нибудь из кодеров заинтересуется дальнейшим развитием проекта...
Добрый день Форумчане !
проблема нет генераций высокого напряежения (модерн-я ДБГ-05Б) отсутвуют импульсы
при дотрагивание до отверткой до радиодеталей части ВН или где снимается и обратный сигнал приосхдит тактирование завышенного фона ардуинке, на примере ардоса на схеме укажите точки замеровом осциллографом , впервый раз сталкиваюсь с дозиметрами и трансформаторами ВН
придотрагивание до ВН части напряжения (пальцам руки)
кто сталкивался с такой проблемой
вопрос по дозиметру Ардос какие можно применить транзисторы в корпусе то-92 в вн части (я поставил кт3117а1) и импульсной части поставил кт3102вм
Surikat, cобираете по принципу bodriy2014, из частей оригинального ДБГ? В точках, отмеченных стрелками импульсы накачки есть? Длительность импульса в меню увеличивали?
Транзистор накачки поставьте тот же, что и был в ДБГ (КТ940 А или Б), он более-менее высоковольтный. 3117 и 3102 имеют малое допустимое напряжение КЭ и работать не будут (с большой долей вероятности уже пробило). Там с индуктивности импульс четыреста и более вольт. Возможно будет работать MJE13003 (13001, 13002).
В формирователе импульса - родной кт3107 или любой маломощный pnp (bc557, кт361...).
Не самый лёгкий путь выбрали, с большинством возникающих проблем Вам придётся разбираться самостоятельно. Базовая схема АрДоса попроще в настройке будет.
Однако доброго времени суток! Проверил ардос на источнике от дп-5в, за пределом в 1000 микрорентген ожидал, что прибор автоматически сконвертирует в милирентгены, оного не произошло, чему был удивлен(((, источник прокисший уже, но 3,5 милирентгена выдавливает, колокольчик оповещения опасных уровней ввергает в уныние, заменить бы на значок радиации, и при привышении пороговых значений уровней опасности отсутствует звуковое оповещение((( баги вроде не критичные, но заставляют обращать на них внимание. Уважаемый IMASOFT так как я сам в программировании ардуинок полный нуб, возможно Вы посодействуете в решении данных багов? Участники проекта были бы благодарны Вам за допил программы...
Звук тревоги я к какой-то версии прикручивал, надо бы покопаться в архиве и перенести в текущую.
Было бы замечательно!
Автор отстранился от проекта, на сколько я понимаю?
У кого есть поверочные источники проверьте реакцию Ардоса на высокие уровни, на моем экземпляре с крайней прошивкой начиная от 1500 uR начинает самопроизвольно выходить в меню, замер или в анализ, такое ощущение что идут глюки проги или начинает прошивать по схеме....
Автор отстранился от проекта, на сколько я понимаю?
Да
ВОПРОС ПО КОНДЕНСАТОРАМ ОНИ ВСЕ ДОЛЖНЫ БЫТЬ ПЛЕНОЧНЫЕ +630
УМЕНЯ ОГРОМНЫЙ ВОПРОС ПО ТРАНСФОРМАТОРУ КТО ИЗ ЧЕГО ДЕЛАЛ, УМЕНЯ НЕТ ВОЗМОЖНОСТИ ДОСТАТЬ ПРОВОД.
Только С11 на 630В. Транс выдирал с платы бесперебойника, они по параметрам один в один, но у меня не завелись толком. Потом заменил транзистор на 6346, и мотал с провода который достал из старого допотопного радио. Так же на Али продаются 0,1 диаметром.
Последний эксперимент с "Трансформатором" - покупная индуктивнось на 10 мГн https://www.chipdip.ru/product/rlb1314-103kl , на ней 4 витка провода 0,5 мм диаметром
В жёлтой термоусадке чуть левее и выше экранчика)
Выпрямитель: US1M (https://www.chipdip.ru/product/us1m)
Фильтр: 0,1*630V (https://www.chipdip.ru/product/grm43dr72j104k)
Я лично брал от старой 15 ваттной энергосберегайки, до этого на гантельке смотал, но по напруге не дотянул, не сталморочить себе голову и использовал транс, добавил 3.5 витка медного проводника в лаке, толщина по лаку составила 0.8 мм
Уважаемый ImaSoft, Вы можете скинуть кусок кода который отвечает за вывод показаний накачки на экран как у Вас в вашей версии ПО?
А что это у Вас за чудной такой источник? Что то из скалярки?
Ториевая ручка)) Кстати, не проверяли, торон она не выделяет? Айзон за китайские ториевые артефакты рассказывал, а про такую возможность не упоминал.
УМЕНЯ ОГРОМНЫЙ ВОПРОС ПО ТРАНСФОРМАТОРУ КТО ИЗ ЧЕГО ДЕЛАЛ, УМЕНЯ НЕТ ВОЗМОЖНОСТИ ДОСТАТЬ ПРОВОД.
Тонкий провод всречается в высоковольтных катушках, маломощных реле, контурных катушках длинно-и средневолновых приёмников и т.д. Для намотки его надо немного (два-три метра максимум), если сматывать б/у - выбирать катушки, не залитые лаком, следить, чтобы не повредилась лаковая изоляция.
Ш-образный сердечник можно взять от китайских зарядок (об этом не раз говорилось в теме). Как разобрать такой сердечник для перемотки, не повредив - листайте гугль/ютуб, примеров масса. Гантельки встречаются в разной технике (свои брал с электронных балластов для люминисцентных ламп и компового блока питания). Верхний правый на картинке трансформатор и вовсе был намотан на стержневом сердечнике выходного дросселя от БП АТХ, но в работе оказался крайне неэкономичным (около 10мА при ЕРФ). Если появится свободное время - проведу эксперимент с внутренней частью дросселя от DC-DC конвертера (синяя платка на фото), она тоже имеет форму гантельки, но места для намотки там намного больше.
Но проще всего последовать совету Medvedik.
С этим дросселем-трансформатором накачка кушает 1,0 - 1,2 мА при ЕРФ.
Полевик на макете опять в корпусе D-Pack: P1703BDS с мёртвенькой материнки.
Ручка не пачкается и вродь ничего не выделяет) С расстояния 10 см дозик её не видит. Замеры проводил по 5, 15 и 30 минут.
ВСЕМ СПАСИБО ЗА ПОМОЩЬ!
...колокольчик оповещения опасных уровней ввергает в уныние, заменить бы на значок радиации,...
Берёте программку Image Generate, ставите поле 24х8 пикселов, рисуете картинку по душе :) Сгенерированый софтиной код вставляется в несколько кликов.
Вопос к ortus и остальным собирающим проект. Как должна работать авария по превышению заданного порога? В последней версии с поддержкой сна (ЕМНИП 1.043) я делал так. Сработка - непрерывный сигнал 7 секунд (длительность задаётся в скетче) - выключение сигнала. Или лучше держать сигнал включённым, пока измеряемый фон выше порога?
Доброго времени суток! Уважаемый Tekaji, спасибо за наводку по программе! Касаемо сигнала тревоги, лично мое, сугубо мое мнение такое, так как оповещений по привышению уровня в программе заведено два (у меня первое привышение порога стоит на 35 микрорентген, до 35 микрорентген включительно является нормой, второй порог у меня стоит 50 микрорентген, это допустимые санитарные значения) При привышении первого порога должен отрабатывать прирывистый короткий сигнал, а вот при сработке второй аварии должен долбить постоянный сигнал секунд 5-7, в общем как реализованно у Вас, но с учетом, что если уровень выше допустимой и санитарной срабатывает вторая авария минуя первую, тем самым человек будет знать какой уровень аварии происходит, так же следует учесть, что варианты реализации звуковой схемы у людей могут быть разные, у кого то по схеме с пассивным бузером, а у кого то и с схемой усиления с генераторным бузей...
Уровня в дефайнах то два, но тревога в коде (к которой я цеплялся) реализована одна... У меня как раз с активным бузером и транзисторным ключом на выходе ардуинки, попробую сделать и под пассивный бузер. Пока тестирую не наделал ли новых багов при переносе со старой версии (с 11й страницы топика).
З.Ы. Трилистник радиации в 24х8 не влазит. Черепушка тоже)
Просто с одной стороны, постоянно вопящий прибор, заставляет быстрее двигать булками (вспоминаем самый яркий пример: Терра-П), с другой стороны, у человека который мало знаком с микро, мили, рентгенами с зивертами и тд. , вопящий прибор скорее вызывать будет психосоматическую реакцию, что тоже не айс допустим, не дай боги в критической ситуации, да и вопящий постоянно прибор не кисло так раздражает....
То же верно, достаточно одного уровня и одного сигнала.... Усложнять не стоит....
На счет черепушек и трилистников не столь актуально как тревога по звуку, а есть ли возможность заставить включаться и отключаться подсветку в купе с звуковым сигналом аварии?
Думаю, в этом смысла нет, мигающая подсветка снизит информативность дисплея. На полной схеме АрДоса есть вибра (на тестовой плате у меня распаяна) и фонарик, при желании можно прикрутить тактильную тревогу и стробоскоп. А пока со звуком бы разобраться...
Отличная идея на счет моргания светодиода при привышении фона
я поддерживаю! например звук5 секунд ; вибра + светоиндикацией