Interrupt attivato da segnale su altro interrupt

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 :frowning: :o

Non so se questo puo aiutarti, ma ricorda che il pluviometro ha un contatto reed che puo essere indifferentemente sia aperto che chiuso all'accensione, dipende dalla posizione delle vaschette ... quindi forse sarebbe meglio leggerlo in "change", e non in "rising" ... e con un debounce hardware ...

Etemenanki ti ringrazio.
Ho appena provato e il problema persiste.
Ho provato anche con FALLING.
Comunque lascio CHANGE, ha senso.

Altra cosa:
Se avvio il programma con il filo del segnale del pluviometro staccato, il contatore p parte da 0.
Sempre lasciando scollegato il cavo, se pigio il pulsante l'interrupt del pulsante funziona e non incrementa p.

Quindi mi sembra di poter dire che quando è caricato questo programma, sul PIN18 arriva il segnale dal circuito del pluviometro.

Dico quando carico questo programma perché quando carico l'altro di prova non lo fa.

OK,
Ho trovato chi da noia all'interrupt 5 (PIN18). >:(

Io chiudo il setup() ed una funzione con:

digitalWrite(LCD_power_pin,LOW);

se commento (//) questo comando nel setup() il contatore p inizia con 0 e se la commento nella funzione attivata dal pulsante il p non incrementa.

Ora, come diavolo può essere che lo spengimento di un PIN mi mandi un segnale all'interrupt 5? :o

LCD_power_pin lo uso per alimentare lo schermo LCD che quando non è richiesto preferisco togliergli l'alimentazione perché il mio sistema sarà a batteria.

Dovresti postare il firmware completo e lo schema ...

Ciao Sulimaco,
il problema l'ho risolto togliendo la linea che fa spegnere il PIN con cui alimento l'LCD. Ad ogni modo continuo ad avere problemi con gli interrupt ma credo che aprirò un altro topic perché se no ci sono troppe domande e si esce fuori tema...

Si ma dato che non sappiamo a cosa corrisponda "LCD_power_pin" diventa difficile poter trovare una spiegazione. Devi postare il tuo codice.

...e usare le resistenze di pullup (o pulldown)