Ciao a tutti, ho in cantiere una centralina meteo che ormai è diventato un progetto "enorme" e quindi complicato!
Sto usando un MEGA e gestisco 3 Interrupt (PIN 2=int.0 ; PIN18=int.5 ; PIN19=int.4).
Sull'interrupt 4 ho un anemometro ad impulsi con opportuno debouncing harware;
sull'interrupt 5 ho un pluviometro a bascula, sempre ad impulsi con opportuno debouncing hardware;
sull'interrupt 0 ho un pulsante, senza debouncing che uso per far stampare su LCD i dati rilevati in quell'istante.
L'interrupt 4 lo attivo nel loop(), lo tengo attivo per 5 secondi e lo spengo; questo infatti funziona.
d = 0;
attachInterrupt(4, Anemometer, RISING);
delay(Anemometer_delay);
detachInterrupt(4);
"d" è il mio contatore per l'anemometro e lo azzero prima di ogni rilevazione.
Gli altri due interrupt li attivo nel setup() perché dovranno essere sempre attivi.
attachInterrupt(5, Pluviometer, RISING);
attachInterrupt(0, Button, CHANGE);
Ciascuna funzione ha all'interno solo l'incremento/variazione del contatore:
void Anemometer(){
d++;
}
void Pluviometer(){
p++;.
}
void Button() {
Button_State = HIGH;
}
Il mio problema è che il contatore del pluviometro parte da subito (1°ciclo di loop) già col valore 1 e incrementa sia quando gli arriva il segnale sul PIN18 sia quando pigio il pulsante che mi interrompe il PIN2.
Ho riguardato tutto il circuito e non ci sono falsi contatti.
Ho provato inoltre a creare un programma per la sola lettura degli Interrupt (lasciando tutto l'hardware com'è, senza staccare nulla) e questo funziona. Il contatore p (del pluviometro) parte con valore 0 e incrementa solo quando chiude il pluviometro. Stessa cosa per la variabile Button_State e per il contatore d dell'anemometro.
Le tre variabili sono definite all'inizio del programma così:
volatile int d = 0;
volatile int p = 0;
volatile boolean Button_State = LOW;
Ci sto diventando matto, qualcuno può darmi una mano?
GRAZIE :o