Compteur Geiger Arduini pro-mini / Domoticz
Publié : 29 févr. 2020, 17:19
Bonjour à tous
J’essaie en vain d’envoyer les valeurs d’un compteur Geiger vers Domoticz (KKmoon Détecteur de rayonnement nucléaire de module de kit de compteur assemblé DIY Geiger, celui que l’on trouve partout) Le compteur est relié à un pro-mini et à priori il fonctionne correctement puisque je vois des valeurs qui changent dans le moniteur série (16:32:20.390 -> counts: 12 CPM: 20 ==> uSv/hr: 0.1140),
Par contre rien la valeur « cpm » n’arrive pas dans Domoticz alors qu’elle semble bien envoyée ( 16:24:18.024 -> 376398 TSF:MSG:SEND,1-1-0-0,s=1,c=1,t=24,pt=5,l=4,sg=0,ft=0,st=OK:12)
Henri bachetti avait un peu parlé de ça sur le forum mysensors.
J’essaie en vain d’envoyer les valeurs d’un compteur Geiger vers Domoticz (KKmoon Détecteur de rayonnement nucléaire de module de kit de compteur assemblé DIY Geiger, celui que l’on trouve partout) Le compteur est relié à un pro-mini et à priori il fonctionne correctement puisque je vois des valeurs qui changent dans le moniteur série (16:32:20.390 -> counts: 12 CPM: 20 ==> uSv/hr: 0.1140),
Par contre rien la valeur « cpm » n’arrive pas dans Domoticz alors qu’elle semble bien envoyée ( 16:24:18.024 -> 376398 TSF:MSG:SEND,1-1-0-0,s=1,c=1,t=24,pt=5,l=4,sg=0,ft=0,st=OK:12)
Henri bachetti avait un peu parlé de ça sur le forum mysensors.
Code : Tout sélectionner
// Averaging (logging) period in milliseconds, typically 15000-60000.
#define AVG_PERIOD 15000
#define ONE_MINUTE 60000
// I'm using the SBM-20 Geiger-Muller (GM) tube with my kit. Conversion
// factors for other GM tubes may be found scattered throughout the Web.
#define SKETCH_NAME "Geiger Sensor"
#define SKETCH_MAJOR_VER "2"
#define SKETCH_MINOR_VER "0"
#define CHILD_ID 1 // Id of the sensor child 1 par défaut
#define SKETCH_NAME "Geiger Sensor"
#define SBM_20
#ifdef SBM_20
#define CONV_FACTOR 0.0057 // SBM-20 counts to uSv/hr multiplier
#endif
// TODO: insert #defines for other Geiger tube conversion factors here.
//*****************************************************
#define MY_RADIO_NRF24
#define MY_RF24_CE_PIN A0
#define MY_RF24_CS_PIN 10
//***********************************************
unsigned long counts; // # of raw GM Tube events
unsigned long cpm; // Counts Per Minute (CPM)
unsigned int mult; // CPM = (counts in a given interval) * multiplier
//*****************************************************
#define MY_DEBUG
#include <SPI.h>
#include <MySensors.h>
MyMessage msg(CHILD_ID, V_VAR1);
//**********************************************************
// Interrupt handler that counts raw events from Geiger Kit
void tube_impulse() {
counts++;
}
void setup()
{
wdt_enable(WDTO_8S);
// Geiger initialise
counts = 0;
cpm = 0;
// Initialize Serial communications
Serial.begin(9600);
// Determine multiplier for your log period
mult = ONE_MINUTE / AVG_PERIOD;
pinMode(2, INPUT); // Set pin 2 up for GM tube event interrupts
digitalWrite(2, HIGH); // Use internal pullup resistor par 3 défaut
//
// NOTE: The OLD Arduino IDE (v1.0.6) seems to work better with the cheap Chinese
// clone Nano. If you're using the latest IDE, replace this line with a call to
// digitalPinToInterrupt(pin).
//
attachInterrupt(1, tube_impulse, FALLING); //0 par défaut
wdt_reset();
Serial.println("http://rhelectronics.net Geiger Kit V3.00");
Serial.println("=========================================");
Serial.print("Please stand by for ");
Serial.print(AVG_PERIOD / 1000);
Serial.println(" sec. for first reading...");
Serial.println();
}
void presentation() {
// Send the sketch version information to the gateway and Controller
sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER "." SKETCH_MINOR_VER);
wdt_reset();
wait(500);
present(CHILD_ID, S_ARDUINO_NODE);
wdt_reset();
wait(500);
}
void loop()
{
wdt_reset();
// Elapsed time stuff
static unsigned long then;
unsigned long now = millis();
// Approx radiation level in microsieverts
double uSv;
if (now - then > AVG_PERIOD) {
then = now;
if (counts) { // i.e., if (counts != 0)
cpm = counts * mult;
uSv = cpm * CONV_FACTOR;
} else {
uSv = 0;
}
Serial.print("counts: ");
Serial.print(counts);
Serial.print(" CPM: ");
Serial.print(cpm);
Serial.print(" ==> uSv/hr: ");
Serial.println(uSv, 4); // Display 4 decimal places
sendSketchInfo(SKETCH_NAME, SKETCH_MAJOR_VER "." SKETCH_MINOR_VER);
send(msg.set(cpm));
counts = 0, cpm = 0;
}
delay(100); // TODO: more efficient form of power saving/sleep
}