Bom dia, estou procurando aprender sobre as interrupções no arduino, já li alguns materiais em ingles mas não achei nada simples de entender, como proposta gostaria de um exemplo algo assim:
estou piscando um led na porta digital 7 com uma frequencia de 500ms (delay(500);), mas eu quero que se eu apertar um botão ligado na porta digital 6 acione um rele na porta digital 5 por 2 segundos, sem que pare de piscar o led.
é possivel?
Agradeço!
Vittorio
Tags:
As respostas para este tópico estão encerradas.
Olá Vittorio,
Voce já deu uma olhada neste tutorial aqui do LDG?
http://labdegaragem.com/profiles/blogs/tutorial-sobre-interrup-es-n...
Outra sugestão é consultar o livro Arduino Cookbook, que tem um capítulo dedicado ao uso dos recursos avançados de hardware disponiveis no microcontrolador do Arduino.
Abraço.
eu estou ineresado nas interrupções internas e não externas
Neste caso Vittorio,
Consulte o capítulo 18 do livro Arduino Cookbook, voce encontrará as informações sobre as interrupções de Timer do Arduino.
No site do Arduino também tem muita coisa.
Abraço
Acho que você pode tentar alguma coisa com a função "milis" no lugar de usar o delay.
na verdade, eu não estou em um delay, mas em uma rotina mais complexa dificil de explicar...
Olá Vittorio,
O sketch abaixo é um exemplo do que a função millis() pode fazer para resolver o problema proposto, de forma que o microcontrador possa temporizar vários pinos sem ficar parado aguardando o término de um delay.
const int ledPin = 7; // número do pino do LED
const int keyPin = 6; // número do pino da KEY
const int relayPin = 5; // número do pino do RELAY
int ledState = LOW; // usado para armazenar o estado do LED
int keyState = LOW; // usado para armazenar o estado da KEY
int relayState = LOW; // usado para armazenar o estado do RELAY
long LEDpreviousMillis = 0; // armazena o tempo da ultima vez que o LED foi alterado
long RELAYpreviousMillis = 0; // armazena o tempo em que o RELAY foi acionado
long LEDinterval = 500; // tempo da piscada do LED(em milisegundos)
long RELAYinterval = 2000; // tempo de acionamento do RELAY(em milisegundos)
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(keyPin, INPUT);
pinMode(relayPin, OUTPUT);
}
void loop()
{
unsigned long currentMillis = millis(); // tempo atual
if ((currentMillis - LEDpreviousMillis)> LEDinterval) { // Já deu o tempo para alterar o LED
LEDpreviousMillis = currentMillis; // atualiza o tempo do LED
if (ledState == LOW) // inverte o estado do LED
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState); // atualiza estado do LED
}
keyState = digitalRead(keyPin); // le estado da KEY
if (keyState == LOW && relayState == LOW ) { // A KEY foi acionada e o RELAY esta desligado
RELAYpreviousMillis = currentMillis; // atualiza o tempo do RELAY
relayState = HIGH; // seta o estado do RELAY
digitalWrite(relayPin, relayState); // aciona o RELAY
}
if (((currentMillis - RELAYpreviousMillis) > RELAYinterval) && relayState == HIGH ) { // Já deu o tempo pra alterar o RELAY
RELAYpreviousMillis = currentMillis; // atualiza o tempo do RELAY
relayState = LOW; // reseta o estado do RELAY
digitalWrite(relayPin, relayState); // atualiza estado do RELAY
}
} // fim do loop
Esta é uma maneira fazer, invente a sua!
Abraço
Obrigado!!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por