Счетчик Гейгера Ардуино

Strannic1924
Offline
Зарегистрирован: 30.08.2016

Добрый день!

Собрал счетчик Гейгера из готовых модулей:

1. Плата счетчика Гейгера с газоразрядной лампой J305ß, купил на алиэкспресс https://ru.aliexpress.com/item/Free-Shipping-Assembled-DIY-Geiger-Counter-Kit-Nuclear-Radiation-Detector-GM-Tube/32336592385.html?spm=2114.13010708.0.0.fUg3h5

2. Ардуино Уно

3. LCD 1602 I2C 

Скетч брал отсюда (маленько подредактировал под себя) https://www.cooking-hacks.com/documentation/tutorials/geiger-counter-radiation-sensor-board-arduino-raspberry-pi-tutorial/

Текст скетча:

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  
 *  This program is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version. 
 *  a
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License 
 *  along with this program.  If not, see http://www.gnu.org/licenses/. 
 *  
 *  Version:           3.0
 *  Design:            David Gascón 
 *  Implementation:    Marcos Yarza
 */
 
// include the library code:
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 
 
// initialize the library with the numbers of the interface pins
LiquidCrystal_I2C lcd(0x27,16,2);
 
// Threshold values for the led bar
#define TH1 45
#define TH2 95
#define TH3 200
#define TH4 400
#define TH5 600
 
// Conversion factor - CPM to uSV/h
#define CONV_FACTOR 0.00812
 
// Variables
int ledArray [] = {10,11,12,13,9};
int geiger_input = 2;
long count = 0;
long countPerMinute = 0;
long timePrevious = 0;
long timePreviousMeassure = 0;
long time = 0;
long countPrevious = 0;
float radiationValue = 0.0;
 
void setup(){
  pinMode(geiger_input, INPUT);
  digitalWrite(geiger_input,HIGH);
  for (int i=0;i<5;i++){
    pinMode(ledArray[i],OUTPUT);
  }
 
  Serial.begin(19200);
 
  //set up the LCD\'s number of columns and rows:
  lcd.init(); 
  lcd.backlight();// Включаем подсветку дисплея
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Radiation Sensor");
  lcd.setCursor(0,1);
  lcd.print("Board - Arduino");  
  delay(1000);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Cooking Hacks");
  delay(1000);
 
  lcd.clear();
  lcd.setCursor(0,1);  
  lcd.print("www.cooking-hacks.com");
  delay(500);
  for (int i=0;i<5;i++){
    delay(200);  
    lcd.scrollDisplayLeft();
  }
  delay(500);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  - Libelium -");
  lcd.setCursor(0,1);
  lcd.print("www.libelium.com");    
  delay(1000);
 
  lcd.clear();  
  lcd.setCursor(0, 0);
  lcd.print("CPM=");
  lcd.setCursor(4,0);
  lcd.print(6*count);
  lcd.setCursor(0,1);
  lcd.print(radiationValue);
 
  attachInterrupt(0,countPulse,FALLING);
 
}
 
void loop(){
  if (millis()-timePreviousMeassure > 10000){
    countPerMinute = 6*count;
    radiationValue = countPerMinute * CONV_FACTOR;
    timePreviousMeassure = millis();
    Serial.print("cpm = "); 
    Serial.print(countPerMinute,DEC);
    Serial.print(" - ");
    Serial.print("uSv/h = ");
    Serial.println(radiationValue,4);      
    lcd.clear();    
    lcd.setCursor(0, 0);
    lcd.print("CPM=");
    lcd.setCursor(4,0);
    lcd.print(countPerMinute);
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(6,1);
    lcd.print(" uSv/h");
 
    //led var setting  
    if(countPerMinute <= TH1) ledVar(0);
    if((countPerMinute <= TH2)&&(countPerMinute>TH1)) ledVar(1);
    if((countPerMinute <= TH3)&&(countPerMinute>TH2)) ledVar(2);
    if((countPerMinute <= TH4)&&(countPerMinute>TH3)) ledVar(3);
    if((countPerMinute <= TH5)&&(countPerMinute>TH4)) ledVar(4);
    if(countPerMinute>TH5) ledVar(5);
 
    count = 0;
 
  }
 
}
 
void countPulse(){
  detachInterrupt(0);
  count++;
  while(digitalRead(2)==0){
  }
  attachInterrupt(0,countPulse,FALLING);
}
 
void ledVar(int value){
  if (value > 0){
    for(int i=0;i<=value;i++){
      digitalWrite(ledArray[i],HIGH);
    }
    for(int i=5;i>value;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
  else {
    for(int i=5;i>=0;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
}
Работает нормально, не стал выкидывать из скетча информацию о разработчиках и "светодиодном баре" - чего нет в моей схеме. Что хотелось бы:
Так как схема импульсная - не хватает показаний усредненных.
Помогите, кто разбирается - подредактировать скетч - чтоб показывал не только текущиее значение CPM и уровень фона в мкЗВ/ч но и среднее значение мкЗВ/ч.
Большое Спасибо.
Logik
Offline
Зарегистрирован: 05.08.2014

Думал проигнорить сообщение, т.к. код вставлен не по правилам форума, вопрос пустяковый, что в целом уже говорит кое чего и о его авторе, но не смог проигорить.... $41.80 за датчик с преобразователем напряжения и пищалкой... Strannic1924, Вы как  себя вобще чувствуете? цыфры в нике - год рождения?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

negavoid
Offline
Зарегистрирован: 09.07.2016

Logik пишет:

Думал проигнорить сообщение, т.к. код вставлен не по правилам форума, вопрос пустяковый, что в целом уже говорит кое чего и о его авторе, но не смог проигорить.... $41.80 за датчик с преобразователем напряжения и пищалкой... Strannic1924, Вы как  себя вобще чувствуете? цыфры в нике - год рождения?

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

Strannic1924
Offline
Зарегистрирован: 30.08.2016

Да я чайник, помочь то конечно нельзя, только постебаться можно...

А газоразрядная трубка сколько стоит?...

Я собирал, как было мне проще и нигде не писал, что это самое лучшее (простое и дешовое) решение.

Я прошу помочь с кодом скетча...

Logik
Offline
Зарегистрирован: 05.08.2014

http://zapadpribor.com/sbm-10/ Первый попавший. 15 баксов. И это еще дороговато, гуглите найдете.

Преобразовательн напряжения - по ситуации, от чего питаемся, от 220 - проще всего его и выпрямлять, от аккумов - любой импульсный повышающий до требуемых 300-400В. Его цена в пару баксов будет.

negavoid
Offline
Зарегистрирован: 09.07.2016

ага, спасибо

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Strannic1924 пишет:

Да я чайник, помочь то конечно нельзя, только постебаться можно...

А газоразрядная трубка сколько стоит?...

Я собирал, как было мне проще и нигде не писал, что это самое лучшее (простое и дешовое) решение.

Я прошу помочь с кодом скетча...

Здесь Logik присутствует, можно у него спросить, а если в цифровой фильтр первого порядка показания загнать, можно ли считать, что на выходе получим усреднённые показания???
Как мне в моём чёрном ящике подсказал сделать

Logik
Offline
Зарегистрирован: 05.08.2014

///если в цифровой фильтр первого порядка показания загнать, можно ли считать, что на выходе получим усреднённые показания???

Грубо говоря да. Я бы с такого и начинал. Но смотря чего нужно человеку. Может нужно истиное среднее за час, чтоб дозу облучения считать.

Strannic1924
Offline
Зарегистрирован: 30.08.2016

Logik пишет:

///если в цифровой фильтр первого порядка показания загнать, можно ли считать, что на выходе получим усреднённые показания???

Грубо говоря да. Я бы с такого и начинал. Но смотря чего нужно человеку.

Да, наверное это и надо.

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

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Strannic1924 пишет:

помочь то конечно нельзя, только постебаться можно...

Кончено нельзя, Вам же написали как человеку

Logik пишет:

Думал проигнорить сообщение, т.к. код вставлен не по правилам форума

Вы читать не умеете?

Strannic1924 пишет:

Я прошу помочь с кодом скетча...

Так вставьте его нормально. В таком виде его никто и читать-то не будет.

 

Strannic1924
Offline
Зарегистрирован: 30.08.2016
/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  http://www.libelium.com 
 *  
 *  This program is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version. 
 *  a
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License 
 *  along with this program.  If not, see http://www.gnu.org/licenses/. 
 *  
 *  Version:           3.0
 *  Design:            David Gascón 
 *  Implementation:    Marcos Yarza
 */
 
// include the library code:
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 
 
// initialize the library with the numbers of the interface pins
LiquidCrystal_I2C lcd(0x27,16,2);
 
// Threshold values for the led bar
#define TH1 45
#define TH2 95
#define TH3 200
#define TH4 400
#define TH5 600
 
// Conversion factor - CPM to uSV/h
#define CONV_FACTOR 0.00812
 
// Variables
int ledArray [] = {10,11,12,13,9};
int geiger_input = 2;
long count = 0;
long countPerMinute = 0;
long timePrevious = 0;
long timePreviousMeassure = 0;
long time = 0;
long countPrevious = 0;
float radiationValue = 0.0;
 
void setup(){
  pinMode(geiger_input, INPUT);
  digitalWrite(geiger_input,HIGH);
  for (int i=0;i<5;i++){
    pinMode(ledArray[i],OUTPUT);
  }
 
  Serial.begin(19200);
 
  //set up the LCD\'s number of columns and rows:
  lcd.init(); 
  lcd.backlight();// Включаем подсветку дисплея
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Radiation Sensor");
  lcd.setCursor(0,1);
  lcd.print("Board - Arduino");  
  delay(1000);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Cooking Hacks");
  delay(1000);
 
  lcd.clear();
  lcd.setCursor(0,1);  
  lcd.print("www.cooking-hacks.com");
  delay(500);
  for (int i=0;i<5;i++){
    delay(200);  
    lcd.scrollDisplayLeft();
  }
  delay(500);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  - Libelium -");
  lcd.setCursor(0,1);
  lcd.print("www.libelium.com");    
  delay(1000);
 
  lcd.clear();  
  lcd.setCursor(0, 0);
  lcd.print("CPM=");
  lcd.setCursor(4,0);
  lcd.print(6*count);
  lcd.setCursor(0,1);
  lcd.print(radiationValue);
 
  attachInterrupt(0,countPulse,FALLING);
 
}
 
void loop(){
  if (millis()-timePreviousMeassure > 10000){
    countPerMinute = 6*count;
    radiationValue = countPerMinute * CONV_FACTOR;
    timePreviousMeassure = millis();
    Serial.print("cpm = "); 
    Serial.print(countPerMinute,DEC);
    Serial.print(" - ");
    Serial.print("uSv/h = ");
    Serial.println(radiationValue,4);      
    lcd.clear();    
    lcd.setCursor(0, 0);
    lcd.print("CPM=");
    lcd.setCursor(4,0);
    lcd.print(countPerMinute);
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(6,1);
    lcd.print(" uSv/h");
 
    //led var setting  
    if(countPerMinute <= TH1) ledVar(0);
    if((countPerMinute <= TH2)&&(countPerMinute>TH1)) ledVar(1);
    if((countPerMinute <= TH3)&&(countPerMinute>TH2)) ledVar(2);
    if((countPerMinute <= TH4)&&(countPerMinute>TH3)) ledVar(3);
    if((countPerMinute <= TH5)&&(countPerMinute>TH4)) ledVar(4);
    if(countPerMinute>TH5) ledVar(5);
 
    count = 0;
 
  }
 
}
 
void countPulse(){
  detachInterrupt(0);
  count++;
  while(digitalRead(2)==0){
  }
  attachInterrupt(0,countPulse,FALLING);
}
 
void ledVar(int value){
  if (value > 0){
    for(int i=0;i<=value;i++){
      digitalWrite(ledArray[i],HIGH);
    }
    for(int i=5;i>value;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
  else {
    for(int i=5;i>=0;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
}

 

Logik
Offline
Зарегистрирован: 05.08.2014

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

Strannic1924
Offline
Зарегистрирован: 30.08.2016

Logik пишет:

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

Прибор включается для проведения измерений только на время измерения.

Logik
Offline
Зарегистрирован: 05.08.2014

Призадумался я, а не замутить ли себе счетчик гейгера, для начала как стационарный. СБМ-10 у меня давно валяется, если не сдох, надеюсь. Весь функционал на ардуине, она выдает ШИМ на мосфет, тот формирует импульсы тока через трансформатор, с вторички выпрямляем (может и умножаем)  далее с высоковольтного делителя снимаем на ардуину напряжение для ОС для стабилизации напряжения. Импульсы тока с кондера разряжающегося на гейгер подсчитываем. Все просто, кроме мотать трансформатор(( Интересно с компактных люминисценках нет подходящего трансформатора? Или еще где в распостраненном хламе?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Logik пишет:

Призадумался я, а не замутить ли себе счетчик гейгера, для начала как стационарный. СБМ-10 у меня давно валяется, если не сдох, надеюсь. Весь функционал на ардуине, она выдает ШИМ на мосфет, тот формирует импульсы тока через трансформатор, с вторички выпрямляем (может и умножаем)  далее с высоковольтного делителя снимаем на ардуину напряжение для ОС для стабилизации напряжения. Импульсы тока с кондера разряжающегося на гейгер подсчитываем. Все просто, кроме мотать трансформатор(( Интересно с компактных люминисценках нет подходящего трансформатора? Или еще где в распостраненном хламе?

Ломаем неисправный блок питания ATX, включаем наоборот, и будет нам счастье, 5 вольт на вход на выходе  - 300, трансформаторы там точно целые )))

Logik
Offline
Зарегистрирован: 05.08.2014

Хммм.... Спасибо!

//Ломаем неисправный блок питания ATX 

Это я уже давно начал )))

Пойду посотрю на трансформатор.

XOR
Offline
Зарегистрирован: 25.04.2015

на дросселе кллки и мосфете 800 вольт как с куста, а 400 как для счетчика вообще не проблема

кстати, вот для общего развития http://www.ecorad.com/articles/kak-ne-obmanutsya-pri-vybore-dozimetra-ra...

на одном сбм-19 для фона меньше 10 минут накопление смысла делать нет, а сбм-20 надо штуки четыре

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Погуглите "бегущее среднее", возможно тоже поможет..

Пардон, "скользящее среднее".

Logik
Offline
Зарегистрирован: 05.08.2014

Гололед. Все бегущее становится скользящим ;)

Спасибо XOR, гляну. Правда я уже из компютерного БП трансформатор выковырял и даже схему прикинул на нем.

Нашел в загашнике девайс. СБМ20 91года есть 2 шт. Поиграюсь ))

XOR
Offline
Зарегистрирован: 25.04.2015

совет: выбирайте побольше, с обмоткой 10 ом фигня, лучше 3-4 ома, и диод не хуже чем HER208, транзистор желательно что-то типа IRF840, от этого сильно зависит потребление, чем выше добротность тем реже придется давать импульсы накачки. кстати, старая совдеповская пленка типа К73-17 лучший выбор))

Logik
Offline
Зарегистрирован: 05.08.2014

мосфет - AO4828 открытый канал не более 0,054Ом, обмотки померял низковольтная 0,2Ом высоковольтная 10Ом. диоды с того же БП FR153, быстрые но обратное только 200В, поставлю два последовательно и постараюсь выше 350В не лазить.

nik182
Offline
Зарегистрирован: 04.05.2015

Ребята. Что вы про среднее тут говорите? Это же счётчик гейгера. Он же единички импульсов дает. Если перейдет в токовый режим, то можно идти на кладбище место бронировать. Посмотрите паспорт. Там число есть - чувствительность. Обычно импульсы в минуту. В размере с палец это обычно 15 в минуту для фона. Так примерно и надо писать. Посчитали импульсы за минуту. Скоректировали на чувствительность. С фоном как хотите.

Logik
Offline
Зарегистрирован: 05.08.2014

Ну как бы да. Но скетч Вы не смотрели ;) Там уже за 10сек импульсы вроде считает. Но это не достаточное усреднение, считает ТС. А я для себя решил, не гоже датчику 26 лет, валятся пора или выкинут или спалить и выкинутьь;) Ну вот и трындим по теме. А шо низя?!  Даже проект наклевывается...

nik182
Offline
Зарегистрирован: 04.05.2015

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Arhat109-2 пишет:

Погуглите "бегущее среднее", возможно тоже поможет..

Пардон, "скользящее среднее".

...иду, скользя, и в мире нет таких вершин, что взять - нельзя... В. Высоцкий (всё таки он гений)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Logik пишет:

Гололед. Все бегущее становится скользящим ;)

Спасибо XOR, гляну. Правда я уже из компютерного БП трансформатор выковырял и даже схему прикинул на нем.

Нашел в загашнике девайс. СБМ20 91года есть 2 шт. Поиграюсь ))

Схему выложишь, как одолеешь, я тоже тогда поиграюсь

gena
Offline
Зарегистрирован: 04.11.2012

  Имею дозиметр "Белла". В нём время подсчёта импульсов около 40 секунд.

http://www.hemul.org/lplaces.com/images/stories/dosimeter/bella_04.jpg

 

Strannic1924
Offline
Зарегистрирован: 30.08.2016

По поводу большой стоимости устройства с алиэкспресс:

1. не у всех есть возможность изготовления аналогичных схем "вручную".

2. посчитайте: стоимость газоразрядной трубки + стоимость почтовой доставки газоразрядной трубки + стоимость печатной платы + стоимость доставки печатной платы (не в каждом малом городке России встретишь магазин радиодеталей, а про села и деревни вообще говорить не приходится) + стоимость разъемов и радиодеталей + стоимость доставки радиодеталей + стоимость припоя ПОС61 + стоимость электроэнергии (работа электропаяльником)... так что не такая и огромная цена у этого устройства... если собирать самому выйдет дешевле, но не у каждого есть возможность и комплектующие...

Надеюсь, что помогут со скетчем...

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Был у меня дозиметр советского производства, собран на логике и счетчиках 176 серии, очень простой алгоритм: счетчик считает  и импульсы ровно 45 сек.  на индикаторах будут высвечиваться  значения в МкР/час., при этом больше ни какой обработки не требуется.

 

Logik
Offline
Зарегистрирован: 05.08.2014

Так чего от логики 176 еще требовать?! Убожество, никакой гибкости. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

У меня датчик СБТ10А, такой годится?

Logik
Offline
Зарегистрирован: 05.08.2014

А ХЗ. Загуглил картинку - прифигел что такое бывает ))

nik182
Offline
Зарегистрирован: 04.05.2015

В соседней теме Дима сделал высокое напряжение. http://arduino.ru/forum/apparatnye-voprosy/arduino-nixie-lampovye-indikatory#comment-137609 Вполне можно и эдесь использовать. Только параметры подобрать.

Logik
Offline
Зарегистрирован: 05.08.2014

Только надао 300-400В а там 180. В принципе мысль интересная, использовать просто дроссель вместо трансформатора. Но думаю не все так просто, выше XOR напомнил про важность низкого сопротивления обмотки, чтоб низкие потери были. Но низкое сопротивление подразумеват малое число витков, или большое сечение провода что габариты ,а мало витков значить большое межвитковое напряжение и риски пробоя. Чтоб избежать нужна изоляция хорошая что тоже габариты. В общем на дросселе  весьма компромисный вариант, вполне может и получится при грамотном подходе, но я уже трансформатор выпаял ;)

XOR
Offline
Зарегистрирован: 25.04.2015

такая штука набивает 0.47 мкф до 400 вольт качков за 50, а то и меньше, помехи от нее на катоде счетчика больше полувольта, импульсы от пробоя около трех вольт, в аноде 5.1М, в катоде 4.7К. борьба с помехами может стать нетривиальной задачей

nik182
Offline
Зарегистрирован: 04.05.2015

Вы характеристику счётчика смотрели? Там полочка вольт на 50-100. Пульсации высокого напряжения на столько ни как ни повлияют на счётчик. Потребление тока микроамперы. Про потери можно не заморачиваться на таких токах. Пробоя как такового нет. Слишком мало носителей заряда внутри счётчика. Ток сильно ограничен. Разряды идут раз в несколько секунд. Какие помехи? Сигнал от разряда настолько больше всех помех вместе взятых, что ничего особенного предпринимать не надо.      

http://gstube.com/data/2398/

XOR
Offline
Зарегистрирован: 25.04.2015

теоретик? еще раз, на 4,7к сигнал от разряда, как вы выразились, 3 вольта, помеха от накачки 500-800мв, счетчик сбм-19.

Strannic1924
Offline
Зарегистрирован: 30.08.2016

Делаю замеры устройством в квартире показывает:

1. 0,2923 мкЗв/ч

2. 0,2436 мкЗв/ч

3. 0,3898 мкЗв/ч

4. 0,1462 мкЗв/ч

5. 0,2923 мкЗв/ч

6. 0,0974 мкЗв/ч

7. 0,1949 мкЗв/ч

8. 0,1462 мкЗв/ч

9. 0,3898 мкЗв/ч

10. 0,2436 мкЗв/ч

Приходится суммировать вручную, делить на число показаний получаем среднее значение 0,24 мкЗв/ч. Что неудобно. Как оптимизировать скетч, чтоб МК делал это сам?...

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Strannic1924 пишет:

Делаю замеры устройством в квартире показывает:

1. 0,2923 мкЗв/ч

2. 0,2436 мкЗв/ч

3. 0,3898 мкЗв/ч

4. 0,1462 мкЗв/ч

5. 0,2923 мкЗв/ч

6. 0,0974 мкЗв/ч

7. 0,1949 мкЗв/ч

8. 0,1462 мкЗв/ч

9. 0,3898 мкЗв/ч

10. 0,2436 мкЗв/ч

Приходится суммировать вручную, делить на число показаний получаем среднее значение 0,24 мкЗв/ч. Что неудобно. Как оптимизировать скетч, чтоб МК делал это сам?...

 

 

Может так?
 

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  <a href="http://www.libelium.com" title="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a> 
 *  
 *  This program is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version. 
 *  a
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License 
 *  along with this program.  If not, see <a href="http://www.gnu.org/licenses/" title="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>. 
 *  
 *  Version:           3.0
 *  Design:            David Gascón 
 *  Implementation:    Marcos Yarza
 */
 
// include the library code:
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 
 
// initialize the library with the numbers of the interface pins
LiquidCrystal_I2C lcd(0x27,16,2);
 
// Threshold values for the led bar
#define TH1 45
#define TH2 95
#define TH3 200
#define TH4 400
#define TH5 600
 
// Conversion factor - CPM to uSV/h
#define CONV_FACTOR 0.00812
 
// Variables
int ledArray [] = {10,11,12,13,9};
int geiger_input = 2;
long count = 0;
long countPerMinute = 0;
long timePrevious = 0;
long timePreviousMeassure = 0;
long time = 0;
long countPrevious = 0;
float radiationValue = 0.0;

static unsigned long G;  // для цифрового фильтра
 
void setup(){
  pinMode(geiger_input, INPUT);
  digitalWrite(geiger_input,HIGH);
  for (int i=0;i<5;i++){
    pinMode(ledArray[i],OUTPUT);
  }
 
  Serial.begin(19200);
 
  //set up the LCD\'s number of columns and rows:
  lcd.init(); 
  lcd.backlight();// Включаем подсветку дисплея
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Radiation Sensor");
  lcd.setCursor(0,1);
  lcd.print("Board - Arduino");  
  delay(1000);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Cooking Hacks");
  delay(1000);
 
  lcd.clear();
  lcd.setCursor(0,1);  
  lcd.print("www.cooking-hacks.com");
  delay(500);
  for (int i=0;i<5;i++){
    delay(200);  
    lcd.scrollDisplayLeft();
  }
  delay(500);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  - Libelium -");
  lcd.setCursor(0,1);
  lcd.print("www.libelium.com");    
  delay(1000);
 
  lcd.clear();  
  lcd.setCursor(0, 0);
  lcd.print("CPM=");
  lcd.setCursor(4,0);
  lcd.print(6*count);
  lcd.setCursor(0,1);
  lcd.print(radiationValue);
 
  attachInterrupt(0,countPulse,FALLING);
 
}
 
void loop(){
  if (millis()-timePreviousMeassure > 10000){
    countPerMinute = 6*count;
    radiationValue = countPerMinute * CONV_FACTOR;
    timePreviousMeassure = millis();
    
    // пропустим через цифровой фильтр 1 порядка
    D_rs=radiationValue;
    G+=D_rs-(G>>8);
    D_rs=G>>8;
    
    Serial.print("cpm = "); 
    Serial.print(countPerMinute,DEC);
    Serial.print(" - ");
    Serial.print("uSv/h = ");
    Serial.println(radiationValue,4);      
    lcd.clear();    
    lcd.setCursor(0, 0);
    lcd.print("CPM=");
    lcd.setCursor(4,0);
    lcd.print(countPerMinute);
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(6,1);
    lcd.print(D_rs,4);
 
    //led var setting  
    if(countPerMinute <= TH1) ledVar(0);
    if((countPerMinute <= TH2)&&(countPerMinute>TH1)) ledVar(1);
    if((countPerMinute <= TH3)&&(countPerMinute>TH2)) ledVar(2);
    if((countPerMinute <= TH4)&&(countPerMinute>TH3)) ledVar(3);
    if((countPerMinute <= TH5)&&(countPerMinute>TH4)) ledVar(4);
    if(countPerMinute>TH5) ledVar(5);
 
    count = 0;
 
  }
 
}
 
void countPulse(){
  detachInterrupt(0);
  count++;
  while(digitalRead(2)==0){
  }
  attachInterrupt(0,countPulse,FALLING);
}
 
void ledVar(int value){
  if (value > 0){
    for(int i=0;i<=value;i++){
      digitalWrite(ledArray[i],HIGH);
    }
    for(int i=5;i>value;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
  else {
    for(int i=5;i>=0;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
}

 

Strannic1924
Offline
Зарегистрирован: 30.08.2016

При проверке вышеуказанного скетча, выдает ошибку, в среде arduino 1.0.3:

D_rs was not declared in this score

sketch_feb11a.ino: In function void loop ():

sketch_feb11a.ino:115:error: D_rs was not declared in this score

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

И что? Дописать в начале строки 115 слово float (или auto) не судьба?

Strannic1924
Offline
Зарегистрирован: 30.08.2016

C float в начале строки 115 компилируется.

Но при работе также выдает разные значения и еще пишет четыре нуля впереди

К примеру  : 

0.1949 . 0000  мкЗв/ч

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Это уже к автору, я не знаю, что он вообще делает :)

nik182
Offline
Зарегистрирован: 04.05.2015

XOR пишет:
теоретик? еще раз, на 4,7к сигнал от разряда, как вы выразились, 3 вольта, помеха от накачки 500-800мв, счетчик сбм-19.

....0.47 мкф до 400 вольт качков за 50, а то и меньше, помехи от нее на катоде счетчика больше полувольта, импульсы от пробоя около трех вольт, в аноде 5.1М, в катоде 4.7к

Отнюдь. Практик, которого ещё в советском институте научили читать даташиты перед использованием компонент и считать токи и напряжения схемы. Если на 400 вольт поставить делитель 5М на 4.7К получим: 400*4700/(5000000+4700)=0.37 вольта. Раскажите мне как вы 3 вольта получаете? Вот фото советского дивайса которым жена иногда проверяет продукты. Изредка его приходится приводить в чувство - пропаивать. На фото хорошо видно, что делитель 5М на 100К. На выходе импульс 6 вольт. Наводок нет. Считает 1 минуту. Получаем от 10 до 18 счетов. На продуктах из Белларуссии бывает до 22. Около калиброванного источника радиоактивного железа около сотни.

XOR
Offline
Зарегистрирован: 25.04.2015

ок, открываем схему на беллу, я не знаю что это на картинке но пусть будет она, там 4,7М и 10к, импульсы на вход кмоп логики с питанием 9 вольт, значит амплитуда импульсов должна быть вольт 5, но
400*10000/(4700000+10000)=0.85 вольт, упсссс....
досадная оплошность легко решается конденсатором 4.7п параллельно резистору

nik182
Offline
Зарегистрирован: 04.05.2015

У меня не Белла, Горизонт. Стоит 100К. Конденсатора нет. И во многих схемах дозиметров его тоже нет. Про него в ваших постах ничего не было.  Счетчик гейгера вне пробоя имеет сопротивление больше 100М. Откуда наводка на резисторе 4.7К? Параллельно счётчику гейгера ещё конденсатор висит?

Хорошо. Конденсатор может дать по мозгам резистору, но тогда фронт импульса будет как раз равен напряжению питания,т.е 400 вольт. Дальше его конечно ограничат, но зачем такие экстремальные нагрузки?   

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Strannic1924 пишет:

C float в начале строки 115 компилируется.

Но при работе также выдает разные значения и еще пишет четыре нуля впереди

К примеру  : 

0.1949 . 0000  мкЗв/ч

Может LOGIK поможет, я выдрал из своего скетча, можно ли сделать цифровой фильтр первого порядка если используется не unsigned long а float понятия не имею, но код точно не правильный, так как идет преобразование в  unsigned long ((( ...я думал вам идеи достаточно...
Что-то подсказывает, что нельзя...остается  суммуровать в эту переменную, подсчитывать количество слагаемых, и после десятка измерений разделить на это количество и вывести на экран

Нашёл статью по цифровым фильтрам, из неё следует, что попробовать то можно, для этого надо float перевести в long, к примеру умножив на 10000

А может сделать еще проще?
 

void loop(){
  if (millis()-timePreviousMeassure > 10000){
    countPerMinute = 6*count;
    radiationValue = countPerMinute * CONV_FACTOR;
    timePreviousMeassure = millis();
    
    /* пропустим через цифровой фильтр 1 порядка
    D_rs=radiationValue;
    G+=D_rs-(G>>8);
    D_rs=G>>8;

точнее наверное так
    D_rs=count;
    G+=D_rs-(G>>8);
    D_rs=G>>8;
     D_rs=D_rs*6; //усредненное в минуту а дальше преобразовать и вывести на дисплей
*/
 Или так:
  if (D_rs >0) {
D_rs =(D_rs+radiationValue)/2;}
else { D_rs=radiationValue;}

 

Strannic1924
Offline
Зарегистрирован: 30.08.2016

Ругается на функцию D_rs выдает ошибку указанную выше в посте 40

gena
Offline
Зарегистрирован: 04.11.2012

    Как по мне, так делать как в "Белла". С помощью таймера - счётчика, аппаратно, за 40 секунд подсчитать импульсы. Всё.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Strannic1924 пишет:

Ругается на функцию D_rs выдает ошибку указанную выше в посте 40

 на переменную, ну так её объявить перед использованием надо, вам же уже выше писали, здесь она будет unsigned long

В версии 1.8.0 откомпилировалось однако! Перенёс некоторые функции в начало, объявлены  до использования, добавил строку для моей библиотеки LCD
 

Попробуйте, это с цифровым фильтром 1-го порядка, самому попробовать не на чем, только в планах
 

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  <a href="http://www.libelium.com" title="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a> 
 *  
 *  This program is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version. 
 *  a
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details.
 *  
 *  You should have received a copy of the GNU General Public License 
 *  along with this program.  If not, see <a href="http://www.gnu.org/licenses/" title="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>. 
 *  
 *  Version:           3.0
 *  Design:            David Gascón 
 *  Implementation:    Marcos Yarza
 */
 
// include the library code:
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 
 
// initialize the library with the numbers of the interface pins
LiquidCrystal_I2C lcd(0x27,16,2);
 
// Threshold values for the led bar
#define TH1 45
#define TH2 95
#define TH3 200
#define TH4 400
#define TH5 600
 
// Conversion factor - CPM to uSV/h
#define CONV_FACTOR 0.00812
 
// Variables
int ledArray [] = {10,11,12,13,9};
int geiger_input = 2;
long count = 0;
long countPerMinute = 0;
long timePrevious = 0;
long timePreviousMeassure = 0;
long time = 0;
long countPrevious = 0;
float radiationValue = 0.0;

static unsigned long G;  // для цифрового фильтра
long D_rs =0; // В этой переменной накапливаем счётчик для циф. обработки
float D_rsf = 0.0; // переменная для расчётной средней

void countPulse(){
  detachInterrupt(0);
  count++;
  while(digitalRead(2)==0){
  }
  attachInterrupt(0,countPulse,FALLING);
}
 
void ledVar(int value){
  if (value > 0){
    for(int i=0;i<=value;i++){
      digitalWrite(ledArray[i],HIGH);
    }
    for(int i=5;i>value;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
  else {
    for(int i=5;i>=0;i--){
      digitalWrite(ledArray[i],LOW);
    }
  }
}

void setup(){
  pinMode(geiger_input, INPUT);
  digitalWrite(geiger_input,HIGH);
  for (int i=0;i<5;i++){
    pinMode(ledArray[i],OUTPUT);
  }
 
  Serial.begin(19200);
 
  //set up the LCD\'s number of columns and rows:
 // lcd.begin(16,2); 
  lcd.init(); 
  lcd.backlight();// Включаем подсветку дисплея
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Radiation Sensor");
  lcd.setCursor(0,1);
  lcd.print("Board - Arduino");  
  delay(1000);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(" Cooking Hacks");
  delay(1000);
 
  lcd.clear();
  lcd.setCursor(0,1);  
  lcd.print("www.cooking-hacks.com");
  delay(500);
  for (int i=0;i<5;i++){
    delay(200);  
    lcd.scrollDisplayLeft();
  }
  delay(500);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  - Libelium -");
  lcd.setCursor(0,1);
  lcd.print("www.libelium.com");    
  delay(1000);
 
  lcd.clear();  
  lcd.setCursor(0, 0);
  lcd.print("CPM=");
  lcd.setCursor(4,0);
  lcd.print(6*count);
  lcd.setCursor(0,1);
  lcd.print(radiationValue);
 
  attachInterrupt(0,countPulse,FALLING);
 
}
 
void loop(){
  if (millis()-timePreviousMeassure > 10000){
    countPerMinute = 6*count;
    radiationValue = countPerMinute * CONV_FACTOR;
    timePreviousMeassure = millis();
    
    // пропустим через цифровой фильтр 1 порядка
    D_rs=count;
    G+=D_rs-(G>>8);
    D_rs=G>>8;
    count = count * 6;
    D_rsf = count * CONV_FACTOR;
    
    
    Serial.print("cpm = "); 
    Serial.print(countPerMinute,DEC);
    Serial.print(" - ");
    Serial.print("uSv/h = ");
    Serial.println(radiationValue,4);      
    lcd.clear();    
    lcd.setCursor(0, 0);
    lcd.print("CPM=");
    lcd.setCursor(4,0);
    lcd.print(countPerMinute);
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(6,1);
    lcd.print(D_rsf);
 
    //led var setting  
    if(countPerMinute <= TH1) ledVar(0);
    if((countPerMinute <= TH2)&&(countPerMinute>TH1)) ledVar(1);
    if((countPerMinute <= TH3)&&(countPerMinute>TH2)) ledVar(2);
    if((countPerMinute <= TH4)&&(countPerMinute>TH3)) ledVar(3);
    if((countPerMinute <= TH5)&&(countPerMinute>TH4)) ledVar(4);
    if(countPerMinute>TH5) ledVar(5);
 
    count = 0;
 
  }
 
}