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....
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
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.