
Arduino - pomoc
Zdravím, předem chci upozornit že programování moc nerozumím a proto píší zde.
Objednal jsem si dozimetr na stránce
http://www.rhelectronics.net/store/radiation-detector-geiger-counter-diy-kit-second-edition.html
Sestavil ho, zakoupil arduino a vše připojil, podle návodů jsem k tomu přidal displej přes I2C knihovnu,
A zde mi začíná problém, potřeboval bych zajistit výstupní hodnotu “CPM” na displej a dále vytvořit novou hodnotu “CPM*(krát)0,00053”, abych docílil teoretického přepočtu na uSv.
- mám občas problém, že při vyšších hodnotách radiace se mi hodnoty “zaseknou” a pomůže jen restart arduina.
- pokud by byl někdo tak ochotný a pomohl mi, byl bych opravdu rád, děkuji :)
- cely program:
#include <SPI.h>
#define LOG_PERIOD 15000 //Logging period in milliseconds, recommended value 15000-60000.
#define MAX_PERIOD 60000 //Maximum logging period
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(){ //procedure for capturing events from Geiger Kit
counts++;
}
void setup(){ //setup procedure
counts = 0;
cpm = 0;
multiplier = MAX_PERIOD / LOG_PERIOD; //calculating multiplier, depend on your log period
Serial.begin(9600); // start serial monitor
// uncommennt if you have time-out problem to connect with Radiation Logger
// delay(2000);
// Serial.write('0'); // sending zero to avoid connection time out with radiation logger
// delay(2000);
// Serial.write('0'); // sending zero to avoid connection time out with radiation logger
pinMode(2, INPUT); // set pin INT0 input for capturing GM Tube events
digitalWrite(2, HIGH); // turn on internal pullup resistors, solder C-INT on the PCB
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); // send cpm data to Radiation Logger
Serial.write(' '); // send null character to separate next data
counts = 0;
}
}
A to counts = 0; na konci loop je uplna kravina. Cas ti urcuju milis, a znulujes si to uplne nahodne po nejakom dlhocisznom case po prenose cez seriovy port. Je to tam uplne zle. Ked uz tak by som to dal pred tie Serial vypisy, ale aj to je len tak polepene. Spravne by to malo byt tak ze v samotnom preruseni je osetrene aj casove useky, inac to mera od buka do buka.