Для каждого датчика свои секунды. Зависят в первом приближении от размера. Для СБМ 19 - 20 -21 соотношение времён 1-4-40. Так что время счёта надо выбирать по даташиту. Иначе можно сосчитать совсем не то.
Для каждого датчика свои секунды. Зависят в первом приближении от размера. Для СБМ 19 - 20 -21 соотношение времён 1-4-40. Так что время счёта надо выбирать по даташиту. Иначе можно сосчитать совсем не то.
а для СБТ10А? у меня такой, со счётчиками никогда дела не имел
///Может LOGIK поможет, я выдрал из своего скетча, можно ли сделать цифровой фильтр первого порядка если используется не unsigned long а float понятия не имею
А чего тут обяснять, на плавающей запятой все еще проще.
Пусть A - входной сигнал, а K- некоторый малый коэффициент фильтрации, например 0,01 чем он меньше, тем сильней фильтрует.
Тогда выходной сигнал B на каждом проходе будет как
B=B*(1-K)+A*K
Значение B понятное дело между проходами сохраняется.
Даже проще формула чем для целых, т.к. для них оптимизировано сильно: перевод в формат с фиксированой точкой, умножения и деления сдвигами.
приблизительно так, отображаю, что влезло, надо больше информации дисплей заменить на 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;
}
}
/*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 мкЗв/ч.
Поэтому полагаю прибор отображает фон корректно (естественно, в рамках своей погрешности).
Для того, чтобы цифровой фильтр заработал правильно нужно накопить некоторое количество данных, дайте замеров 100 хотя бы, это 15 минут работы скетча (6 замеров в минуту), или среднее арифметическое между предыдущим средним и текущим измерением, кусок кода был ниже цифрового кода, я как бы и для себя пытаюсь определить, хочу на имеющемся датчике сделать ))) или суммировать все замеры и подсчитывать их количество и выводить среднее, вариантов масса
PS меня настораживает когда на 10 секундном интервале измерения показания разнятся между 0.24 и 0.34, это катастрофически много, при этом реальные измерения ведутся только 1/6 времени, а остальное получается расчётным путём, это даже не усреднение )))
Вопрос, может ли датчик работать в круглосуточном режиме (постоянно) без деградации?
если да, то ничто не мешает накапливать все импульсы
Не знаю, смотрел в нете разные видео (с аналогичными схемами) практически везде при измерениях показания скачут на 12 и более cpm.
Наберите geiger kit в гугле (вкладка видео) или на ютубе...
Я использую устройство не в режиме постоянного мониторинга, а для проверки естественного фона, т.е включаю - получаю 10 показаний, вычисляю средний результат...
Для каждого датчика свои секунды. Зависят в первом приближении от размера. Для СБМ 19 - 20 -21 соотношение времён 1-4-40. Так что время счёта надо выбирать по даташиту. Иначе можно сосчитать совсем не то.
а для СБТ10А? у меня такой, со счётчиками никогда дела не имел
Судя по отчётам интернета он набирает 160 импульсов в минуту на фоне. Это соответствует 15 милиР/час. Т.е. или набирать минуту иделить на 10, или набирать 6 секунд, но будет скакать. Возможны промежуточные варианты - набирать 30 секунд делить на 5 и получать сразу милирентгены в час.
Меня устроит минута, тогда можно запустить круглосуточный режим, если он это позволяет, второе, на счётчике металлическая крышка, её снимать или через неё идут измерения?
По моим наблюдениям, естественный фон не даёт достаточно стабильно повторяющихся срабатываний счётчика. Т.е. интервалы времени между приходящими частицами не постоянны. Именно поэтому измеряют количество импульсов за длительный промежуток времени. Обычно имею 12...15 импульсов за сорок секунд. Если есть радиоактивный материал, то сработка дозиметра более интенсивна, но всё равно хаотична.
Относительно крышки надо читать тех. описание на датчик. Или провести натурные испытания.
По моим наблюдениям, естественный фон не даёт достаточно стабильно повторяющихся срабатываний счётчика. Т.е. интервалы времени между приходящими частицами не постоянны. Именно поэтому измеряют количество импульсов за длительный промежуток времени. Обычно имею 12...15 импульсов за сорок секунд. Если есть радиоактивный материал, то сработка дозиметра более интенсивна, но всё равно хаотична.
Относительно крышки надо читать тех. описание на датчик. Или провести натурные испытания.
А что там придумывать? По приведённой схеме, с коллектора правого транзистора, на какой либо pin ардуины. Я бы поставил между коллектором и ардуиной резистор килоом в двадцать (кто знает какие выбросы из-за динамика?). Вероятнее через прерывания. Всё.
/*
* 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;
}
}
/*
* 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;
}
}
Вы сами откуда? Дам координаты с кем связаться, процедура не сложная за неделю-две можно оформиться
Скетч работает. Единственное, что смущает - разбег показаний, стал больше, может показывать 6 cpm, а затем 66 cpm, при условии, что замеряем естественный фон. Ну и соответственно от того пляшут текущие и средние значения. А проверить прибор не с чем...
Кстати если использовать скетч с поста 57, то показания можно смотреть не только в мониторе порта, но есть еще и специальная программа для OS windows - Radiation Logger, здесь http://www.rhelectronics.net/store/radiation-logger.html
/*
* 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;
}
}
Скетч с поста 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;
}
}
По оформлению, обратитесь к Гаврилову Антону Геннадьевичу ra0sms(at)bk.ru, думаю поможет
По скетчу:
а так будет абсолютно точно )))
if (millis()-timePreviousMeassure >=60000){
countPerMinute = count;
radiationValue = countPerMinute * CONV_FACTOR;
timePreviousMeassure = millis();
count = 0; // счетчик обнулим тут, для правильности счёта, вывод на экран ведь время занимает
Только так долго ждать показаний придется, если в режиме постоянного мониторинга- не страшно, а в режиме оперативного мониторинга - плохо.
Замерил, сейчас фон в квартире (скетч с поста 75), через минуту с небольшим выдал:
0,22 мкЗв/ч (Вообщем оставлю этот вариант скетча пока).
Кстати, согласно норм радиационной безопасности НРБ-99/2009 Санпин 2.6.1-2523-09, для населения допускаяется уровень облучения не более 1 миллизиверта в год, что примерно равно 0,57 мкЗв/ч.
/*
* 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 (независимо от модернизаций скетча), то приходится ждать две минуты чтобы получить значение фона, далее значения фона меняются с интервалом в минуту.
Кстати, согласно норм радиационной безопасности НРБ-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 раза выше фон! Бегите, если успеете прочитать это ;)
Кстати, согласно норм радиационной безопасности НРБ-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/
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
И затем по истечении еще минуты выдает текущее значение.
Нет. Еще смотрю на него задумчивым взглядом. Мосфет в SOT-8, без платки не удобно с ним. Да и другой работы валом, всера с JS день не вылазил %) Но думаю на выходных займусь. Еще смущает что датчик выпуска 1991г, а а заявленый срок эксплуатации 4 года. Немножко так просрочен ))) Но надо пробовать.
В скетче очень много лишнего, может стоит оптимизировать убрав весь пиар разработчика оставив лаконическую сущность, тогда и читаться будет лучше
Вот кто бы еще помог бы это сделать?..
Я пока только такую оптимизацию кода сумел сделать:
Код:
/*
* 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);
}
}
Нет. Еще смотрю на него задумчивым взглядом. Мосфет в SOT-8, без платки не удобно с ним. Да и другой работы валом, всера с JS день не вылазил %) Но думаю на выходных займусь. Еще смущает что датчик выпуска 1991г, а а заявленый срок эксплуатации 4 года. Немножко так просрочен ))) Но надо пробовать.
у меня наверное не менее, да что ему будет, обычная трубка )))
А я вот думаю, если на преобразователь DC-DC домотать обмоточку вольт до ста и на умножитель, сработает? Частоты высокие, нужны диоды шотки, токи там мизерные пошли бы любые
Кстати, посчитал для интереса, сколько выдает импульсов в минуту, газоразрядная трубка J305ß, оказалось не густо...
В среднем - 20 имп/мин. (Поэтому для достоверной оценки, надо проводить измерения более 3х минут)...
да там в цикле идёт, оставляешь минут на 10-20, среднее высчитает думаю правильно, а может сделать через общее накопление
Запустил счетчик на 15 минут - среднее значение 0,22 мкЗв/ч, при этом показания колебались от 0,17 до 0,26 мкЗв/ч.
Касательно, норм радиационной безопасности НРБ-99, цитирую:
"... Допустимое значение эффективной дозы, обусловленной суммарным воздействием природных источников излучения, для населения не устанавливается. Снижение облучения населения достигается путем установления системы ограничений на облучение населения от отдельных природных источников излучения".
"...В эксплуатируемых жилых и общественных зданиях среднегодовая эквивалентная равновесная объемная активность дочерних продуктов радона и торона в воздухе жилых и общественных помещений ЭРОА + 4,6 x ЭРОА не Rn Tn должна превышать 200 Бк/м3. При более высоких значениях объемной активности должны проводиться защитные мероприятия, направленные на снижение поступления радона в воздух помещений и улучшение вентиляции помещений. Защитные мероприятия должны проводиться также, если мощность эффективной дозы гамма-излучения в помещениях превышает мощность дозы на открытой местности более чем на 0,2 мкЗв/ч".
"...Эффективная доза облучения природными источниками излучения всех работников, включая персонал, не должна превышать 5 мЗв в год в производственных условиях (любые профессии и производства)".
Нет. Еще смотрю на него задумчивым взглядом. Мосфет в SOT-8, без платки не удобно с ним. Да и другой работы валом, всера с JS день не вылазил %) Но думаю на выходных займусь. Еще смущает что датчик выпуска 1991г, а а заявленый срок эксплуатации 4 года. Немножко так просрочен ))) Но надо пробовать.
у меня наверное не менее, да что ему будет, обычная трубка )))
А я вот думаю, если на преобразователь DC-DC домотать обмоточку вольт до ста и на умножитель, сработает? Частоты высокие, нужны диоды шотки, токи там мизерные пошли бы любые
)))
Нагружен на 1МОм, ток 0,3мА получается, ниче не греется, судя по скважности еще можна повышать и повышать.
Так ты прямо с ардуинки и ШИМуешь? Если чуть занизить до 225 вольт и потом умножить получится 450, то-что надо, пойду поищу маленький БП, ватт на 90-100
Я думаю, что 450В и без умножения можна, вот допаяю сегодня вечером еще диод, попробую. Там на екране скетч, в нем два параметра, длительность импульса и пауза между ними, ими и игрался. Сразу нашел наивысшее напряжение в зависимости от длительности, получил 90-100мксек, при 80 и 120 уже заметно хуже. Дальше начал паузы уменьшать, напряжение быстро росло, я на 305В остановился только из соображений обратного напряжения на диодах.
Исходя из тех цифр что есть ШИМ скорей всего не будет, будет частотно-импульсная модуляция. С простым как двери алгоритмом управления: просело напряжение ниже порога, значить делаем импульс на 90мкс, и забываем о проблеме на некоторое время, потом начинаем контролировать напряжение пока не упадет до порогового.
А чего бы и нет. Только надо следить чтоб время вывода на екран и порт не было слишком болшьим, иначе тоже можна, но стабилизацию напряжения делать на прерываниях, что в общем довольно верный подход. А можна и тупо емкость на высокое поставить больше, чтоб не успевала разрядится за время вывода. Решаемо в общем.
Подключил через делитель аналоговый вход, снял скетчем профиль напряжения импульса (точней спада напряжения). Пульсации большие. Для снижения поднял частоту и уменьшил длительность импульса, рабочий скетч с замером импульса такой.
Теперь импульс 32мксек а пауза 1,2мсек. Пульсация до 10%. Выдает около 305В на нагрузке 1,3МОм а потребляет сам преобразователь, без ардуины, 48мА при 4,5В. КПД имеем около 30%.
Проблема обнаружилась, АЦП ардуиновское брешет сильно от высокоомного источника, а делитель на малых сопротивлениях нельзя..
И камрад tekagi очень своевременно напомнил о влиянии входного сопротивления мультиметра на результат при измерениях в высокоомных цепях. Тестер просаживает напряжение. Т.е. 300В на фотке выше при отключеном тестере превращаются в около 430В ))) А Ардуино меряет точней, занижая до 5%. При подключеном тестере на котором 300В АЦП ардуины дает 290В, а при отключеном - 430-440В. Таким образом далее меряю ардуиной. Соответственно и КПД оказывается около 75% )))
Ну в общем ОК. Гейгер работает, не смотря на то, что ему 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, третий - кол-во импульсов в минуту пересчитаное по второму столбцу.
Для каждого датчика свои секунды. Зависят в первом приближении от размера. Для СБМ 19 - 20 -21 соотношение времён 1-4-40. Так что время счёта надо выбирать по даташиту. Иначе можно сосчитать совсем не то.
а для СБТ10А? у меня такой, со счётчиками никогда дела не имел
///Может LOGIK поможет, я выдрал из своего скетча, можно ли сделать цифровой фильтр первого порядка если используется не unsigned long а float понятия не имею
А чего тут обяснять, на плавающей запятой все еще проще.
Пусть A - входной сигнал, а K- некоторый малый коэффициент фильтрации, например 0,01 чем он меньше, тем сильней фильтрует.
Тогда выходной сигнал B на каждом проходе будет как
B=B*(1-K)+A*K
Значение B понятное дело между проходами сохраняется.
Даже проще формула чем для целых, т.к. для них оптимизировано сильно: перевод в формат с фиксированой точкой, умножения и деления сдвигами.
Попробовал скетч из поста 50, компилируется. Только работает не корректно, на мой взгляд :
- больше стал разброс показаний, чем был до этого,
-показывает среднее значение только для текущего результата (т.е. не считает среднее значение результатов),
-слепливает цифры текущего и среднего значения (не хватает пробела между ними),
-не пишет единицы измерения (мкЗв/ч)
Т.е. выдает такие значения:
CPM=30
0.24360.24
CPM=42
0.34100.34
И так далее...
Строки 161 и 162 поправьте
приблизительно так, отображаю, что влезло, надо больше информации дисплей заменить на 2004А, а вообще измерение кривое, накапливаем показания счётчика в течении 10 секунд, умножаем на 6, дескать сколько за минуту, умножаем на коэффициент и, повторяем цикл для следующих 10 секунд, всё высасывается из пальца
Скетч с поста 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 что пытались помочь.
Пробовал еще такой скетч:
В мониторе порта получаем значения в СРМ *0,00812 (конв. фактор в моем случае) и получаем значения в мкЗв/ч.
Вообщем сделал 10 замеров, посчитал средний результат 0,22 мкЗв/ч
Потом залил скетч из поста 11, сделал 10 замеров, посчитал средний результат 0,21 мкЗв/ч.
Поэтому полагаю прибор отображает фон корректно (естественно, в рамках своей погрешности).
Для того, чтобы цифровой фильтр заработал правильно нужно накопить некоторое количество данных, дайте замеров 100 хотя бы, это 15 минут работы скетча (6 замеров в минуту), или среднее арифметическое между предыдущим средним и текущим измерением, кусок кода был ниже цифрового кода, я как бы и для себя пытаюсь определить, хочу на имеющемся датчике сделать ))) или суммировать все замеры и подсчитывать их количество и выводить среднее, вариантов масса
PS меня настораживает когда на 10 секундном интервале измерения показания разнятся между 0.24 и 0.34, это катастрофически много, при этом реальные измерения ведутся только 1/6 времени, а остальное получается расчётным путём, это даже не усреднение )))
Вопрос, может ли датчик работать в круглосуточном режиме (постоянно) без деградации?
если да, то ничто не мешает накапливать все импульсы
Не знаю, смотрел в нете разные видео (с аналогичными схемами) практически везде при измерениях показания скачут на 12 и более cpm.
Наберите geiger kit в гугле (вкладка видео) или на ютубе...
Я использую устройство не в режиме постоянного мониторинга, а для проверки естественного фона, т.е включаю - получаю 10 показаний, вычисляю средний результат...
А можете включить минут на 10? Интересно, что покажет цифровой фильтр при стольких измерениях
а для СБТ10А? у меня такой, со счётчиками никогда дела не имел
Судя по отчётам интернета он набирает 160 импульсов в минуту на фоне. Это соответствует 15 милиР/час. Т.е. или набирать минуту иделить на 10, или набирать 6 секунд, но будет скакать. Возможны промежуточные варианты - набирать 30 секунд делить на 5 и получать сразу милирентгены в час.
Меня устроит минута, тогда можно запустить круглосуточный режим, если он это позволяет, второе, на счётчике металлическая крышка, её снимать или через неё идут измерения?
По моим наблюдениям, естественный фон не даёт достаточно стабильно повторяющихся срабатываний счётчика. Т.е. интервалы времени между приходящими частицами не постоянны. Именно поэтому измеряют количество импульсов за длительный промежуток времени. Обычно имею 12...15 импульсов за сорок секунд. Если есть радиоактивный материал, то сработка дозиметра более интенсивна, но всё равно хаотична.
Относительно крышки надо читать тех. описание на датчик. Или провести натурные испытания.
http://shaddack.brutowave.com/projects/hw_PancakeGeiger/
По моим наблюдениям, естественный фон не даёт достаточно стабильно повторяющихся срабатываний счётчика. Т.е. интервалы времени между приходящими частицами не постоянны. Именно поэтому измеряют количество импульсов за длительный промежуток времени. Обычно имею 12...15 импульсов за сорок секунд. Если есть радиоактивный материал, то сработка дозиметра более интенсивна, но всё равно хаотична.
Относительно крышки надо читать тех. описание на датчик. Или провести натурные испытания.
http://shaddack.brutowave.com/projects/hw_PancakeGeiger/
За схему спасибо, осталось придумать как импульсы снимать для ардуины
А что там придумывать? По приведённой схеме, с коллектора правого транзистора, на какой либо pin ардуины. Я бы поставил между коллектором и ардуиной резистор килоом в двадцать (кто знает какие выбросы из-за динамика?). Вероятнее через прерывания. Всё.
Скетч с поста 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 для работы.
А вот такой вариант попробуйте
Запустил скетч из поста 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) категорию радиолюбителя и зарегистрировать средство связи, получить позывной?..
Код здесь
Вы сами откуда? Дам координаты с кем связаться, процедура не сложная за неделю-две можно оформиться
Скетч работает. Единственное, что смущает - разбег показаний, стал больше, может показывать 6 cpm, а затем 66 cpm, при условии, что замеряем естественный фон. Ну и соответственно от того пляшут текущие и средние значения. А проверить прибор не с чем...
Сам я из г. Саянска Иркутская обл.
Сам я из г. Саянска Иркутская обл.
Знакомые ж места до чего!
Кстати если использовать скетч с поста 57, то показания можно смотреть не только в мониторе порта, но есть еще и специальная программа для OS windows - Radiation Logger, здесь http://www.rhelectronics.net/store/radiation-logger.html
Проверял программа работает.
,
Да вроде и эта должна, если чуток поправить )))
Скетч с поста 73 имеет чуть меньше разброс показаний (а может и нет, нужно долго тестить), но всеравно разброс присутствует.
Остановился пока на таком компромиссе, между временем измерений (скоростью) и точностью.
Скетч
По оформлению, обратитесь к Гаврилову Антону Геннадьевичу ra0sms(at)bk.ru, думаю поможет
По скетчу:
а так будет абсолютно точно )))
Спасибо.
Только так долго ждать показаний придется, если в режиме постоянного мониторинга- не страшно, а в режиме оперативного мониторинга - плохо.
Замерил, сейчас фон в квартире (скетч с поста 75), через минуту с небольшим выдал:
0,22 мкЗв/ч (Вообщем оставлю этот вариант скетча пока).
Кстати, согласно норм радиационной безопасности НРБ-99/2009 Санпин 2.6.1-2523-09, для населения допускаяется уровень облучения не более 1 миллизиверта в год, что примерно равно 0,57 мкЗв/ч.
Всем доброго здравия. Спасибо.
Вообщем потестил скетч, работает
Код:
Единственный недостаток:
- т.к. первый результат, при включении, он выдает 0,0000 (независимо от модернизаций скетча), то приходится ждать две минуты чтобы получить значение фона, далее значения фона меняются с интервалом в минуту.
Кстати, согласно норм радиационной безопасности НРБ-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 раза выше фон! Бегите, если успеете прочитать это ;)
175 строку уберите, два раза не надо скидывать счётчик, за это время (вывод на дисплей и в порт) значение уже могло набежать
Кстати, согласно норм радиационной безопасности НРБ-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...
175 строку уберите, два раза не надо скидывать счётчик, за это время (вывод на дисплей и в порт) значение уже могло набежать
Убрал.
Такой код.
Но почему то не помогло. При включении - пишет информацию о разработчиках (заложенную для отображения в скетче), затем пишет:
срм=0
0,00
Затем по истечении минуты от включения пишет:
срм=0 uSV/h
0,0000 0,0000
И затем по истечении еще минуты выдает текущее значение.
весь скетч я точно не смотрел ))) попробую, но не обещаю, что смогу, тут бы кому из гуру подключиться
посмотрел, да, есть такое дело, надо хотя-бы десятисекундную инициализацию в сетап перенести, а так данных нет целую минуту. ждёмс накопление счётчика
Хотел сравнить показания на улице с данными местной метеостанции, позвонил, спросил, а в ответ:
-данные о радиационном фоне, не предоставляются, только по официальному запросу...
На сайте народного мониторинга можно поглядеть данные с любительских станций. https://narodmon.ru/
В скетче очень много лишнего, может стоит оптимизировать убрав весь пиар разработчика оставив лаконическую сущность, тогда и читаться будет лучше
LOGIK - ты на трансформаторе запустил 400 вольтовый источник?
Нет. Еще смотрю на него задумчивым взглядом. Мосфет в SOT-8, без платки не удобно с ним. Да и другой работы валом, всера с JS день не вылазил %) Но думаю на выходных займусь. Еще смущает что датчик выпуска 1991г, а а заявленый срок эксплуатации 4 года. Немножко так просрочен ))) Но надо пробовать.
В скетче очень много лишнего, может стоит оптимизировать убрав весь пиар разработчика оставив лаконическую сущность, тогда и читаться будет лучше
Вот кто бы еще помог бы это сделать?..
Я пока только такую оптимизацию кода сумел сделать:
Код:
Нет. Еще смотрю на него задумчивым взглядом. Мосфет в SOT-8, без платки не удобно с ним. Да и другой работы валом, всера с JS день не вылазил %) Но думаю на выходных займусь. Еще смущает что датчик выпуска 1991г, а а заявленый срок эксплуатации 4 года. Немножко так просрочен ))) Но надо пробовать.
у меня наверное не менее, да что ему будет, обычная трубка )))
А я вот думаю, если на преобразователь DC-DC домотать обмоточку вольт до ста и на умножитель, сработает? Частоты высокие, нужны диоды шотки, токи там мизерные пошли бы любые
Кстати, посчитал для интереса, сколько выдает импульсов в минуту, газоразрядная трубка J305ß, оказалось не густо...
В среднем - 20 имп/мин. (Поэтому для достоверной оценки, надо проводить измерения более 3х минут)...
Кстати, посчитал для интереса, сколько выдает импульсов в минуту, газоразрядная трубка J305ß, оказалось не густо...
В среднем - 20 имп/мин. (Поэтому для достоверной оценки, надо проводить измерения более 3х минут)...
да там в цикле идёт, оставляешь минут на 10-20, среднее высчитает думаю правильно, а может сделать через общее накопление
Кстати, посчитал для интереса, сколько выдает импульсов в минуту, газоразрядная трубка J305ß, оказалось не густо...
В среднем - 20 имп/мин. (Поэтому для достоверной оценки, надо проводить измерения более 3х минут)...
да там в цикле идёт, оставляешь минут на 10-20, среднее высчитает думаю правильно, а может сделать через общее накопление
Запустил счетчик на 15 минут - среднее значение 0,22 мкЗв/ч, при этом показания колебались от 0,17 до 0,26 мкЗв/ч.
Касательно, норм радиационной безопасности НРБ-99, цитирую:
"... Допустимое значение эффективной дозы, обусловленной суммарным воздействием природных источников излучения, для населения не устанавливается. Снижение облучения населения достигается путем установления системы ограничений на облучение населения от отдельных природных источников излучения".
"...В эксплуатируемых жилых и общественных зданиях среднегодовая эквивалентная равновесная объемная активность дочерних продуктов радона и торона в воздухе жилых и общественных помещений ЭРОА + 4,6 x ЭРОА не Rn Tn должна превышать 200 Бк/м3. При более высоких значениях объемной активности должны проводиться защитные мероприятия, направленные на снижение поступления радона в воздух помещений и улучшение вентиляции помещений. Защитные мероприятия должны проводиться также, если мощность эффективной дозы гамма-излучения в помещениях превышает мощность дозы на открытой местности более чем на 0,2 мкЗв/ч".
"...Эффективная доза облучения природными источниками излучения всех работников, включая персонал, не должна превышать 5 мЗв в год в производственных условиях (любые профессии и производства)".
Нет. Еще смотрю на него задумчивым взглядом. Мосфет в SOT-8, без платки не удобно с ним. Да и другой работы валом, всера с JS день не вылазил %) Но думаю на выходных займусь. Еще смущает что датчик выпуска 1991г, а а заявленый срок эксплуатации 4 года. Немножко так просрочен ))) Но надо пробовать.
у меня наверное не менее, да что ему будет, обычная трубка )))
А я вот думаю, если на преобразователь DC-DC домотать обмоточку вольт до ста и на умножитель, сработает? Частоты высокие, нужны диоды шотки, токи там мизерные пошли бы любые
)))
Нагружен на 1МОм, ток 0,3мА получается, ниче не греется, судя по скважности еще можна повышать и повышать.
Так ты прямо с ардуинки и ШИМуешь? Если чуть занизить до 225 вольт и потом умножить получится 450, то-что надо, пойду поищу маленький БП, ватт на 90-100
Я думаю, что 450В и без умножения можна, вот допаяю сегодня вечером еще диод, попробую. Там на екране скетч, в нем два параметра, длительность импульса и пауза между ними, ими и игрался. Сразу нашел наивысшее напряжение в зависимости от длительности, получил 90-100мксек, при 80 и 120 уже заметно хуже. Дальше начал паузы уменьшать, напряжение быстро росло, я на 305В остановился только из соображений обратного напряжения на диодах.
Исходя из тех цифр что есть ШИМ скорей всего не будет, будет частотно-импульсная модуляция. С простым как двери алгоритмом управления: просело напряжение ниже порога, значить делаем импульс на 90мкс, и забываем о проблеме на некоторое время, потом начинаем контролировать напряжение пока не упадет до порогового.
А в скетч интегрировать получится? Тот, что выше был
А чего бы и нет. Только надо следить чтоб время вывода на екран и порт не было слишком болшьим, иначе тоже можна, но стабилизацию напряжения делать на прерываниях, что в общем довольно верный подход. А можна и тупо емкость на высокое поставить больше, чтоб не успевала разрядится за время вывода. Решаемо в общем.
Подключил через делитель аналоговый вход, снял скетчем профиль напряжения импульса (точней спада напряжения). Пульсации большие. Для снижения поднял частоту и уменьшил длительность импульса, рабочий скетч с замером импульса такой.
Теперь импульс 32мксек а пауза 1,2мсек. Пульсация до 10%. Выдает около 305В на нагрузке 1,3МОм а потребляет сам преобразователь, без ардуины, 48мА при 4,5В. КПД имеем около 30%.
Проблема обнаружилась, АЦП ардуиновское брешет сильно от высокоомного источника, а делитель на малых сопротивлениях нельзя..
У нас конкурирующая фирма обявилась! ))) http://arduino.ru/forum/proekty/delaem-dozimetr#comment-263654
И камрад tekagi очень своевременно напомнил о влиянии входного сопротивления мультиметра на результат при измерениях в высокоомных цепях. Тестер просаживает напряжение. Т.е. 300В на фотке выше при отключеном тестере превращаются в около 430В ))) А Ардуино меряет точней, занижая до 5%. При подключеном тестере на котором 300В АЦП ардуины дает 290В, а при отключеном - 430-440В. Таким образом далее меряю ардуиной. Соответственно и КПД оказывается около 75% )))
Запустил програмную стабилизацию.
С выводом статистики для отладки. Формат: Vmin , Vmax, Vсреднее, пауза между импульсами мксек.
Получил такое при включении
Ну в общем ОК. Гейгер работает, не смотря на то, что ему 26 лет, а гарантия 4 года. На сколько точно показывает - ХЗ. Дома ни циклотрончика даже нет, чтоб проверить. Дал туфлю понюхать - не реагирует :( Где найти для отладки радиацию ближе чем в чернобыле?
Получаю данные:
где первый столбец - время между импульсами, единица соответствует 256мксек, второй столбец - оно же но фильтрованое КИХ с к=1/16, третий - кол-во импульсов в минуту пересчитаное по второму столбцу.