Um pressionamento que o loop não detecta
Parte da seção Temporização sem delay do Journey de Arduino da Coddy. Lição 12 de 18.
Às vezes, um sketch está ocupado com uma tarefa demorada ou um delay() longo. Um loop que lê o botão apenas entre as tarefas não detecta um pressionamento que começa e termina durante uma delas.
Uma interrupção resolve isso: quando um pino muda, a placa interrompe o que está fazendo, executa uma função que você escolhe e depois continua. O próprio chip monitora o pino, mesmo durante um delay().
void onPress() {
digitalWrite(ledPin, HIGH);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}attachInterrupt() recebe três coisas: a interrupção do pino (digitalPinToInterrupt(buttonPin) a encontra), a função a executar e quando executá-la. FALLING é o momento em que o pino passa de HIGH para LOW: com um pull-up, o momento em que o botão é pressionado.
A função é chamada de rotina de serviço de interrupção, ou ISR. Mantenha-a curta: nada de delay() nem de Serial.
Desafio
FácilEste alarme verifica o botão apenas uma vez a cada 2 segundos, então um toque rápido não é detectado. Faça com que um toque acenda o LED imediatamente:
- escreva uma ISR,
onPress(), que acenda o LED - em
setup(), vincule-a ao pino do botão comFALLING
Mantenha a tarefa lenta em loop(). O LED permanece aceso após um toque, como um alarme. Pressione Run, toque no botão e, em seguida, pressione Check.
Experimente você mesmo
const int ledPin = 13;
const int buttonPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// configure a interrupção aqui
}
void loop() {
// a tarefa lenta: mantenha-a como está
Serial.println("working");
delay(2000);
// isso só verifica o botão uma vez a cada 2 segundos,
// então um toque rápido passa despercebido
if (digitalRead(buttonPin) == LOW) {
digitalWrite(ledPin, HIGH);
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Temporização sem delay
3Interrupções
Um pressionamento que o loop não detectaFALLING, RISING e CHANGECompartilhamento com volatileContar pressionamentos com interrupçãoPratique por conta própria: Playground de Arduino