Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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;

}

}

Předmět Autor Datum
Myslim si ze ked clovek niecomu nerozumie, tak by to nemal robit. Problem tam moze nastavat napr. t…
MMnereg 06.02.2018 23:37
MMnereg
A to counts = 0; na konci loop je uplna kravina. Cas ti urcuju milis, a znulujes si to uplne nahodne… poslední
MMnereg 06.02.2018 23:40
MMnereg

Myslim si ze ked clovek niecomu nerozumie, tak by to nemal robit.

Problem tam moze nastavat napr. ten ze tie millis mozu pretiect a ak zmenis datovy format na long a millis neni long (neviem co tam mas za kniznicu) tak potom odcitavanie da blbost. Musi sa odcitavat v povodnom datovom formate aby sa zabranilo problemom pri preteceni.

Dalsi problem je ze tam mas vsetko celociselne datove typy, a snazis sa nasobit nejakym zlomkom. Z toho moze vzniknut nezmysel. Najprv sa celociselne nasobi az potom sa deli. A cele to ma byt v takom datovom type aby to nepretieklo cez max. hodnotu daneho datoveho typu.

Dalsi problem moze byt HW povodu, trebars ti to ziarenie sposobuje HW nestabilitu, alebo nestabilitu napatia. To sa da diagnostikovat prerusenim od timera a menenim hodnoty pinu (blikajuca LED apod), alebo v samotnom loop menit stav nejakeho pinu apod. a merat ho ci sa meni.

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.

Zpět do poradny Odpovědět na původní otázku Nahoru