D1 mini interrupt change non funziona

salve a tutti, ho un d1 mini di azdelivery e sto cercando di far funzionare uno sketch con interrupt impostato su change ma non c'è verso di farlo funzionare...
lo sketch è questo

const byte interruptPin = 12;
volatile byte state = 0;
void setup() {
  pinMode(interruptPin, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  // put your setup code here, to run once:
  attachInterrupt(digitalPinToInterrupt(interruptPin),segnale,CHANGE);
 
}

void loop() {
  // put your main code here, to run repeatedly:
 if (state == 1){
  digitalWrite(LED_BUILTIN,LOW);
 }else if (state == 0){
  digitalWrite(LED_BUILTIN, HIGH);
 }
 delay(1000);

}

ICACHE_RAM_ATTR void segnale(){
  if (interruptPin != LOW){
    state = 1;
  }
  else{
    state = 0;
  }
}

accendo la scheda, led spento con un ponticello collego il pin di interrupt a massa e il led si accende, quando lo scollego il led rimane acceso,
è come se l'interrupt non rileva il cambio di stato quando il pin torna alto.
ho anche provato a collegare un resistore da 1k tra 3.3 e il pin di interrupt ma non c'è verso quando scollego il pin interrupt dalla massa il led non si spegne....

const byte interruptPin = 12;`

ICACHE_RAM_ATTR void segnale(){
  if (interruptPin != LOW){
    state = 1;
  }
  else{
    state = 0;
  }
}

interruptPin è sempre diverso da LOW e alla variabile state verrà sempre assegnato il valore 1.

Inoltre per cambiare stato ad una variabile basta negarla o eseguire uno XOR.

state = !state;    // negazione
state ^= 1;  // XOR

Ciao.

grazie per l'intervento, a me non serve cambiare stato alla variabile, ma mi serve sapere se il pin è alto o basso e cambiano semplicemente con state = !state non so ugualmente in che stato è il pin...
Ho risolato aggiungendo un stato = digitalRead(interrupPin);
credevo che per avere lo stato del pin bastava solo confrontarlo senza leggerlo con l'apposita funzione.
in questo modo ho risolto

ICACHE_RAM_ATTR void segnale(){
 state ^= 1;  // XOR
}

Il codice qui sopra fa la stessa cosa che fa il tuo con la digitalRead aggiunta.

Ciao.

Ovvio che NON puoi leggere lo stato del pin usando solo interrupPin.
Quella è una variabile (const) che contiene il valore 12.
LOW inoltre è una costante (#define) che vale 0
Quindi per il test che fai chiedi se 12 != 0 e quindi è sempre vero.

Come potrebbe sapere Arduino/compilatore che quando fai il test con interrupPin "vorresti" leggere lo stato del pin 12 invece del valore interno alla variabile ovvero 12 ?
Mettiti nei panni della macchina. Fa precisamente cosa le ordini.
:wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.