Controlador para fita led com arduino

ESTOU FAZENDO UM CONTROLADOR PARA UMA FITA LED COM ARDUINO

Não consigo fazer com que quando eu apertar o botão e soltar (TECLA4), o led fique no modo fade(modo onde o led aumenta e diminui o brilho lentamente), até que outro botão seja apertado ou o mesmo seja desligado. O O que acontece é: ou ele executa uma veze e para, ou fica em loop infinito. As demais funções de cores únicas consegui fazer com um único botão como liga e desliga. Só falta essa lógica que estou quebrando a cabeça.

#define tecla1 0xFF0AF5
#define tecla2 0xFFAA55
#define tecla3 0xFF12ED
#define tecla4 0xFF7A85

#define VERDE 10
#define VERMELHO 9
#define AZUL 6
#include <IRremote.h>

int dadosIR = 12;
int flag0 = 0;
int flag1 = 0;
int flag2 = 0;

IRrecv irrecv(dadosIR);
decode_results resultados;

void setup() {
pinMode(VERDE, OUTPUT);
pinMode(VERMELHO, OUTPUT);
pinMode(AZUL, OUTPUT);
Serial.begin(9600);
digitalWrite(VERDE, LOW);
digitalWrite(VERMELHO, LOW);
digitalWrite(AZUL, LOW);
Serial.println("Ligando Controle...");
irrecv.enableIRIn();
Serial.println("Controle remoto habilitado");
}

void loop() {

if (irrecv.decode(&resultados)) {
Serial.println(resultados.value, HEX);

switch (resultados.value) {
  case tecla1: verde(); break;
  case tecla2: vermelho(); break;
  case tecla3: azul(); break;
  case tecla4: efeito_verde(); break;
}

irrecv.resume();

}
delay(100);
}

void efeito_verde() {
int r1, r2;
while (1) {
for (r1 = 0; r1 <= 255; r1++) {
analogWrite(VERDE, r1);
delay(10);
}
for (r2 = 255; r2 >= 0; r2--) {
analogWrite(VERDE, r2);
delay(10);
}
}
}

void verde () {
if (flag0 == 0) {
flag0 = 1;
} else
flag0 = 0;
digitalWrite(VERDE, flag0);
}

void vermelho () {
if (flag1 == 0) {
flag1 = 1;
} else
flag1 = 0;
digitalWrite(VERMELHO, flag1);
}

void azul () {
if (flag2 == 0) {
flag2 = 1;
} else
flag2 = 0;
digitalWrite(AZUL, flag2);
}

Olá @andre_tacti ,
quando for postar sketchs ou printouts post entre tags </>, que fica mais
fácil de visualizar seu sketch, copia-lo e navegar pelo tópico.

Teste a modificação que fiz no seu sketch e depois conta o resultado.

#define tecla1 0xFF0AF5
#define tecla2 0xFFAA55
#define tecla3 0xFF12ED
#define tecla4 0xFF7A85

#define VERDE 10
#define VERMELHO 9
#define AZUL 6
#include <IRremote.h>

int dadosIR = 12;
int flag0 = 0;
int flag1 = 0;
int flag2 = 0;

IRrecv irrecv(dadosIR);
decode_results resultados;
//-----------------------------------------------------------
void setup()
{
  pinMode(VERDE, OUTPUT);
  pinMode(VERMELHO, OUTPUT);
  pinMode(AZUL, OUTPUT);
  Serial.begin(9600);
  digitalWrite(VERDE, LOW);
  digitalWrite(VERMELHO, LOW);
  digitalWrite(AZUL, LOW);
  Serial.println("Ligando Controle...");
  irrecv.enableIRIn();
  Serial.println("Controle remoto habilitado");
}
//-----------------------------------------------------------
void loop()
{
  if (irrecv.decode(&resultados))
  {
    Serial.println(resultados.value, HEX);
    switch (resultados.value)
    {
      case tecla1: verde(); irrecv.resume(); break;
      case tecla2: vermelho(); irrecv.resume(); break;
      case tecla3: azul();  irrecv.resume();break;
      case tecla4: efeito_verde(); break;
    }
  }
  delay(100);
}
//-----------------------------------------------------------
void efeito_verde()
{
  int r1, r2;
  for (r1 = 0; r1 <= 255; r1++)
  {
    analogWrite(VERDE, r1);
    delay(10);
  }
  for (r2 = 255; r2 >= 0; r2--)
  {
    analogWrite(VERDE, r2);
    delay(10);
  }
}
//-----------------------------------------------------------
void verde ()
{
  if (flag0 == 0)
  {
    flag0 = 1;
  }
  else
    flag0 = 0;
  digitalWrite(VERDE, flag0);
}
//-----------------------------------------------------------
void vermelho ()
{
  if (flag1 == 0)
  {
    flag1 = 1;
  }
  else
    flag1 = 0;
  digitalWrite(VERMELHO, flag1);
}
//-----------------------------------------------------------
void azul ()
{
  if (flag2 == 0)
  {
    flag2 = 1;
  }
  else
    flag2 = 0;
  digitalWrite(AZUL, flag2);
}

RV mineirin

1 Like

Boa tarde @ruilviana, obrigado pela dica sobre como postar códigos.
1° - Eu testei a sua mudança, vc tirou o while(1) da função efeito_verde que fazia o código entrar em loop infinito.
2°- Da maneira que vc deixou, quando eu aperto o botão ele executa uma vez o efeito_verde e para. Eu preciso que ele continue executando o efeito até que outra tecla seja apertada.

Deveria ficar rodando direto o efeito fade.
Faça um teste.
Colioque um serial.print com qq coisa dento da função
feito_verde() e veja se fica sempre imprimindo o se imprime só uma vez?
Precisa não, já descobri o erro.
Vou mudar o seu sketch.

RV mineirin

1 Like

@andre_tacti .
Testa este agora;

RV mineirin

#define tecla1 0xFF0AF5
#define tecla2 0xFFAA55
#define tecla3 0xFF12ED
#define tecla4 0xFF7A85

#define VERDE 10
#define VERMELHO 9
#define AZUL 6
#include <IRremote.h>

int dadosIR = 12;
int flag0 = 0;
int flag1 = 0;
int flag2 = 0;
bool flag = false;

IRrecv irrecv(dadosIR);
decode_results resultados;
//-----------------------------------------------------------
void setup()
{
  pinMode(VERDE, OUTPUT);
  pinMode(VERMELHO, OUTPUT);
  pinMode(AZUL, OUTPUT);
  Serial.begin(9600);
  digitalWrite(VERDE, LOW);
  digitalWrite(VERMELHO, LOW);
  digitalWrite(AZUL, LOW);
  Serial.println("Ligando Controle...");
  irrecv.enableIRIn();
  Serial.println("Controle remoto habilitado");
}
//-----------------------------------------------------------
void loop()
{
  if (irrecv.decode(&resultados))
  {
    Serial.println(resultados.value, HEX);
    switch (resultados.value)
    {
      case tecla1: flag = false; verde(); break;
      case tecla2: flag = false; vermelho() ; break;
      case tecla3: flag = false; azul(); break;
      case tecla4: flag = true; efeito_verde(); break;
    }
    irrecv.resume();
  }
  delay(100);
}
//-----------------------------------------------------------
void efeito_verde()
{
  if (flag == true)
  {
    int r1, r2;
    for (r1 = 0; r1 <= 255; r1++)
    {
      analogWrite(VERDE, r1);
      delay(10);
    }
    for (r2 = 255; r2 >= 0; r2--)
    {
      analogWrite(VERDE, r2);
      delay(10);
    }
  }
}
//-----------------------------------------------------------
void verde ()
{
  if (flag0 == 0)
  {
    flag0 = 1;
  }
  else
    flag0 = 0;
  digitalWrite(VERDE, flag0);
}
//-----------------------------------------------------------
void vermelho ()
{
  if (flag1 == 0)
  {
    flag1 = 1;
  }
  else
    flag1 = 0;
  digitalWrite(VERMELHO, flag1);
}
//-----------------------------------------------------------
void azul ()
{
  if (flag2 == 0)
  {
    flag2 = 1;
  }
  else
    flag2 = 0;
  digitalWrite(AZUL, flag2);
}
1 Like

Amigo, ainda está com o mesmo problema, ele está fazendo o efeito somente uma vez por clique, e não mantendo a sequência até que outra tecla seja acionada. O problema é somente no efeito_verde(modo fade) o restante do código está funcionando perfeitamente.

Ops
falha minha.
Vou consertar, peraí.

1 Like

Roda este agora,

#define tecla1 0xFF0AF5
#define tecla2 0xFFAA55
#define tecla3 0xFF12ED
#define tecla4 0xFF7A85

#define VERDE 10
#define VERMELHO 9
#define AZUL 6
#include <IRremote.h>

int dadosIR = 12;
int flag0 = 0;
int flag1 = 0;
int flag2 = 0;
bool flag = false;

IRrecv irrecv(dadosIR);
decode_results resultados;
//-----------------------------------------------------------
void setup()
{
  pinMode(VERDE, OUTPUT);
  pinMode(VERMELHO, OUTPUT);
  pinMode(AZUL, OUTPUT);
  Serial.begin(9600);
  digitalWrite(VERDE, LOW);
  digitalWrite(VERMELHO, LOW);
  digitalWrite(AZUL, LOW);
  Serial.println("Ligando Controle...");
  irrecv.enableIRIn();
  Serial.println("Controle remoto habilitado");
}
//-----------------------------------------------------------
void loop()
{
  if (irrecv.decode(&resultados))
  {
    Serial.println(resultados.value, HEX);
    switch (resultados.value)
    {
      case tecla1: flag = false; verde(); break;
      case tecla2: flag = false; vermelho() ; break;
      case tecla3: flag = false; azul(); break;
      case tecla4: flag = true;  break;
    }
    irrecv.resume();
  }
  efeito_verde();
  delay(100);
}
//-----------------------------------------------------------
void efeito_verde()
{
  if (flag == true)
  {
    int r1, r2;
    for (r1 = 0; r1 <= 255; r1++)
    {
      analogWrite(VERDE, r1);
      delay(10);
    }
    for (r2 = 255; r2 >= 0; r2--)
    {
      analogWrite(VERDE, r2);
      delay(10);
    }
  }
}
//-----------------------------------------------------------
void verde ()
{
  if (flag0 == 0)
  {
    flag0 = 1;
  }
  else
    flag0 = 0;
  digitalWrite(VERDE, flag0);
}
//-----------------------------------------------------------
void vermelho ()
{
  if (flag1 == 0)
  {
    flag1 = 1;
  }
  else
    flag1 = 0;
  digitalWrite(VERMELHO, flag1);
}
//-----------------------------------------------------------
void azul ()
{
  if (flag2 == 0)
  {
    flag2 = 1;
  }
  else
    flag2 = 0;
  digitalWrite(AZUL, flag2);
}

RV mineirin

1 Like

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.