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

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

Для каждого датчика свои секунды. Зависят в первом приближении от размера. Для СБМ 19 - 20 -21 соотношение времён 1-4-40. Так что время счёта надо выбирать по даташиту. Иначе можно сосчитать совсем не то.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

nik182 пишет:
Для каждого датчика свои секунды. Зависят в первом приближении от размера. Для СБМ 19 - 20 -21 соотношение времён 1-4-40. Так что время счёта надо выбирать по даташиту. Иначе можно сосчитать совсем не то.

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

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

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

А чего тут обяснять, на плавающей запятой все еще проще.

Пусть A - входной сигнал, а K- некоторый малый коэффициент фильтрации, например 0,01 чем он меньше, тем сильней фильтрует.

Тогда выходной сигнал B на каждом проходе будет как 

B=B*(1-K)+A*K

Значение B понятное дело между проходами сохраняется.

Даже проще формула чем для целых, т.к. для них оптимизировано сильно: перевод в формат с фиксированой точкой, умножения и деления сдвигами.

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

Попробовал скетч из поста 50, компилируется. Только работает не корректно, на мой взгляд :

- больше стал разброс показаний, чем был до этого,

-показывает среднее значение только для текущего результата (т.е. не считает среднее значение результатов),

-слепливает цифры текущего и среднего значения (не хватает пробела между ними),

-не пишет единицы измерения (мкЗв/ч)

Т.е. выдает такие значения:

CPM=30

0.24360.24

CPM=42

0.34100.34 

И так далее...

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Строки 161 и 162 поправьте

приблизительно так, отображаю, что влезло, надо больше информации дисплей заменить на 2004А, а вообще измерение кривое, накапливаем показания счётчика в течении 10 секунд, умножаем на 6, дескать сколько за минуту, умножаем на коэффициент и, повторяем цикл для следующих 10 секунд, всё высасывается из пальца

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  <a href="<a href="<a data-cke-saved-href="http://www.libelium.com" href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a data-cke-saved-href="http://www.libelium.com" href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" title="<a href="<a data-cke-saved-href="http://www.libelium.com" href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a data-cke-saved-href="http://www.libelium.com" href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a data-cke-saved-href="http://www.libelium.com" href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a data-cke-saved-href="http://www.libelium.com" href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></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="<a href="<a data-cke-saved-href="http://www.gnu.org/licenses/" href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a data-cke-saved-href="http://www.gnu.org/licenses/" href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" title="<a href="<a data-cke-saved-href="http://www.gnu.org/licenses/" href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a data-cke-saved-href="http://www.gnu.org/licenses/" href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a data-cke-saved-href="http://www.gnu.org/licenses/" href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a data-cke-saved-href="http://www.gnu.org/licenses/" href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></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(8,1);
    lcd.print(D_rsf,4);
    lcd.print(" mr");
 
    //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;
 
  }
 
}
 

 

   

 

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

Скетч с поста 55, работает так:

CPM=30

0.24360  0.2400 m

CPM=42

0.34100  0.3400 m

И так далее... т.е. не корректно:

-показывает среднее значение только для текущего результата (т.е. не считает среднее значение результатов),

- не влазит обозначение измеряемых величин (мкЗв/ч) на экране дисплея, понятно, что нужен другой LCD.

Вообщем исходный скетч (пост 11) работает лучше.

По поводу, что исходный скетч (пост 11) некорретно считает, данный скетч рассчитан на работу с газоразрядной лампой  J305ß, об это здесь и написано:

https://www.cooking-hacks.com/documentation/tutorials/geiger-counter-radiation-sensor-board-arduino-raspberry-pi-tutorial/

Понятно, что у прибора есть погрешность (она есть у каждой газоразрядной лампы), но в целом я думаю, показывает корректно.

Спасибо ua6em что пытались помочь. 

 

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

Пробовал еще такой скетч:

/*Serial Communication for Radiation Detector Arduino Compatible DIY Kit ver 2.01 or higher
* http://radiohobbystore.com/radiation-detector-geiger-counter-diy-kit-second-edition.html
* Allow to connect the kit to computer and use the kit with Radiation Logger PC software
* http://radiohobbystore.com/radiation-logger/
* This Arduino sketch written by Alex Boguslavsky RH Electronics; mail: support@radiohobbystore.com
* CPM counting algorithm is very simple, it just collect GM Tube events during presettable log period.
* For radiation monitoring station it's recommended to use 30-60 seconds logging period. Feel free to modify
* or add functions to this sketch. This Arduino software is an example only for education purpose without any
* warranty for precision radiation measurements. You are fully responsible for your safety in high
* radiation area!!
* --------------------------------------------------------------------------------------
* WHAT IS CPM?
* CPM (or counts per minute) is events quantity from Geiger Tube you get during one minute. Usually it used to 
* calculate a radiation level. Different GM Tubes has different quantity of CPM for background. Some tubes can produce
* about 10-50 CPM for normal background, other GM Tube models produce 50-100 CPM or 0-5 CPM for same radiation level.
* Please refer your GM Tube datasheet for more information. Just for reference here, SBM-20 can generate 
* about 10-50 CPM for normal background.
* --------------------------------------------------------------------------------------
* HOW TO CONNECT GEIGER KIT?
* The kit 3 wires that should be connected to Arduino UNO board: 5V, GND and INT. PullUp resistor is included on
* kit PCB. Connect INT wire to Digital Pin#2 (INT0), 5V to 5V, GND to GND. Then connect the Arduino with
* USB cable to the computer and upload this sketch. 
*/


#include <SPI.h>
#define LOG_PERIOD 15000  //Logging period in milliseconds, recommended value 15000-60000.
#define MAX_PERIOD 60000  //Maximum logging period without modifying this sketch

unsigned long counts;     //variable for GM Tube events
unsigned long cpm;        //variable for CPM
unsigned int multiplier;  //variable for calculation CPM in this sketch
unsigned long previousMillis;  //variable for time measurement



void tube_impulse(){       //subprocedure for capturing events from Geiger Kit
  counts++;
}

void setup(){             //setup subprocedure
  counts = 0;
  cpm = 0;
  multiplier = MAX_PERIOD / LOG_PERIOD;      //calculating multiplier, depend on your log period
  Serial.begin(9600);
  attachInterrupt(0, tube_impulse, FALLING); //define external interrupts 
  
}

void loop(){                                 //main cycle
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > LOG_PERIOD){
    previousMillis = currentMillis;
    cpm = counts * multiplier;
    
    Serial.print(cpm);
    counts = 0;
  }
  
}




В мониторе порта получаем значения в СРМ *0,00812 (конв. фактор в моем случае) и получаем значения в мкЗв/ч.

Вообщем сделал 10 замеров, посчитал средний результат 0,22 мкЗв/ч

Потом залил скетч из поста 11, сделал 10 замеров, посчитал средний результат 0,21 мкЗв/ч.

Поэтому полагаю прибор отображает фон корректно (естественно, в рамках своей погрешности).

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Для того, чтобы цифровой фильтр заработал правильно нужно накопить некоторое количество данных, дайте замеров 100 хотя бы, это 15 минут работы скетча (6 замеров в минуту), или среднее арифметическое между предыдущим средним и текущим измерением, кусок кода был ниже цифрового кода, я как бы и для себя пытаюсь определить, хочу на имеющемся  датчике сделать ))) или суммировать все замеры и подсчитывать их количество и выводить среднее, вариантов масса

PS меня настораживает когда на 10 секундном интервале измерения показания разнятся между 0.24 и 0.34, это катастрофически много, при этом реальные измерения ведутся только 1/6 времени, а остальное получается расчётным путём, это даже не усреднение )))
Вопрос, может ли датчик работать в круглосуточном режиме (постоянно) без деградации?

если да, то ничто не мешает накапливать все импульсы

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

Не знаю, смотрел в нете разные видео (с аналогичными схемами) практически везде при измерениях показания скачут на 12 и более cpm.

Наберите geiger kit в гугле (вкладка видео) или на ютубе...

Я использую устройство не в режиме постоянного мониторинга, а для проверки естественного фона, т.е включаю - получаю 10 показаний, вычисляю средний результат...

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

А можете включить минут на 10? Интересно, что покажет цифровой фильтр при стольких измерениях

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

ua6em пишет:

nik182 пишет:
Для каждого датчика свои секунды. Зависят в первом приближении от размера. Для СБМ 19 - 20 -21 соотношение времён 1-4-40. Так что время счёта надо выбирать по даташиту. Иначе можно сосчитать совсем не то.

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

Судя по отчётам интернета он набирает 160 импульсов в минуту на фоне. Это соответствует 15 милиР/час. Т.е. или набирать минуту иделить на 10, или набирать 6 секунд, но будет скакать. Возможны промежуточные варианты - набирать 30 секунд делить на 5 и получать сразу милирентгены в час.  

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Меня устроит минута, тогда можно запустить круглосуточный режим, если он это позволяет, второе, на счётчике металлическая крышка, её снимать или через неё идут измерения?

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

  По моим наблюдениям, естественный фон не даёт достаточно стабильно повторяющихся срабатываний счётчика. Т.е. интервалы времени между приходящими частицами не постоянны. Именно поэтому измеряют количество импульсов за длительный промежуток времени. Обычно имею 12...15 импульсов за сорок секунд. Если есть радиоактивный материал, то сработка дозиметра более интенсивна, но всё равно хаотична.

   Относительно крышки надо читать тех. описание на датчик. Или провести натурные испытания.

http://shaddack.brutowave.com/projects/hw_PancakeGeiger/

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

gena пишет:

  По моим наблюдениям, естественный фон не даёт достаточно стабильно повторяющихся срабатываний счётчика. Т.е. интервалы времени между приходящими частицами не постоянны. Именно поэтому измеряют количество импульсов за длительный промежуток времени. Обычно имею 12...15 импульсов за сорок секунд. Если есть радиоактивный материал, то сработка дозиметра более интенсивна, но всё равно хаотична.

   Относительно крышки надо читать тех. описание на датчик. Или провести натурные испытания.

http://shaddack.brutowave.com/projects/hw_PancakeGeiger/

За схему спасибо, осталось придумать как импульсы снимать для ардуины

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

  А что там придумывать? По приведённой схеме, с коллектора правого транзистора, на какой либо pin ардуины. Я бы поставил между коллектором и ардуиной резистор килоом в двадцать (кто знает какие выбросы из-за динамика?). Вероятнее через прерывания. Всё.

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

Скетч с поста 55, на 11 минуте работы счетчика, записал 10 показаний:

1. СРМ=18

0,1462    0,1462 м

2. СРМ=48 

0,3898   0,3898 м

3. СРМ=30

0,2436   0,2436 м

4. СРМ=12

0,0974   0,0974 м 

5. СРМ=18

0,1462   0,1462 м

6. СРМ=36

0,2923    0,2923 м

7. СРМ=42

0,3410   0,3410 м

8. СРМ=36

0,2923   0,2923 м

9. СРМ=24

0,1949   0,1949 м

10. СРМ=30

0,2436   0,2436 м

Среднее значение из десяти измерений 0,24 мкЗв/ч

Как видим цифровой фильтр не работает (или работает не правильно). 

Вывод: пользуемся скетчем из поста 11 для работы.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

А вот такой вариант попробуйте

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  <a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" title="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></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="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" title="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></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; */

     if (D_rsf >0) {
     D_rsf =(D_rsf+radiationValue)/2;}
     else { D_rsf=radiationValue;}
  
    
    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(8,1);
    lcd.print(D_rsf,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;
 
  }
 
}
 

 

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

Запустил скетч из поста 67.

10 замеров:

1. cpm=36

0,2923   0,2923

2. срм=66

0,5359   0,4141

3. срм=36

0,2923   0,3532

4. срм=24

0,1949   0,2741

5. срм=18

0,1462   0,2101

6. срм=24

0,1949  0,1865

7. срм=18

0,1462  0,1663

8. срм=24

0,1949   0,1806

9. срм=30

0,2436  0,2121

10. срм=30

0,2436  0,2279

Вроде работает корректно?... Правда разбег показаний между измерениями стал больше...

А как в скетче указать, чтобы над средним значением писал единицы измерения (мкЗв/ч), т.к. место есть...

выдает результаты так:

срм=30

0,2436     0,2279

Вообще меня интересует больше значения мкЗв/ч, а не срм. Срм можно вообще не выводить наверное...

ua6em, спасибо Вам огромное, что помогаете! Доброго здравия Вам и вашим близким и родным людям на долгие - долгие годы.

Не много не в тему (офтоп):

ua6em, судя по никнейм, Вы радиолюбитель и это Ваш позывной.

Имеется радиостанция YAESU VX-3R

по какой схеме (попроще) получить 4 (или 3) категорию радиолюбителя и зарегистрировать средство связи, получить позывной?..

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Код здесь
 

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  <a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" title="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></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="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" title="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></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();
    
// вычисляем среднее с предыдущим средним )))
     if (D_rsf >0) {
     D_rsf =(D_rsf+radiationValue)/2;}
     else { D_rsf=radiationValue;}
  
 // и выводим в порт и на дисплей   
    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(8,0);
    lcd.print("uSv/h");
    
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(8,1);
    lcd.print(D_rsf,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;
 
  }
 
}
 

Вы сами откуда? Дам координаты с кем связаться, процедура не сложная за неделю-две можно оформиться

 

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

 

Скетч работает. Единственное, что смущает - разбег показаний, стал больше, может показывать 6 cpm, а затем 66 cpm, при условии, что замеряем естественный фон. Ну и соответственно от того пляшут текущие и средние значения. А проверить прибор не с чем... 

Сам я из г. Саянска Иркутская обл.

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

Strannic1924 пишет:

Сам я из г. Саянска Иркутская обл.

Знакомые ж места до чего!

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

Кстати если использовать скетч с поста 57, то показания можно смотреть не только в мониторе порта, но есть еще и специальная программа для OS windows - Radiation Logger, здесь  http://www.rhelectronics.net/store/radiation-logger.html

Проверял программа работает.

 

 , 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Да вроде и эта должна, если чуток поправить )))

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  <a href="<a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a>" title="<a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a>" rel="nofollow"><a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a></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="<a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a>" title="<a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a>" rel="nofollow"><a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a></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(9600);
 
  //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();
    
// вычисляем среднее с предыдущим средним )))
     if (D_rsf >0) {
     D_rsf =(D_rsf+radiationValue)/2;}
     else { D_rsf=radiationValue;}
  
 // и выводим в порт и на дисплей   
  //  Serial.print("cpm = "); 
    Serial.print(countPerMinute);
   // 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(8,0);
    lcd.print("uSv/h");
    
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(8,1);
    lcd.print(D_rsf,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;
 
  }
 
}
 

 

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

Скетч с поста 73 имеет чуть меньше разброс показаний (а может и нет, нужно долго тестить), но всеравно разброс присутствует.

Остановился пока на таком компромиссе, между временем измерений (скоростью) и точностью.

Скетч

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  <a href="<a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a>" title="<a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a>" rel="nofollow"><a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a></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="<a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a>" title="<a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a>" rel="nofollow"><a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a></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 > 20000){
    countPerMinute = 3*count;
    radiationValue = countPerMinute * CONV_FACTOR;
    timePreviousMeassure = millis();
    
// вычисляем среднее с предыдущим средним )))
     if (D_rsf >0) {
     D_rsf =(D_rsf+radiationValue)/2;}
     else { D_rsf=radiationValue;}
  
 // и выводим в порт и на дисплей   
    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(8,0);
    lcd.print("uSv/h");
    
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(8,1);
    lcd.print(D_rsf,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;
 
  }
 
}
 

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

По оформлению, обратитесь к Гаврилову Антону Геннадьевичу ra0sms(at)bk.ru, думаю поможет

По скетчу:

а так будет абсолютно точно )))
 

 if (millis()-timePreviousMeassure >=60000){
    countPerMinute = count;
    radiationValue = countPerMinute * CONV_FACTOR;
    timePreviousMeassure = millis();
    count = 0; // счетчик обнулим тут, для правильности счёта, вывод на экран ведь время занимает



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

Спасибо. 

Только так долго ждать показаний придется, если в режиме постоянного мониторинга- не страшно, а в режиме оперативного мониторинга - плохо. 

Замерил, сейчас фон в квартире (скетч с поста 75), через минуту с небольшим выдал:

0,22 мкЗв/ч (Вообщем оставлю этот вариант скетча пока).

Кстати, согласно норм радиационной безопасности НРБ-99/2009 Санпин 2.6.1-2523-09, для населения допускаяется уровень облучения не более 1 миллизиверта в год, что примерно равно 0,57 мкЗв/ч.

Всем доброго здравия. Спасибо.

 

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

Вообщем потестил скетч, работает 

Код: 

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  <a href="<a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a>" title="<a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a>" rel="nofollow"><a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a></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="<a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a>" title="<a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a>" rel="nofollow"><a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a></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 >=60000){
   countPerMinute = count;
   radiationValue = countPerMinute * CONV_FACTOR;
   timePreviousMeassure = millis();
   count = 0; // счетчик обнулим тут, для правильности счёта, вывод на экран ведь время занимает

    
// вычисляем среднее с предыдущим средним )))
     if (D_rsf >0) {
     D_rsf =(D_rsf+radiationValue)/2;}
     else { D_rsf=radiationValue;}
  
 // и выводим в порт и на дисплей   
    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(8,0);
    lcd.print("uSv/h");
    
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(8,1);
    lcd.print(D_rsf,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;
 
  }
 
}
 

 

Единственный недостаток: 

- т.к.  первый результат, при включении, он выдает 0,0000 (независимо от модернизаций скетча), то приходится ждать две минуты чтобы получить значение фона, далее значения фона меняются с интервалом в минуту.

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

Strannic1924 пишет:

Кстати, согласно норм радиационной безопасности НРБ-99/2009 Санпин 2.6.1-2523-09, для населения допускаяется уровень облучения не более 1 миллизиверта в год, что примерно равно 0,57 мкЗв/ч.

Чегото тут не так. Год 365*24=8760 часов, 0,001Зв/8760=0,11мкЗв, Памятуя что Зв в сто раз крупней рентгена 0,11мкЗв/ч=11мкР/ч что как раз возле привычного 10-15мкР/ч. А 0,22 - мкЗв/ч это ж в 2 раза выше фон! Бегите, если успеете прочитать это ;)

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

175 строку уберите, два раза не надо скидывать счётчик, за это время (вывод на дисплей и в порт) значение уже могло набежать

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

Logik пишет:

Strannic1924 пишет:

Кстати, согласно норм радиационной безопасности НРБ-99/2009 Санпин 2.6.1-2523-09, для населения допускаяется уровень облучения не более 1 миллизиверта в год, что примерно равно 0,57 мкЗв/ч.

Чегото тут не так. Год 365*24=8760 часов, 0,001Зв/8760=0,11мкЗв, Памятуя что Зв в сто раз крупней рентгена 0,11мкЗв/ч=11мкР/ч что как раз возле привычного 10-15мкР/ч. А 0,22 - мкЗв/ч это ж в 2 раза выше фон! Бегите, если успеете прочитать это ;)

Да, действительно, я ошибся . 1 миллиЗиверт/год=0,11 мкЗв/ч. А 0,57 мкЗв/ч=5 миллиЗиверт/год.

Что то я запутался в этих нормативных документах. Для каждой местности,наверное своя норма. У нас, наверное, 0,2 - 0,22 мкЗв/ч это норма в панельном 5-ти этажном доме на 1 этаже. Вообщем скажите сколько нормально и в каком нормативе это определено, для естественного радиационного фона?..    http://ruskline.ru/analitika/2011/04/01/pochemu_irkutskaya_oblast_sejchas_vymiraet/

http://irkobl.ru/sites/ecology/%D0%94%D0%BE%D0%BA%D0%BB%D0%B0%D0%B4_2015...

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

ua6em пишет:

175 строку уберите, два раза не надо скидывать счётчик, за это время (вывод на дисплей и в порт) значение уже могло набежать

Убрал.

Такой код. 

/*  
 *  Geiger Counter - Radiation Sensor Board
 *  
 *  Copyright (C) Libelium Comunicaciones Distribuidas S.L. 
 *  <a href="<a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a>" title="<a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a>" rel="nofollow"><a href="<a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a>" rel="nofollow"><a href="<a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a>" rel="nofollow"><a href="http://www.libelium.com" rel="nofollow">http://www.libelium.com</a></a></a></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="<a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a>" title="<a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a>" rel="nofollow"><a href="<a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a>" rel="nofollow"><a href="<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>" rel="nofollow"><a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a></a></a></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 >=60000){
   countPerMinute = count;
   radiationValue = countPerMinute * CONV_FACTOR;
   timePreviousMeassure = millis();
   count = 0; // счетчик обнулим тут, для правильности счёта, вывод на экран ведь время занимает

    
// вычисляем среднее с предыдущим средним )))
     if (D_rsf >0) {
     D_rsf =(D_rsf+radiationValue)/2;}
     else { D_rsf=radiationValue;}
  
 // и выводим в порт и на дисплей   
    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(8,0);
    lcd.print("uSv/h");
    
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(8,1);
    lcd.print(D_rsf,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);
 
 
  }
 
}
 

Но почему то не помогло. При включении - пишет информацию о разработчиках (заложенную для отображения в скетче), затем пишет:

срм=0

0,00

Затем по истечении минуты от включения пишет:

 срм=0     uSV/h

0,0000     0,0000

И затем по истечении еще минуты выдает текущее значение.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

весь скетч я точно не смотрел ))) попробую, но не обещаю, что смогу, тут бы кому из гуру подключиться

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

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

Хотел сравнить показания на улице с данными местной метеостанции, позвонил, спросил, а в ответ:

-данные о радиационном фоне, не предоставляются, только по официальному запросу...

На сайте народного мониторинга можно поглядеть данные с любительских станций. https://narodmon.ru/

ZIA
ZIA аватар
Offline
Зарегистрирован: 04.02.2017

В скетче очень много лишнего, может стоит оптимизировать убрав весь пиар разработчика оставив лаконическую сущность, тогда и читаться будет лучше

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

LOGIK - ты на трансформаторе запустил 400 вольтовый источник?

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

Нет. Еще смотрю на него задумчивым взглядом. Мосфет в SOT-8, без платки не удобно с ним. Да и другой работы валом, всера с JS день не вылазил %)   Но думаю на выходных займусь. Еще смущает что датчик выпуска 1991г, а а заявленый срок эксплуатации 4 года. Немножко так просрочен ))) Но надо пробовать.

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

ZIA пишет:

В скетче очень много лишнего, может стоит оптимизировать убрав весь пиар разработчика оставив лаконическую сущность, тогда и читаться будет лучше

Вот кто бы еще помог бы это сделать?.. 

Я пока только такую оптимизацию кода сумел сделать:


Код: 

/*  
 *  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. 
 *  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("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 >=60000){
   countPerMinute = count;
   radiationValue = countPerMinute * CONV_FACTOR;
   timePreviousMeassure = millis();
   count = 0; // счетчик обнулим тут, для правильности счёта, вывод на экран ведь время занимает

    
// вычисляем среднее с предыдущим средним )))
     if (D_rsf >0) {
     D_rsf =(D_rsf+radiationValue)/2;}
     else { D_rsf=radiationValue;}
  
 // и выводим в порт и на дисплей   
    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(8,0);
    lcd.print("uSv/h");
    
    lcd.setCursor(0,1);
    lcd.print(radiationValue,4);
    lcd.setCursor(8,1);
    lcd.print(D_rsf,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);
 
 
  }
 
}
 

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Logik пишет:

Нет. Еще смотрю на него задумчивым взглядом. Мосфет в SOT-8, без платки не удобно с ним. Да и другой работы валом, всера с JS день не вылазил %)   Но думаю на выходных займусь. Еще смущает что датчик выпуска 1991г, а а заявленый срок эксплуатации 4 года. Немножко так просрочен ))) Но надо пробовать.

у меня наверное не менее, да что ему будет, обычная трубка )))
А я вот думаю, если на преобразователь DC-DC домотать обмоточку вольт до ста и на умножитель, сработает? Частоты высокие, нужны диоды шотки, токи там мизерные пошли бы любые

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

Кстати, посчитал для интереса, сколько выдает импульсов в минуту, газоразрядная трубка  J305ß, оказалось не густо...

В среднем - 20 имп/мин. (Поэтому для достоверной оценки, надо проводить измерения более 3х минут)... 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Strannic1924 пишет:

Кстати, посчитал для интереса, сколько выдает импульсов в минуту, газоразрядная трубка  J305ß, оказалось не густо...

В среднем - 20 имп/мин. (Поэтому для достоверной оценки, надо проводить измерения более 3х минут)... 

да там в цикле идёт, оставляешь минут на 10-20, среднее высчитает думаю правильно, а может сделать через общее накопление

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

ua6em пишет:

Strannic1924 пишет:

Кстати, посчитал для интереса, сколько выдает импульсов в минуту, газоразрядная трубка  J305ß, оказалось не густо...

В среднем - 20 имп/мин. (Поэтому для достоверной оценки, надо проводить измерения более 3х минут)... 

да там в цикле идёт, оставляешь минут на 10-20, среднее высчитает думаю правильно, а может сделать через общее накопление

Запустил счетчик на 15 минут - среднее значение 0,22 мкЗв/ч, при этом показания колебались от 0,17 до 0,26 мкЗв/ч.

Касательно, норм радиационной безопасности НРБ-99, цитирую:

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

"...В эксплуатируемых жилых и общественных зданиях среднегодовая эквивалентная равновесная объемная активность дочерних продуктов радона и торона в воздухе жилых и общественных помещений ЭРОА + 4,6 x ЭРОА не Rn Tn должна превышать 200 Бк/м3. При более высоких значениях объемной активности должны проводиться защитные мероприятия, направленные на снижение поступления радона в воздух помещений и улучшение вентиляции помещений. Защитные мероприятия должны проводиться также, если мощность эффективной дозы гамма-излучения в помещениях превышает мощность дозы на открытой местности более чем на 0,2 мкЗв/ч".

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

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

ua6em пишет:

Logik пишет:

Нет. Еще смотрю на него задумчивым взглядом. Мосфет в SOT-8, без платки не удобно с ним. Да и другой работы валом, всера с JS день не вылазил %)   Но думаю на выходных займусь. Еще смущает что датчик выпуска 1991г, а а заявленый срок эксплуатации 4 года. Немножко так просрочен ))) Но надо пробовать.

у меня наверное не менее, да что ему будет, обычная трубка )))
А я вот думаю, если на преобразователь DC-DC домотать обмоточку вольт до ста и на умножитель, сработает? Частоты высокие, нужны диоды шотки, токи там мизерные пошли бы любые

)))

Нагружен на 1МОм, ток 0,3мА получается, ниче не греется, судя по скважности еще можна повышать и повышать.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Так ты прямо с ардуинки и ШИМуешь? Если чуть занизить до 225 вольт и потом умножить получится 450, то-что надо, пойду поищу маленький БП, ватт на 90-100

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

Я думаю, что  450В и без умножения можна, вот допаяю сегодня вечером еще диод, попробую. Там на екране скетч, в нем два параметра, длительность импульса и пауза между ними, ими и игрался. Сразу нашел наивысшее напряжение в зависимости от длительности, получил 90-100мксек, при 80 и 120 уже заметно хуже. Дальше начал паузы уменьшать, напряжение быстро росло, я на 305В остановился только из соображений обратного напряжения на диодах.

Исходя из тех цифр что есть ШИМ скорей всего не будет, будет частотно-импульсная модуляция. С простым как двери алгоритмом управления: просело напряжение ниже порога, значить делаем импульс на 90мкс, и забываем о проблеме на некоторое время, потом начинаем контролировать напряжение пока не упадет до порогового.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

А в скетч интегрировать получится? Тот, что выше был

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

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

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

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

int PulseT;

void setup() 
{  
  Serial.begin(115200);
  
  digitalWrite(9, LOW);
  pinMode(9,   OUTPUT);  
  
  analogReference(INTERNAL);
  PulseT=micros();
}

struct rec 
{
  int val;
  int time  ;
};
rec r[30];

byte OutCount;
void loop()
{
 int t;
 
 t=micros();
 
 if(t-PulseT>1200)
 {
   PulseT=t;
   
   digitalWrite(9, HIGH);
   delayMicroseconds(32);
   digitalWrite(9, LOW);
 
   if(!OutCount++)
   {
    for(byte i=0;i<10;i++)
    {
      r[i].time=micros()-PulseT;
      r[i].val=analogRead(A1);
    }
   }
 }
 else
 {
   if((OutCount<=10) && OutCount)
   {
     char s[10];
     itoa(r[OutCount-1].time,s, 10);
     Serial.print(s); 
     Serial.print(";"); 
     itoa(r[OutCount-1].val,s, 10);
     Serial.println(s); 
     OutCount++;
   } 
  
 }

  
}

 Теперь импульс 32мксек а пауза 1,2мсек. Пульсация до 10%. Выдает около 305В на нагрузке 1,3МОм а потребляет сам преобразователь, без ардуины,  48мА при 4,5В. КПД имеем около 30%.

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

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

У нас конкурирующая фирма обявилась! ))) http://arduino.ru/forum/proekty/delaem-dozimetr#comment-263654

И камрад tekagi очень своевременно напомнил о влиянии входного сопротивления мультиметра на результат при измерениях в высокоомных цепях.  Тестер просаживает напряжение. Т.е. 300В на фотке выше при отключеном тестере превращаются в около 430В ))) А Ардуино меряет точней, занижая до 5%. При подключеном тестере на котором 300В  АЦП ардуины дает 290В, а при отключеном - 430-440В. Таким образом далее меряю ардуиной. Соответственно и КПД оказывается около 75% )))

 

 

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

Запустил програмную стабилизацию. 

int PulseT;

#define Vhigh 440   //требуемое напряжение, В
#define Kadc  643   //разряд  АЦП с учетом делителя, формат 6.10, В
#define VALUE_ADC(V) (int)(V*(long)1024/Kadc) //из напряжения в разряды АЦП
#define Vh(N)        (int)(N*(long)Kadc/1024) //напряжение по данным АЦП

void setup() 
{  
  Serial.begin(115200);
  
  digitalWrite(9, LOW);
  pinMode(9,   OUTPUT);  
  
  analogReference(INTERNAL);
  PulseT=micros();
}

byte OutCount;
int Vmin;
int Vmax;
long Vsr;
int Nsr;
int Tp;

void loop()
{
 int t;
 int V;
 
 V=analogRead(A1);
 t=micros();

 if(V<Vmin) Vmin=V;
 if(V>Vmax) Vmax=V;
 Vsr+=V;
 Nsr++;
 
 if(t-PulseT>1000)
 {
   if(V<VALUE_ADC(Vhigh))
   {
   Tp=t-PulseT;
   
   PulseT=t;
   
   digitalWrite(9, HIGH);
   delayMicroseconds(36);
   digitalWrite(9, LOW);
 
   }
 }
 else
 {
   if(!OutCount++)
   {
     char s[10];
     itoa(Vh(Vmin),s, 10);
     Serial.print(s); 
     Serial.print(";"); 
     itoa(Vh(Vmax),s, 10);
     Serial.print(s); 
     Serial.print(";"); 
     itoa(Vh(Vsr/Nsr),s, 10);
     Serial.print(s); 
     Serial.print(";"); 
     itoa(Tp,s, 10);
     Serial.println(s); 
     Vmin=1023;
     Vmax=0;
     Vsr=0;
     Nsr=0;
   } 
  
 }

  
}

С выводом статистики для отладки.  Формат: Vmin , Vmax, Vсреднее, пауза между импульсами мксек.

Получил такое при включении

0;0;0;0
0;271;148;1136
270;405;339;1008
393;450;430;1416
430;448;439;1008
430;453;439;1416
429;448;439;1272
429;449;440;1952
429;445;438;1280
429;448;439;1544
428;457;439;1272
430;452;440;1952
429;448;439;1144
 
Получается в раене +-3%.
 
 подключение вольтметра
 
432;450;440;1136
429;452;439;1416
430;453;440;2904
404;452;435;1136
363;417;388;1136
346;378;361;1136
340;362;352;1136
337;361;351;1008
335;359;348;1136
334;361;349;1136
336;360;348;1008
333;360;348;1136
336;359;347;1008
337;358;349;1136
 
 видна реакция стабилизатора в попытке выйти на требуемое, но увы... На тестере показало 348В.
 
В целом ОК. 
Теперь пора и гейгера подключить. Думаю импульсы фиксировать по прерыванию, измерять время между ними, затем фильтровать и пересчитывать в период.
 
 
Logik
Offline
Зарегистрирован: 05.08.2014

Ну в общем ОК.  Гейгер работает, не смотря на то, что ему 26 лет, а гарантия 4 года. На сколько точно показывает - ХЗ. Дома ни циклотрончика даже нет, чтоб проверить. Дал туфлю понюхать - не реагирует :( Где найти для отладки радиацию ближе чем в чернобыле?

Получаю данные:

7221;14442;  32
5114;14178;  33
14358;15087;  31
413;14196;  33
16341;15351;  30
7762;15362;  30
1245;14557;  32
501;13710;  34
1043;12984;  36
5329;12838;  36
256;12068;  38
10298;12601;  37
7071;12697;  36
5065;12537;  37
5021;12381;  37
9190;12756;  36
7246;12865;  36
4357;12605;  37
3750;12286;  38
9511;12707;  36
31291;15824;  29
5567;15531;  30
17226;16714;  28
2327;15960;  29
1582;15160;  30
1283;14373;  32
15334;15392;  30
17542;16623;  28
2082;15844;  29
9803;16079;  29
3301;15487;  30
23288;17430;  26
17238;18495;  25
12337;18882;  24
73;17711;  26
15538;18546;  25
14215;19164;  24
18287;20252;  23
1111;19125;  24
 

где первый столбец - время между импульсами, единица соответствует 256мксек, второй столбец - оно же но фильтрованое КИХ с к=1/16, третий - кол-во импульсов в минуту пересчитаное по второму столбцу.