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);
}
}
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por