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

Exibições: 2862

As respostas para este tópico estão encerradas.

Respostas a este tópico

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!!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço