Stap 22: Timers gebruikt om te lezen van sensoren
Het is niet nodig de sensor(en) voortdurend te lezen. Vooral als het de grond vochtigheid sensor, is het een goed idee om te lezen dat een tussenpozen, want dat zal de hoeveelheid van DC stroomt door de pinnen en dus corrosie vertragen.
In plaats van met behulp van vertragingen, is het mogelijk een interrupt timer gebruikt.
In het voorbeeld hieronder de prescaler voor timer is 1 ingesteld op de overloop van elke seconde. De timer vergelijk interrupt zal de seconden tot 10 tellen en lees vervolgens de sensor. Lees meer over het gebruik van timers hier.
// avr-libc library includes #include <avr/io.h> #include <avr/interrupt.h> volatile int seconds=0; void setup() { pinMode(LEDPIN, OUTPUT); // initialize Timer1 cli(); // disable global interrupts TCCR1A = 0; // set entire TCCR1A register to 0 TCCR1B = 0; // same for TCCR1B // set compare match register to desired timer count: OCR1A = 15624; // turn on CTC mode: TCCR1B |= (1 << WGM12); // Set CS10 and CS12 bits for 1024 prescaler: TCCR1B |= (1 << CS10); TCCR1B |= (1 << CS12); // enable timer compare interrupt: TIMSK1 |= (1 << OCIE1A); sei(); // enable global interrupts } ISR(TIMER1_COMPA_vect) { seconds++; if(seconds == 10) { seconds = 0; readSensor; } } void loop(){ //other stuff }
Houd in mening, niettemin als u stelt een timer zodat uw soilhumidity zou worden gelezen elke 10 minuten dat, dat als er behoefte is aan de pomp inschakelt, u moet om te lezen van de bodemvochtigheid voortdurend, anders uw pomp gedurende ten minste 10 minuten, voordat een andere lezing wordt genomen zullen vloeien. Dat is wellicht teveel water.
De bijgewerkte software bevat nu een 4-minuten timer.