FALLING, RISING e CHANGE
Parte da seção Temporização sem delay do Journey de Arduino da Coddy. Lição 13 de 18.
O Uno tem dois pinos que podem disparar uma interrupção: o pino 2 e o pino 3. Um botão que precisa de uma interrupção deve ser conectado a um deles. Dentro do chip, eles são as interrupções 0 e 1, então deixe digitalPinToInterrupt() transformar o pino em seu número. attachInterrupt(3, ...) solicita a interrupção 3, que o Uno não tem, e nada acontece.
A última parte de attachInterrupt() indica a qual mudança reagir:
FALLING: o pino vai deHIGHparaLOW(com um pull-up, ao pressionar)RISING: o pino vai deLOWparaHIGH(ao soltar)CHANGE: qualquer uma das duas
Com CHANGE, a ISR é executada ao pressionar e ao soltar. Ela lê o pino para descobrir qual dos dois aconteceu:
void onChange() {
if (digitalRead(buttonPin) == LOW) {
// o botão foi pressionado
} else {
// o botão foi solto
}
}
attachInterrupt(digitalPinToInterrupt(buttonPin), onChange, CHANGE);Desafio
FácilO botão está no pino 3, e loop() está ocupado com uma tarefa lenta. Faça o LED no pino 13 acompanhar o botão instantaneamente:
- em
onChange(), leia o botão:LOWacende o LED,HIGHo apaga - associe
onChange()ao pino do botão comCHANGE
Pressione Run, mantenha o botão pressionado e solte-o; depois, pressione Check.
Experimente você mesmo
const int ledPin = 13;
const int buttonPin = 3;
// Executa sempre que o estado do pino do botão muda.
void onChange() {
// acenda o LED quando o botão estiver pressionado e apague-o quando for solto
}
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// associe onChange() ao pino do botão aqui
}
void loop() {
// a tarefa lenta: mantenha-a como está
Serial.println("working");
delay(2000);
}
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
Pratique por conta própria: Playground de Arduino