Там привязка не ко времени, а к накопленной дозе. При естественном фоне реже, при повышенном чаще. Задаётся в строке
#define save_DOZ 20 //как часто сохранять накопленную дозу например каждые 20мкР
Кстати надо бы добавить в todo переписать сохранение при очень высоком фоне, как-то упустил из виду.
Понял! Благодарю. Первое время думал, что какой то баг. Не сохраняется и все))) Полежал дольше включенный - после перезагрузки сохранилось, но опять же не все.... Снова задумался...
Напряжение при накачке 10 импульсы уменьшаются до 130, но напряжение ростет до 540в. при установке перемычки напряжениеуменьшается до 400в импульсы 200. При замере на конденсаторе напряжение на мультиметре и ардуине одинаковое 390в. Транзистор поставил irmlm6346, перевернул ногами к верху. Ёмкость 270 mf в первичке. Может делитель неправильно посчитал?
Если напряжения при замерах совпали - делитель посчитан верно. Какая ёмкость конденсатора в нижнем плече делителя?
Что ж всех так тянет собирать именно олед версию? В ней глюков вагон и тележка, в том числе и в алгоритме накачки...
Правильно. Откуда в олед версии взялся дефайн UNO_DIP?
В старых версиях замер производился чаще и без особого усреднения и компенсации переключения опорного, так что мало что могу посоветовать. В качестве костыля можно попробовать немного увеличить ёмкость в делителе или подогнать коэффициент ADC_value. После любых изменений контролировать высокое внешним вольтметром, если будут расхождения с внутренним - значит способ не помог.
При изменении напряжения питания от 3,3в до 5в, изменяется и высокое напряжение от 350в-450в ADC_value 64 поставил, импульсы уменьшились до 17-20. ёмкость менял на 2nf изменений не заметил
Почему 64? Если напряжение отличалось на треть, то и подбирать коэффициент стоило исходя из этого. Высокое не должно изменяться в зависимости от напряжения питания.
Можно ещё попробовать заменить HV_read на взятую из версии 1.08.2.
Это не ардуина, это желание слепить из того, чего хочется, а не того, что рекомендовано. Если пользователь меняет что-то самостоятельно в многократно собранной и протестированной конструкции - то он понимает, что и как делает, на что повлияет замена и как в этом случае производить настройку.
byte Read_HV ()
{
ADCSRA = 0b11100111;
ADMUX = 0b11100110;
for (int i = 0; i < 10; i++)
{
while ((ADCSRA & 0x10) == 0);
ADCSRA |= 0x10;
}
int result = 0;
for (int i = 0; i < 10; i++)
{
while ((ADCSRA & 0x10) == 0);
ADCSRA |= 0x10;
result += ADCH;
}
result /= 10;
byte result2 = byte(result);
return result2;
}
Полный скетч oled с багфиксом замера:
/* ArDOs v105 без режима сна
* Mod for OLED 128*64 I2C by Lazy_Dragon
***Дозиметр на Ардуино
***IDE Arduino 1.8.5
ветка форума arduino.ru/forum/proekty/delaem-dozimetr
сайт srukami.inf.ua/ardos.html
OLED версия более не поддерживается!
*/
#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_value 163 //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)
#define k_delitel 567 //коефициент дельтеля напряжения, зависит от вашего делителя.
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_value) { //Значение АЦП при котором на выходе 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 ()
{
ADCSRA = 0b11100111;
ADMUX = 0b11100110;
for (int i = 0; i < 10; i++)
{
while ((ADCSRA & 0x10) == 0);
ADCSRA |= 0x10;
}
int result = 0;
for (int i = 0; i < 10; i++)
{
while ((ADCSRA & 0x10) == 0);
ADCSRA |= 0x10;
result += ADCH;
}
result /= 10;
byte result2 = byte(result);
return result2;
}
//--------------------------------------------------------------------------------------------------
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);
}
Сейсас стабильно 400v держит и при изменении входящего напряжения. Я оставил возможность установки жк дисплея, если с оледом не получится, мне только перемычки поставить на плате) Спасибо
При выходе из меню кратковременно увеличивается напряжение до 430в и происходит завышеие фона но через 10 секунд нормализуется напряжение. С этим багом можно что то сделать?
Здравствуйте. Такой вопрос, а трубка Гейгера СИ-22Г подойдет? Она больше чем СБМ-20 и СТС-5. Просто в нашем городе тяжело достать СТС и СБМ, а СИ-22Г у меня осталась вместе с паспортом
К примеру на jlcpcb. Пару страниц назад VlaoMao выкладывал фото платы их производства. Если заглянет в тему - может подскажет детали, там не так всё просто.
К примеру на jlcpcb. Пару страниц назад VlaoMao выкладывал фото платы их производства. Если заглянет в тему - может подскажет детали, там не так всё просто.
Там в основном к самой печатке вопросы, я так и не смог нормальную шелкографию получить на выходе, и в итоге забил. Но я не особо дружу со SprintLayout. На попробовать и так сошло.
К вопросу выше о катушке - я такую же использовал, всё ок.
VlaoMao, вопрос скорее в процедуре заказа (требования к файлам, может ссылка на ваш заказ, наверняка у них фотошаблон остался). Ну и стоимость/пересылка/время выполнения. Тем, кто не сталкивался ранее с заказом плат информация, думаю, пригодится.
Jeep64, если подсоединить миллиамперметр вместо снятого джампера - сколько показывает?
Плюс-минус лапоть для данного режима. В зависимости от версии ардуинки получал потребление от 8 до 12ма.
470, конечно, неприятно, но в документации на сбмку на графиках встречал значение и 500, так что совсем нештатным вряд ли можно назвать. В олед версии нет отдельного обработчика кнопок, поэтому такое поведение.
я в скетче еще вот эту часть менял что бы при выходе из меню фон не удваивался. Изначально скорость отрисовки дисплея 100 была
в этой части прошивки 300. нужно ли на 100 поменять или не важно? и замер 180s было значение 200 изменил на 180s как было в олед версии или все же 200 s правильное значение?
if (millis() - lcd_milis >= 300) { //скорость отрисоаки дисплея
lcd_milis = millis();
if (menu == 0) {
lcd_poisk();//вывод на дисплей режима поиск
poisk_f(); //вызов функции счёта и набора массива
}
if (menu == 1) {
lcd_menu();//вывод на дисплей меню
poisk_f(); //вызов функции счёта и набора массива________________________________
}
if (menu == 2) {
lcd_sys();//вывод на дисплей системного меню
poisk_f(); //вызов функции счёта и набора массива________________________________
Сидит программист глубоко в отладке. Подходит сынишка:
- Папа, почему солнышко каждый день встаёт на востоке, а садится на западе?
- Ты это проверял?
- Проверял.
- Хорошо проверял?
- Хорошо.
- Работает?
- Работает.
- Каждый день работает?
- Да, каждый день.
- Тогда ради Бога, сынок, ничего не трогай и не меняй.
Можно. Особенно если изменить это в печатке, чтобы не колхозить навесной монтаж. Но лучше использовать поправленную схему и печатку alexadresat (которая sot-23), там сопротивления по 10М. Но смд.
Там привязка не ко времени, а к накопленной дозе. При естественном фоне реже, при повышенном чаще. Задаётся в строке
#define save_DOZ 20 //как часто сохранять накопленную дозу например каждые 20мкР
Кстати надо бы добавить в todo переписать сохранение при очень высоком фоне, как-то упустил из виду.
Понял! Благодарю. Первое время думал, что какой то баг. Не сохраняется и все))) Полежал дольше включенный - после перезагрузки сохранилось, но опять же не все.... Снова задумался...
Напряжение при накачке 10 импульсы уменьшаются до 130, но напряжение ростет до 540в. при установке перемычки напряжениеуменьшается до 400в импульсы 200. При замере на конденсаторе напряжение на мультиметре и ардуине одинаковое 390в. Транзистор поставил irmlm6346, перевернул ногами к верху. Ёмкость 270 mf в первичке. Может делитель неправильно посчитал?
Если напряжения при замерах совпали - делитель посчитан верно. Какая ёмкость конденсатора в нижнем плече делителя?
Что ж всех так тянет собирать именно олед версию? В ней глюков вагон и тележка, в том числе и в алгоритме накачки...
конденсатора в нижнем плече 1000 пикофарад который рядом с резистором на 200 килоом
Правильно. Откуда в олед версии взялся дефайн UNO_DIP?
В старых версиях замер производился чаще и без особого усреднения и компенсации переключения опорного, так что мало что могу посоветовать. В качестве костыля можно попробовать немного увеличить ёмкость в делителе или подогнать коэффициент ADC_value. После любых изменений контролировать высокое внешним вольтметром, если будут расхождения с внутренним - значит способ не помог.
При изменении напряжения питания от 3,3в до 5в, изменяется и высокое напряжение от 350в-450в ADC_value 64 поставил, импульсы уменьшились до 17-20. ёмкость менял на 2nf изменений не заметил
Почему 64? Если напряжение отличалось на треть, то и подбирать коэффициент стоило исходя из этого. Высокое не должно изменяться в зависимости от напряжения питания.
Можно ещё попробовать заменить HV_read на взятую из версии 1.08.2.
при замене вышла ошибка. Высокое изменяться в зависимости от напряжения питания, может ардуина бракованная?
Это не ардуина, это желание слепить из того, чего хочется, а не того, что рекомендовано. Если пользователь меняет что-то самостоятельно в многократно собранной и протестированной конструкции - то он понимает, что и как делает, на что повлияет замена и как в этом случае производить настройку.
Полный скетч oled с багфиксом замера:
Файл gif.c:
Или архивом вместе с библиотекой.
1.08.2. прошивку поставил без дисплея в слепую, она стабильно 400v держит
Поэтому я в сводном посте и писал, что олед версия не поддерживается. Там кроме обратной связи багов хватает.
Сейсас стабильно 400v держит и при изменении входящего напряжения. Я оставил возможность установки жк дисплея, если с оледом не получится, мне только перемычки поставить на плате) Спасибо
Приветствую еще раз, чем эту гребаную ардуину мини прошить? Через нано ошибки посыпались, потом сама нано перестала шиться в SPI, через FTDI?
Или так...
Где видео, Уно нету, да и не проканало, пошел рыться их искать, все 2 типа есть...
При выходе из меню кратковременно увеличивается напряжение до 430в и происходит завышеие фона но через 10 секунд нормализуется напряжение. С этим багом можно что то сделать?
Можно, но самостоятельно :) У меня желания ковырять олед версию нет. По завышению фона при выходе решение когда-то ImaSoft в теме выкладывал.
По поводу прошивки ардуино. Вот в видосе все подробно рассказано, тоже сталкивался с проблемой прошивки. https://www.youtube.com/watch?v=gq64OQn5NDc
Здравствуйте. Такой вопрос, а трубка Гейгера СИ-22Г подойдет? Она больше чем СБМ-20 и СТС-5. Просто в нашем городе тяжело достать СТС и СБМ, а СИ-22Г у меня осталась вместе с паспортом
Вот не надо обновлять страницу.
СИ-22 работает только с экспериментальной прошивкой из 26го поста, но там не реализован весь функционал и некорректный учёт дозы.
Спасибо огромное за отзыв. Значит придется СБМ и СТС искать?
Если хочется собрать сейчас - да. Или ждать полнофункциональной прошивки под СИ-22. Ждать придётся долго.
Спасибо, значит в другом городе буду заказывать счетчик
Ещё такой вопрос, а печатную плату для изготовления дозиметра где можно заказать? Самому изготовить нет возможности
К примеру на jlcpcb. Пару страниц назад VlaoMao выкладывал фото платы их производства. Если заглянет в тему - может подскажет детали, там не так всё просто.
Спасибо огромное
Счетчик витков из счетчика для воды, принципиальная схема. Может кому пригодится.
Дозиметр вроде работает нормально. буду пробовать запихать его в корпус от тестера 838.
решение то ImaSoft помогло.
Здравствуйте, эта гантелька пойдёт https://www.chipdip.ru/product/rlb1314-682kl :?
Не факт, пробовать надо. Вот такая проверена пользователем Medvedik: https://www.chipdip.ru/product/rlb1314-103kl
Спасибо!
Там в основном к самой печатке вопросы, я так и не смог нормальную шелкографию получить на выходе, и в итоге забил. Но я не особо дружу со SprintLayout. На попробовать и так сошло.
К вопросу выше о катушке - я такую же использовал, всё ок.
394В на дисплее



http://youtu.be/KPwirmW7HTc
VlaoMao, вопрос скорее в процедуре заказа (требования к файлам, может ссылка на ваш заказ, наверняка у них фотошаблон остался). Ну и стоимость/пересылка/время выполнения. Тем, кто не сталкивался ранее с заказом плат информация, думаю, пригодится.
Jeep64, если подсоединить миллиамперметр вместо снятого джампера - сколько показывает?
Там постоянно значениена мультиметре изменяется, где то 1,3-0.6 иногда 2-3 милиампера проскакивает
Спасибо парни за ответ. Жду свою ардуринку, потом буду думать по поводу платы
Когда по кнопкам перемещаешься в верх низ генерация высокого прекращается, а потом происходит резкий скачек на доли секунд 450-470в
это может трубке навредить?
Получается 11 ma ардуина потребляет?
Плюс-минус лапоть для данного режима. В зависимости от версии ардуинки получал потребление от 8 до 12ма.
470, конечно, неприятно, но в документации на сбмку на графиках встречал значение и 500, так что совсем нештатным вряд ли можно назвать. В олед версии нет отдельного обработчика кнопок, поэтому такое поведение.
я в скетче еще вот эту часть менял что бы при выходе из меню фон не удваивался. Изначально скорость отрисовки дисплея 100 была
в этой части прошивки 300. нужно ли на 100 поменять или не важно? и замер 180s было значение 200 изменил на 180s как было в олед версии или все же 200 s правильное значение?
300 нормально. А время длительного замера трогать не стоит, при его смене в скетче нужно немало правок делать.
_delay_ms(500);//антидребезг. В новых прошивках таких строк нет. Нужны ли они вообще, или можно поудалять?
Сидит программист глубоко в отладке. Подходит сынишка:
- Папа, почему солнышко каждый день встаёт на востоке, а садится на западе?
- Ты это проверял?
- Проверял.
- Хорошо проверял?
- Хорошо.
- Работает?
- Работает.
- Каждый день работает?
- Да, каждый день.
- Тогда ради Бога, сынок, ничего не трогай и не меняй.
Не, ну антидребезг на 0,5с это конечно сильно
Просто подумал может из за этих задержек высокое напряжение прыгает выше 400 когда кнопки клацаеш
Скиньте пожалуйста печатную плату в dip варианте
Ссылки на печатки в посте #26 на первой странице и на авторском сайте (ссылка там же). Советую выбрать смешаную печатку дип/смд от alexadresat.
Можно ли в схеме два резистора на 30 Мом распаять по 10 Мом ?
Можно. Особенно если изменить это в печатке, чтобы не колхозить навесной монтаж. Но лучше использовать поправленную схему и печатку alexadresat (которая sot-23), там сопротивления по 10М. Но смд.
2moder: оперативно)) А 3521 и 3524 так же можно?
Вот, проверьте пожалуйста) Переделал умножитель и резисторы 30 Мом
P.S Первый раз этим занимаюсь
Не пойдёт, так элементы под счётчиком гейгера будут. Лучше так. Заодно и коэффициенты с фиксеной схемы вписать можно.
Зря берёте старую печатку, она габаритнее и менее удобна для корпусирования.
Не надо обновлять страницу после отправки поста. Подождать, пока сама прогрузится или закрыть вкладку и зайти в тему заново.