Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Questo 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 con FALLING

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);
  }
}
quiz iconMettiti alla prova

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