Una pressione che sfugge al loop
Fa parte della sezione Temporizzazione senza delay del percorso Arduino di Coddy. Lezione 12 di 18.
A volte uno sketch è impegnato in un'attività lenta o in un lungo delay(). Un ciclo che legge il pulsante solo tra un'attività e l'altra non rileva una pressione che inizia e finisce durante una di esse.
Un interrupt risolve il problema: quando un pin cambia, la scheda interrompe ciò che sta facendo, esegue una funzione che scegli tu, poi riprende. Il chip controlla il pin autonomamente, anche durante delay().
void onPress() {
digitalWrite(ledPin, HIGH);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}attachInterrupt() richiede tre elementi: l'interrupt per il pin (digitalPinToInterrupt(buttonPin) lo individua), la funzione da eseguire e quando eseguirla. FALLING è il momento in cui il pin passa da HIGH a LOW: con una resistenza di pull-up, è il momento in cui premi il pulsante.
La funzione è chiamata routine di servizio dell'interrupt, o ISR. Mantienila breve: niente delay() e niente Serial.
Sfida
FacileQuesto allarme controlla il pulsante solo una volta ogni 2 secondi, quindi non rileva una pressione rapida. Fai in modo che una pressione accenda subito il LED:
- scrivi una ISR,
onPress(), che accenda il LED - in
setup(), collegala al pin del pulsante conFALLING
Mantieni il lavoro lento in loop(). Il LED rimane acceso dopo una pressione, come in un allarme. Premi Esegui, tocca il pulsante, poi Verifica.
Provalo tu
const int ledPin = 13;
const int buttonPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// configura la interrupción aquí
}
void loop() {
// la tarea lenta: déjala tal como está
Serial.println("working");
delay(2000);
// esto solo comprueba el botón una vez cada 2 segundos,
// así que no detecta una pulsación breve
if (digitalRead(buttonPin) == LOW) {
digitalWrite(ledPin, HIGH);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Temporizzazione senza delay
Esercitati da solo: Playground Arduino