Criei um sistema simples para controlar a lâmpada do meu quarto com controle remoto IR, daí tive a ideia de deixar a lâmpada piscando assim como numa festa, mas dentro da programação IF me deparei com um erro o qual o pino não ficava piscando:

if(results.value==0x9CB92){ //onde 9CB92 seria o botão do controle
digitalWrite(6, HIGH); // aciona o relé

delay(600); // aguarda 6 milissegundos
digitalWrite(6, LOW); // desativa o relé
delay(600); // aguarda 6 milissegundos

}

mas invés de rodar tal função do começo como eu imaginava, apenas liga a lãmpada por 6 milissegundos e simplesmente desliga. Como deixar o pino 6 "piscando" até que eu desative com outro botão?????

sketch completa:

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
Serial.begin(9600);
pinMode(6, OUTPUT);
irrecv.enableIRIn(); // Start the receiver
}

void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
}

if(results.value==0x490){
digitalWrite(6, HIGH);
}
if(results.value==0xC90){
digitalWrite(6, LOW);
}
if(results.value==0x9EB92){
digitalWrite(6, HIGH);
}
if(results.value==0x5EB92){
digitalWrite(6, LOW);
}
if(results.value==0xDEB92){
digitalWrite(6, HIGH);
}
if(results.value==0x3EB92){
digitalWrite(6, LOW);
}
if(results.value==0xD0B92){
digitalWrite(6, HIGH);
delay(30000);
digitalWrite(6, LOW);
}
if(results.value==0x4CB92){
digitalWrite(6, HIGH);
delay(60000);
digitalWrite(6, LOW);
}

if(results.value==0x9CB92){
digitalWrite(6, HIGH);
delay(600);
digitalWrite(6, LOW);
delay(600);
}


}

Exibições: 4970

Responder esta

Respostas a este tópico

Oi Andrew, boa tarde.

Uma das possibilidade de fazer um loop dentro do loop, é usando o:

"for"

Ex  for(unsigned int i = 0; i<99; i++_

 {

  ....   aqu entra seu código que excutara' 100 vezes 

 }

com  declarei "unsigned int" este valor 99 voce pode por o que voce quizer de 0 até 65535. (0xFFFF).

Rui

Complementando a resposta do Rui Viana, acho que o seu código ficaria assim:

#include <IRremote.h> // Inclui a biblioteca IR

//Definições de Pinagem do Arduino
int RECV_PIN = 11;
const int Rele1 = 6; // Define o Rele na porta 6

IRrecv irrecv(RECV_PIN);


decode_results results;

void setup()
{
Serial.begin(9600);
pinMode(Rele1, OUTPUT);
irrecv.enableIRIn(); // Inicia o receptor Infravermelho
}

void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);


   //Pisca a Luz com o botão ?
 if (results.value == 0x9CB92)
      {
        int estado = digitalRead(Rele1);
            if (estado == HIGH) // Se a Luz estiver ligada vai iniciar o for para piscar a lâmpada.
             {
               for(unsigned int i = 0; i<999; i++);
             {
               digitalWrite(Rele1, LOW);
                delay(50);
                 digitalWrite(Rele1, HIGH);
              delay(50);
               digitalWrite(Rele1, LOW);
                delay(50);
                 digitalWrite(Rele1, HIGH);
              delay(50);
          }
      }
 else
     digitalWrite(Rele1, LOW); // Se precionado o botão novamente desliga a luz
                         
  } // Fim do Pisca a Luz com o botão ?

          // Botão X faz tal coisa
        if(results.value==0x490){
          digitalWrite(Rele1, HIGH);
            }
            
          // Botão X faz tal coisa  
        if(results.value==0xC90){
          digitalWrite(Rele1, LOW);
            }
            
            // Botão X faz tal coisa
        if(results.value==0x9EB92){
          digitalWrite(Rele1, HIGH);
            }
            
            // Botão X faz tal coisa
        if(results.value==0x5EB92){
          digitalWrite(Rele1, LOW);
            }
            
            // Botão X faz tal coisa
        if(results.value==0xDEB92){
          digitalWrite(Rele1, HIGH);
            }
            
            // Botão X faz tal coisa
        if(results.value==0x3EB92){
           digitalWrite(Rele1, LOW);
            }
            
            // Botão X faz tal coisa
        if(results.value==0xD0B92){
           digitalWrite(Rele1, HIGH);
           delay(30000);
           digitalWrite(Rele1, LOW);
            }
            
            // Botão X faz tal coisa
        if(results.value==0x4CB92){
           digitalWrite(Rele1, HIGH);
           delay(60000);
           digitalWrite(Rele1, LOW);
            }


  irrecv.resume(); // Recebe o proximo valor
  }

}

Quero agradecer ao Rui Viana, estava procurando por uma solução assim e não me lembrava da função for vlw cara !

Andrew, procure manter seus codigos sempre bem comentados, ajuda bastante na hora de fazer alterações e depois de um tempo, e fiz algumas alterações no seu codigo difinindo o Rele com o nome Rele1, assim se vc vier alterar a porta que ele esta ligado vc só altera no inicio do codigo e não vai precisar realizar em diversas linhas manualmente depois, e uma outra dica mapea todos os botões que for usar e deixa eles comentado no inicio do codigo assim não precisa ficar salvando em outros documentos.

O código final ficou assim:

#include <IRremote.h>

int RECV_PIN = 11;
unsigned int i = 0;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
Serial.begin(9600);
pinMode(6, OUTPUT);
irrecv.enableIRIn(); // Start the receiver
}

void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
}

if(results.value==0x490){
digitalWrite(6, HIGH);
}
if(results.value==0xC90){
digitalWrite(6, LOW);
}
if(results.value==0x9EB92){
digitalWrite(6, HIGH);
}
if(results.value==0x5EB92){
digitalWrite(6, LOW);
}
if(results.value==0xDEB92){
digitalWrite(6, HIGH);
}
if(results.value==0x3EB92){
digitalWrite(6, LOW);
}
if(results.value==0xD0B92){
digitalWrite(6, HIGH);
delay(30000);
digitalWrite(6, LOW);
}
if(results.value==0x4CB92){
digitalWrite(6, HIGH);
delay(60000);
digitalWrite(6, LOW);
}

for(unsigned int i = 0; i<60000; i++)
{
if(results.value==0x9CB92){
digitalWrite(6, HIGH);
delay(100);
digitalWrite(6, LOW);
delay(100);
}




}
}

Mas enquanto a lâmpada pisca não há como desliga-la sem reiniciar o Arduino; Alguma dica?

Andrew, chegou a testar o código que enviei ?

você pode fazer assim

int total_repeticoes = 100;

bool repete = false;

if(results.value==0x9CB92){
     repete = true;
}

int i = 0;

while(repete) {

    digitalWrite(6, !digitalRead(6));
    delay(600);
    i++;

    if(i == total_repeticoes) {

         repete = false;

         i = 0;

    }

}

é só a logica, mas ai vc implementa como quiser.

De uma olhada no blinkwithoutdelay 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço