ArDos / дозиметр, продолжение темы, часть №2

sasa1958
Offline
Зарегистрирован: 21.07.2020

Loc = FF не ставится вообще в калькуляторах его нет ,если ставишь то прошивка защищена и при чтении программатором показывает все нули,поэтому в оболочке программатора его вообще не следует трогать и не ставить на него галки в программере,ставится он только на закрытых коммерческих прошивках

Domosed
Offline
Зарегистрирован: 15.07.2019

Сегодня меня смутили показания моего дозиметра. Решил проверить напряжения высоковольтной части.
Поскольку мерить напряжения поступающее на питание трубок обычным мультиметром бесполезно, измеряю осциллографом. Перевожу в режим однократного срабатывания по триггеру, чувствительность 100V/div, на щупе делитель 1:10 и касаюсь искомой точки измерения.

На пике смотрю искомое напряжение.
p.s. авось кому пригодится такой способ, в процессе не один осциллограф не пострадал ;)

evrojox
Offline
Зарегистрирован: 09.07.2018

Спасибо большое за помощь. Вы были правы на счёт винды. Переустановка решила все проблемы. К сожалению был утрачен файл от Lazy_Dragon. Ваш архив и архив элатсим после распаковки компилируется теперь без проблем. Но все-же есть пара ложек дектя. Все ссылки на схемы и прошивки сайта "с руками" не работают. Пологаю из за того что саит ua . Есть схема в архиве Элат, но там олед 7 пинов. Зачем там рессет? Работает и без него. Правда проверял на дежурной макетной нано. Буду ждать про мини. Кстати в присланном Вами зип олед1.05 при установке версия 1.03. Это правильно? Тоже и с элатом. Про прошивку от Lazy_Dragon не могу ни что сказать, хотелось бы сравнить. Плохо что версия 1.03 без сна, вместо него инверсия экрана. Я дуб в программировании и сам не переделаю. Может кто поможет? Да, ещё вопрос. Какие дисплеи поддерживаются? Просто ssd1306 мелковат. Пробовал с нано ssd1315. Вроде идёт. Но с ней он шёл на разных проектах вместо 1306,но на про мини сразу артефактил. По этому скажу всем спасибо за любую помощь файлом, схемой, прошивкой или советом косатёльно ардос с олед и хотелось бы режим сна. В отличии от жк олед прожорлив.

sasa1958
Offline
Зарегистрирован: 21.07.2020

Берёте  evrojoxи подключаете clck и data а остальные в воздухе висят,больше линий организовано для того чтобы индикатор ,вернее табло ,быстрей обновлялось

evrojox
Offline
Зарегистрирован: 09.07.2018

Ну у моих всего 4 пина. scl sda и питание. Работают прекрасно. По этому и поинтересовался, зачем там рестарт. Если только для режима сна?

evrojox
Offline
Зарегистрирован: 09.07.2018

Других идей нет.

sasa1958
Offline
Зарегистрирован: 21.07.2020

я ставил и индикатор 4 контактный и 6 ни какой разницы не увидел,прошивка сделана ещё в зачаточном состоянии поэтому и лучше делать на чёрно-белом индикаторе 5110 меньше кушает 

evrojox
Offline
Зарегистрирован: 09.07.2018

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

sasa1958
Offline
Зарегистрирован: 21.07.2020

Ред-алерт не сложен,всё упирается в стоимость микроконтроллера 2000 руб ,поэтому затрачивать большие средства на показометр ,я не согласен и с ардуино ещё много чего есть ,а показометр есть на тини 13,45 

evrojox
Offline
Зарегистрирован: 09.07.2018

Все относительно, мне не проблема переварить кузов авто, но покрасить-увы. Кому-то на оборот. С моим зрением и виброприводом рук смд монтаж такой плотности равносилен покраске. Да и смд детали просто так не валяются, в отличие от выводных. А ехать в ближайший радиомагазин за 40 вёрст не охота, как и покупать из Китаю пачками. Но проект интересен. Просто пайка стала хобби, и дозики интересны. Была целая коллекция разных трещеток, по разным схемам.но дозик должен быть информативным. По этому либо лед либо олед. Жк для себя я не рассматриваю. Ну не нравятся мне они. По этому под мои хотелки подходят микрон лед и нанит лед на семисегментниках, либо ардос и РадАлерте на олед. Это из того что мне понравилось и я ещё не собрал. Не плох дозик от домосед а с этого форума со второй прошивкой. Но питание там блокинг. И хотя я поставил там экономичный и стабилизированный преобразователь, постоянно включённый олед плюс микросхема обработки импульса сажает акум за трое суток. По этому всем должен рулить мк. Моё мнение. Хочется носимый в кармане девайс, чтоб с задаваемые уровнем тревоги, без перепрошивки, экономичный, показывал фон и дозу, делал замеры. Много проектов подходит под мои хотелки? А с учётом того что твариться в мире вспомнил чьи-то слова" много дозиков мало не бывает". Просто может найдутся желающие и кому интересна версия олед допилить её на функцию сон. Или Хотя-бы отключение дисплея без отключения озу. Можно повесить эти команды вместо фонаря. Я пока с кодом не дружу.

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

evrojox - Мало просто отключать один дисплей, тк только сам камень жрет 10-15мА... Пишите разработчику прошивки, может чем поможет...
А вообще, если Вас все-таки интересует функционал прибора, то лучше собрать на дисплее 5110, там есть все что вам нужно)

sasa1958
Offline
Зарегистрирован: 21.07.2020

чтобы камень жрал меньше ,evrojox ,нужно питание камня включить через диод

sasa1958
Offline
Зарегистрирован: 21.07.2020

Прошивка сырая на олед дисплее и виснет,олед дисплей не вставишь в прошивку ardos 3.94 ,нету шрифтов,писать их надо хорошему программеру,на гитхабе есть только под латиницу и то ущемлённые

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

sasa1958 - Зачем диод в цепи питания мк? Чтоб понизить и без того низкое напряжение питания?? Потребление от этого толком не упадет, а вот стабильность работы мк очень сильно пострадает... Для понижения потребления нужно оптимизировать выполнение задач во сне и использовать сами режимы сна мк. Так же стоит сделать более экономичный преобразователь...

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

sasa1958
Offline
Зарегистрирован: 21.07.2020

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

makarminy
Offline
Зарегистрирован: 03.02.2022

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

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

makarminy - Опишите по подробнее, что вы подразумеваете под "чувствительность дозиметра". Вообще основные настройки примерно такие:

#define GEIGER_AREA 30
#define OWN_BACK 2.0

#define DEFAULT_GEIGER_TIME (примерно 6сек, нужно более точно подстраивать)

 

makarminy
Offline
Зарегистрирован: 03.02.2022

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

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

makarminy - Это очень странно, учитывая что си8б в 6 раз чувствительнее сбм20... У вас сейчас какое время счета стоит?
Вообще, за чувствительность к спадам/скачкам отвечают эти конфиги:

//Настройки коэффициентов
#define COEF_DEBUG       0 //выводить отладку коэффициента рядом с надписью "ФОН"(0 - не выводить | 1 - выводить)
#define MASS_TIME        7 //всего данных в массиве коэффициентов времени
#define MASS_BACK        7 //всего данных в массиве коэффициентов фона

const uint8_t time_mass[MASS_TIME][2] PROGMEM = { //массив выборки элементов из основного буффера для сравнения(1..60)
  {2, 6},  //0-й порог
  {3, 9},  //1-й порог
  {4, 12}, //2-й порог
  {5, 15}, //3-й порог
  {6, 18}, //4-й порог
  {7, 21}, //5-й порог
  {8, 24}  //6-й порог
};

const float coef_time_mass[MASS_TIME] PROGMEM = { //массив коэффициентов сравнения для выявления скачков/спадов(1.00..10.00)
  5.00, //0-й порог
  4.00, //1-й порог
  3.00, //2-й порог
  2.50, //3-й порог
  2.00, //4-й порог
  1.70, //5-й порог
  1.50  //6-й порог
};

const uint16_t back_mass[MASS_BACK] PROGMEM = { //массив квантования коэффициентов поправки на текущий фон(0..65500)
  15,    //0-й порог
  30,    //1-й порог
  100,   //2-й порог
  1000,  //3-й порог
  10000, //4-й порог
  35200, //5-й порог
  65500  //6-й порог
};

const float coef_back_mass[MASS_BACK] PROGMEM = { //массив коэффициентов поправки на текущий фон(1.00..10.00)
  5.00, //0-й порог
  4.00, //1-й порог
  3.00, //2-й порог
  2.50, //3-й порог
  2.00, //4-й порог
  1.75, //5-й порог
  1.50  //6-й порог
};

 

makarminy
Offline
Зарегистрирован: 03.02.2022

Спасибо. У меня время счёта 9 секунд. На сбм 20 дозиметр нормально реагировал на скачки спады, а вот на си 8б почему то сильно дубовым получился. Ну буду пробовать коэффициенты подбирать.

sasa1958
Offline
Зарегистрирован: 21.07.2020

makarmini,протирать раствором надо чаще слюду си-8б ,обязательно и не лапать руками

makarminy
Offline
Зарегистрирован: 03.02.2022

В курсе, он у меня вообще пищевой плёнкой обмотан, альфу не пропустит, зато от влаги и пыли защитит.

sasa1958
Offline
Зарегистрирован: 21.07.2020

makarmini,из этих счётчиков слюдяных самый хороший СБТ-10А ,но его надо правильно сконфигурировать ,у него 10 анодов и как запитано в ардосе так не пойдёт и использовать надо для ардоса дополнительно max987 это довольно продвинутый низковольтный компаратор и малошумный и похоже тебе его надо ставить

makarminy
Offline
Зарегистрирован: 03.02.2022

sasa1958, у меня был вариант взять сбт-10а, но поставил си-8б, так как с ним меньше проблем по питанию, ну и ardos нормально его вытягивает, максимум на котором я его тестировал, это 12 мР/ч.

sasa1958
Offline
Зарегистрирован: 21.07.2020

makarmini,я поставил 6 сбм-20 и тоже самое что и сбт-10 ,и добавил компаратор max 987 и корректировку по времени 6 секунд и ввел рабочую площадь датчиков,можно мерить и продукты,но для сыпучих надо делать проходную ёмкость

sasa1958
Offline
Зарегистрирован: 21.07.2020

Да забыл сказать альфа и Бетта мерить необязательно,так,как разпад быстрый,можно и не заметить,а реально если хотите посмотреть это излучение,это микроволновка и мощное это локатор для ведения самолётов

Stdos
Offline
Зарегистрирован: 22.08.2022

mambavamba14 пишет:
Мало просто отключать один дисплей, тк только сам камень жрет 10-15мА...
Всмысле камень? Основной МК Атмега или в самом экране еще камень  есть? 

 

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Stdos - Да, основной мк. В дисплее тоже есть контроллер, но он в простое не так много потребляет(если речь о 5110), плюс у него так-же есть режим сна.

evrojox
Offline
Зарегистрирован: 09.07.2018

   Domosed  Конечно не по теме, но не могли бы вы связаться со мной в личку по вопросу Вашего варианта с ютуба.  hurumburum1977@yandex.ru

evrojox
Offline
Зарегистрирован: 09.07.2018

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

makarminy
Offline
Зарегистрирован: 03.02.2022

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

sasa1958
Offline
Зарегистрирован: 21.07.2020

makarmini ,шторку еадо делать на датчик ,свинцово-оловянно-медную-алюминиевою,несколько слоёв разного металла,расчёты есть в интернете,либо делается сплав,в быту сплав не сделаешь,припой пос-40 толщиной 1 мм и фольга медная и алюминиевая

Stdos
Offline
Зарегистрирован: 22.08.2022

evrojox пишет:

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

Если у вас oled ssd1306, то экран (включается/выключается) командами (AEh/AFh).

https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf#28

стр.28.

 Готовую функцию можно найти в любой oled библиотеке 1306.

evrojox
Offline
Зарегистрирован: 09.07.2018

Stdos спасибо за команды. Правда в скетче я полный ноль. От слова совсем. Ну такоя я человек, пока не покажеш не поиму. Хоть читай, хоть смотри, только больше вопросов. А знакомых ардуинщиков или программистов нет. Идея есть но незнаю верна ли. Так что вероятность справится самому как шанс что при столкновении двух запорожцев получится феррари. Вот по этому и прошу опытных товарищей помочь. P. S олед 1306

Stdos
Offline
Зарегистрирован: 22.08.2022

evrojox пишет:
Правда в скетче я полный ноль. От слова совсем. Ну такоя я человек, пока не покажеш не поиму. Хоть читай, хоть смотри, только больше вопросов. А знакомых ардуинщиков или программистов нет. Идея есть но незнаю верна ли.

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

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

#ArDos_with_RADON_3.9.5 - Новый обработчик звуков, мелкие исправления.

makarminy
Offline
Зарегистрирован: 03.02.2022

Вернулся на 3.9.4. На нововой версии появились баги со звуком. После уведомления об ошибке появляется постоянный треск, а вместо сигнализации странные писк, а иногда просто тишина.

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

makarminy - Исправил и перезалил.

sasa1958
Offline
Зарегистрирован: 21.07.2020

Последняя прошивка работает больше суток ,в режиме сна никаких сбоев

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

#ArDos_with_RADON_3.9.6 - Новый метод указания пинов подключения периферии, исправление коэффициентов ускорения, исправление паузы режима "поиск", исправление отображения щелчков, исправление звука ошибки, пункт режима "фон" - "мин" заменен на "доза", перенос отображения значений отладки коэффициентов, мелкие исправления.

UPD. Исправление логики опроса ошибок, добавлена ошибка "короткое замыкание или зашкал детектора"(появляется когда выход формирователя импульсов находится в низком уровне более 5сек).

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

 Добрый вечер форумчанам этой темы!

 Собрал я дозиметр с версией OLED


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


//настройки /////////////начало
OLED myGLCD(SDA, SCL); //подключение дисплея
#define contrast 65 //контрастность дисплея
byte treviga_1 = 30; //первая ступень тревоги
byte treviga_2 = 60; //вторая ступень тревоги
byte ton_BUZZ = 70; //тональность буззера
#define  ADC 220  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)
#define k_delitel 440 //коефициент дельтеля напряжения, зависит от вашего делителя.
byte puls = 2; //тонкая настройка длинны импульса высоковольтного транса
byte scrin_GRAF = 1; //скорость построения графика в секундах
bool buzz_ON = 1;  //включить индикацию бузером (1)
bool podsvetka = 0; //подсветка
bool Lcd_Inv = 0; //разрешение или запрет сна
float opornoe = 1.10; //делить на opornoe/10
#define son_t 40 //время засыпания в секундах
#define save_DOZ 20 //как часто сохранять накопленную доху например каждые 20мкР
//настройки //////////////конец

extern uint8_t SmallFont[], MediumNumbers[], TinyFont[], BigNumbers[];
extern uint8_t logo_bat[], logo_rag[], logo_tr_OLED[], 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;
unsigned long spNAK_milis = 0, time_doza = 75000;
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;
int doza_vr = 0, val_dr_pr = 0, val_dr_OK = 0;
byte mass_p[84];
byte mass_toch[181], m = 0, n_menu = 0, sys_menu = 0, mass_36[37];
byte val_kl = 0, val_ok = 0, menu = 0, zam_180p = 0, zam_36p = 0, gif_x = 0;
float VCC = 0.0, doz_v = 0.0, stat_percent = 99.0;
bool tr = 0, poisk = 1, fonarik = 0, g_fl = 0;
//-------------------------------------------------------------
void setup() {
  Serial.begin(57600);
  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 (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 >= 100) { //скорость отрисоаки дисплея
    lcd_milis = millis();
    if (menu == 0) {
      lcd_poisk();//вывод на дисплей режима поиск
      poisk_f();
    }
    if (menu == 1) {
      lcd_menu();//вывод на дисплей меню
    }
    if (menu == 2) {
      lcd_sys();//вывод на дисплей системного меню
    }
    if (menu == 3) {
      zamer_180s();//вывод на дисплей замер 180сек
    }
  }
  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) {
        Lcd_Inv = !Lcd_Inv;
      }
      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 = 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))) { //нажатие <<<
      _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) {
        Lcd_Inv = !Lcd_Inv;
      }
      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 = 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;
      }
    }
  }
}
//-------------------------------------------------------------
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;
  }
  if (menu == 3) {
    menu = 1;
  }
}
//--------------------------------------------------------------
void gif_nabor() {
  myGLCD.setFont(SmallFont);
  myGLCD.drawLine(0, 50, 127, 50); myGLCD.drawLine(0, 63, 127, 63);
  for (int i = 127 - zam_180p * 0.72; i < 127; i++) {
    myGLCD.drawLine(i, 50, i, 63);
  }
  g_fl = !g_fl;
  if (g_fl == 0) {
    myGLCD.drawBitmap(gif_x, 53, gif_chast_1, 8, 8);
  } else {
    myGLCD.drawBitmap(gif_x, 53, gif_chast_2, 8, 8);
  }
  if (zam_180p < 180) {
    gif_x = gif_x + 1;
    if (gif_x >= 123 - zam_180p * 0.72) {
      gif_x = 0;
    }
    myGLCD.print("ANALIZ", CENTER, 40);
  }

  if (zam_180p >= 180) {
    myGLCD.print("OBNOVLENIE", CENTER, 40);
  }
}
//--------------------------------------------------------------
void zamer_180s() {
  myGLCD.clrScr();
  myGLCD.setFont(TinyFont);
  myGLCD.print("ACCURACY", 93, 10);
  myGLCD.setFont(SmallFont);
  myGLCD.printNumF(stat_percent, 1, 93, 18, '.', 4); myGLCD.print("%", 117, 18);
  myGLCD.setFont(BigNumbers);
  myGLCD.drawRect(0, 0, 88, 30);
  if (fon >= 1000) {
    float mZV = float(fon) / 1000;
    myGLCD.printNumF(mZV, 1, 4, 4, '.', 4, '0');
    myGLCD.setFont(SmallFont); myGLCD.print("mR/h", 62, 19);
  }
  if (fon < 1000) {
    myGLCD.printNumI(fon, 4, 4, 4, '0');
    myGLCD.setFont(SmallFont); myGLCD.print("uR/h", 62, 19);
  }

  gif_nabor();
  battery();
  myGLCD.update();
  if (millis() - toch_milis >= 1000) {
    toch_milis = millis();
    for (int i = 0; i < 180; i++) { //сдвигаем
      mass_toch[i] = mass_toch[i + 1];
    }
    mass_toch[179] = shet;
    shet = 0;
    if (zam_180p < 180) { //первый набор массива
      zam_180p++;
      int fon_vr1 = 0;
      for (int i = 180 - zam_180p; i < 180; i++) {
        fon_vr1 = fon_vr1 + mass_toch[i];
      }
      fon = fon_vr1 * (18.0 / zam_180p);
    }
    if (zam_180p >= 180) { //набор массива
      int fon_vr1 = 0;
      for (int i = 0; i < 180; i++) {
        fon_vr1 = fon_vr1 + mass_toch[i];
      }
      fon = fon_vr1 / 10;
    }
    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 <= 180) {
      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();
  if (tr == 1) { //опасно
    myGLCD.drawBitmap(91, 29, logo_tr_OLED, 32, 32);
  }
  else myGLCD.drawCircle(107, 45, 2);
  myGLCD.setFont(BigNumbers);
  myGLCD.drawRect(0, 0, 88, 41);
  myGLCD.drawRect(0, 30, 88, 63);
  if (fon >= 1000) {
    float mZV = float(fon) / 1000;
    myGLCD.printNumF(mZV, 1, 4, 4, '.', 4, '0');
    myGLCD.setFont(SmallFont); myGLCD.print("mR/h", 62, 19);
  }
  if (fon < 1000) {
    myGLCD.printNumI(fon, 4, 4, 4, '0');
    myGLCD.setFont(SmallFont); myGLCD.print("uR/h", 62, 19);
  }

  time_d ();
  myGLCD.setFont(TinyFont);
  myGLCD.print("ACCURACY", 93, 10);
  myGLCD.printNumI(HOUR, 2, 34);
  if (HOUR >= 9) {
    myGLCD.print("h", 15, 34);
  }
  if (HOUR < 9) {
    myGLCD.print("h", 7, 34);
  }
  myGLCD.printNumI(MIN, 20, 34);
  if (MIN >= 9) {
    myGLCD.print("m", 28, 34);
  }
  if (MIN < 9) {
    myGLCD.print("m", 25, 34);
  }
  myGLCD.setFont(SmallFont);
  if (doz_v < 1000) {
    myGLCD.printNumF(doz_v, 1, 35, 33, '.', 6); myGLCD.print("uR", 72, 33);
  }
  if (doz_v >= 1000) {
    myGLCD.printNumF(doz_v / 1000.0, 2, 35, 33, '.', 6); myGLCD.print("mR", 72, 33);
  }
  myGLCD.printNumF(100 - (zam_36p * 2.2), 1, 93, 18, '.', 4); myGLCD.print("%", 117, 18);


  battery();
  for (int i = 0; i < 5; i++) {
    myGLCD.drawLine(1, (4 * i) + 46, 4, (4 * i) + 46);
  }
  for (int i = 0; i < 82; i ++) { //печатаем график
    if (mass_p[i] > 0) {
      if (mass_p[i] <= 20) {
        myGLCD.drawLine(i + 5, 63, i + 5, 63 - mass_p[i]);
      }
      if (mass_p[i] > 20) {
        myGLCD.drawLine(i + 5, 63, i + 5, 63 - 20);
      }
    }
  }
  myGLCD.update();
}
//-------------------------------------------------------------
void lcd_menu() { //вывод на дисплей меню
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("OPASN.1", 8, 0); myGLCD.printNumI(treviga_1, 75, 0); myGLCD.print("uR/h", RIGHT, 0);
  myGLCD.print("OPASN.2", 8, 8); myGLCD.printNumI(treviga_2, 75, 8); myGLCD.print("uR/h", RIGHT, 8);
  myGLCD.print("PODSV.", 8, 16); myGLCD.printNumI(podsvetka, 75, 16);
  myGLCD.print("INVERT", 8, 24); myGLCD.printNumI(Lcd_Inv, 75, 24); myGLCD.print("on/off", RIGHT, 24);//usr
  myGLCD.print("POISK R", 8, 32); myGLCD.printNumI(scrin_GRAF, 75, 32); myGLCD.print("SEK", RIGHT, 32);
  myGLCD.print("ZVUK", 8, 40); myGLCD.printNumI(buzz_ON, 75, 40);
  myGLCD.print("OUT", 8, 48);
  myGLCD.print("SAVE", 8, 56);
  myGLCD.print(">", 0, n_menu * 8);
  myGLCD.update();
}
//-------------------------------------------------------------
void lcd_sys() { //вывод на дисплей меню
  VCC_read();
  speed_nakachka ();//скорость накачки имлульсы/сек
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("OPORN", 8, 0); myGLCD.printNumF(opornoe, 2, 44, 0); myGLCD.print("VCC", 75, 0); myGLCD.printNumF(VCC, 2, RIGHT, 0);
  hv_400 = hv_adc * opornoe * k_delitel / 255; //считем высокео перед выводом
  myGLCD.print("NAKAH", 8, 10); myGLCD.printNumI(puls, 75, 10); myGLCD.printNumI(hv_400, RIGHT, 10);
  myGLCD.print("DOZA", 8, 20); myGLCD.print(">>", 75, 20); myGLCD.print("SBROS", RIGHT, 20);
  myGLCD.print("OUT", 8, 30);
  myGLCD.print("SAVE", 8, 40);
  myGLCD.print(">", 0, sys_menu * 10);
  myGLCD.print("SPEED N", 0, 56); myGLCD.printNumI(speed_nak, 50, 56); myGLCD.print("imp/sek", RIGHT, 56);
  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;
      }
    }
    if (millis() - toch_milis >= 1000) {
      toch_milis = millis();
      for (int i = 0; i < 36; i++) { //сдвигаем
        mass_36[i] = mass_36[i + 1];
      }
      mass_36[36] = shet;
      if (zam_36p < 36) { //первый набор массива
        zam_36p++;
        fon = fon + shet;
      }
      if (zam_36p >= 36) { //набор массива
        int fon_vr1 = 0;
        for (int i = 0; i < 36; i++) {
          fon_vr1 = fon_vr1 + mass_36[i];
        }
        fon = fon_vr1;
      }
      shet = 0;
      /*
        for (int i = 0; i < 36; i++) {
          Serial.print( mass_36[i]); Serial.print(",");
          }
          Serial.print(","); Serial.print(fon); Serial.println(" ");
      */
      doz_v = doz_v + fon / 100.0 / 36.0;
      time_doza = time_doza + 1;
      if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
        eeprom_wrD ();
        doza_vr = doz_v;
      }
    }
  }
}
//-------------------------------------------------------------
void signa () { //индикация каждой частички звуком светом
  shet_s = shet;
  if (buzz_ON == 1) {//включаем бузер
    PORTB |= (1 << 5); //светодиод
    int d = 30;
    while (d > 0) {
      PORTD |= (1 << 6);
      _delay_us(ton_BUZZ);
      PORTD &= ~(1 << 6);
      _delay_us(ton_BUZZ);
      d--;
    }
    PORTB &= ~(1 << 5);//светодиод
  }
  generator();//накачка по обратной связи с АЦП
}
//-------------------------------------------------------------
void Schet() { //прерывание от счетчика на пин 2
  //detachInterrupt(0);
  shet++;
  //attachInterrupt(0, Schet, FALLING);
}
//-------------------------------------------------------------
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++;
  }
}
//-------------------------------------------------------------
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.begin();
  myGLCD.setBrightness(contrast);
  myGLCD.invert(Lcd_Inv);
  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();
  delay(1000);
}
//-------------------------------------------------------------
void eeprom_wrS () { //запись настроек в память
  EEPROM.write(0, 222);
  EEPROM.write(1, treviga_1);
  EEPROM.write(2, podsvetka);
  EEPROM.write(3, Lcd_Inv);
  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);
    Lcd_Inv = 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 < 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 battery() { //батарейка
  VCC_read();
  myGLCD.drawBitmap(99, 0, logo_bat, 24, 8);
  myGLCD.setFont(TinyFont);
  myGLCD.printNumF(VCC, 2, 103, 2);
}

 Пока что включаю без СБМ-20, т.к. хочу удостовериться, что на него будет подаваться не более 400 Вольт. Но измерить нечем, кроме обычного тестера, который на постоянке показывает 417 В, что и отображает дисплей в меню дозиметра, но при бОльшей скорости накачки (подключены щупы тестера). По идее показания тестера должны быть занижены из-за шунтирования мультиметром участка схемы.  Делитель: 100M и 220K. Пожалуйста, ткните носом, где какой коэффициент поменять и на какое значение, что бы примерно выровнять к более правдоподобным значениям высокого напряжения. Заранее спасибо!

sasa1958
Offline
Зарегистрирован: 21.07.2020

Конденсатор запаял на 20 мкф х 450 вольт ,минут 20 подождал и замерил обычным тестером ,если не высокоомного и сравнить     не с чем

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

 

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

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

sasa1958
Offline
Зарегистрирован: 21.07.2020

Да размер большеват чтобы в кармане носить ,я упаковал в дип меге 368 и сбм-20,95х50 мм ,колпачки счётчика горелкой удалил и довёл длину счётчика до 85 мм ,ну так смесь дип и смд деталей,высоковольтный транс ставил от вспышки СМД и 10 миллигенри тип 0510 размером как МЛТ-0,5 и 5 витков провода 0,6 поверх индуктивности,с трансформатором смд работает лучше и экономичнее

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

Enjoy, если показания в меню и на мультиметре совпали - значит и делитель, и коэфициенты в порядке. Преобразователь получился с запасом, поэтому держит нагрузку в виде мультиметра, там же обратная связь по напряжению. Когда отключаете мультиметр, напряжение в меню не растёт? Если нет - то всё в порядке. Можно чуть уменьшить значение в строке
019 #define ADC 220
чтобы снизить напряжение до 390-400 вольт.
Но олед прошивка имеет немало багов, на "поиграться" и потыкать в что-то низкофоновое пойдёт, а выше уже пойдут глюки с переполнением и занижением. Подсчёт временнЫх интервалов там тоже с большими погрешностями.

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

 Tekagi, спасибо за ответ. Да, схемотехнику я понимаю. Обратная звязь и преобразователь заработали сразу как нужно. Видимо  из-за того, что сразу применил все меры, включая дополнительные блокировочные керамические конденсаторы. Просто большинство измеряет мультиметром (показания падают при этом), который сильно нагружает преобразователь, у меня же на 10-ти М-омный тестер показания в норме, разве что увеличивается сильно скорость накачки, но это нормально в момент измерения. А так, что при 417 Вольт, что сейчас 394 Вольта - совпадает до одного Вольта - мультиметр/встроенный вольтметр. Значение напряжения не прыгает в дозиметре при таких манипуляциях с мультиметром, остается постоянным, разве что напрягается преобразователь в момент измерения :)  Коэффициент подправил потом и значение ADC тоже уменьшил немного. Сейчас 394 Вольта выставил. Скорость накачки 170-190, при подключении щупов тестера возрастает до 1000 и более, но это понятно... Да, запас есть и приличный.

 Очень жаль, что прошивка для OLED не поддерживается сейчас правками багов. Мне нравятся такие дисплеи, да и в наличии был только такой, к тому же в корпус не влез бы большой по типу Нокии. Тему читал, исправлял лишний "пик" при считывнии попадания частиц, иначе был двойной почти всегда. Сейчас вроде нормально, но иногда проскакивает даже тройной, единичные тоже есть. Может просто из-за такого случайного хаотичного процесса попадания в счетчик, непонятно :)

makarminy
Offline
Зарегистрирован: 03.02.2022

Раздобыл одну интересную штуку с СПД. Ardos с СБМ-20 показывал 170 мр/ч, что выглядит вполне реалистичным для данного артефакта, при этом скорость накачки 120. А вот ardos на Си-8б повёл себя не хорошо. До уровня 10 мр/ч показания с СБМ-20 совпадали, а при увеличении мощности дозы начал занижать показания, там где СБМ-20 показывал 170 мр/ч, у си-8б всего 2.5 мр/ч. При этом напряжение держалось в районе 400-450В, а скорость накачки была около 280, то есть с питанием проблем вроде не было, а на самом датчике очень много вспышек. Это из-за мёртвого времени датчика и с этим надо смириться, или можно как-то попытаться исправить?

Enjoy
Enjoy аватар
Offline
Зарегистрирован: 07.05.2020

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

 И ещё момент... В версии OLED показания при длительном замере (analiz) естественного фона 9-10 мкР/ч, что близко к норме, а в режиме поиска 14-20, бывает прыгает и выше (без входа/выхода в меню). То есть в этом режиме завышает показания. Может у кого осталась подправленная или более корректная версия скетча, возможно?

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

#ArDos_with_RADON_3.9.7 - Добавлен пункт настроек "Усреднение"(позволяет выбрать время усреднения фона в минутах), изменен пункт настроек "Поиск"(позволяет выбрать количество ячеек для расчета данных), добавлен пункт настроек "Скорость"(позволяет выбрать скорость обновления данных режима "поиск" в мс), исправлена работа режима "поиск", новый дизайн и функционал графика режима "фон"(теперь отображает данные за 60сек и 60мин), мелкие исправления.

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

evrojox
Offline
Зарегистрирован: 09.07.2018

Оказывается не только я любитель олед экранов. Конечно у Enjoy корпус великоват для данного экрана, но на вкус и цвет да и возможности у всех разные. Хотя реально уместить в корпус 90х50х16. А это вполне для повседневного ношения. Главное чтоб тревога сработала если что не так. Но вот постоянно включённый олед портит всю радужную картину. По этому и прошу опытных товарищей помочь с этим вопросом. Ну не в состоянии я справиться с этим. Помогите пожалуйста. P/S знаю что прошивка под олед сыровата, но это не смущает. В реактор лезть не собираюсь, а для повседневного ношения будет самое то.