Interruptor com botão para duas ações diferentes

Ola a todos

Estou tendo dificuldade em criar um código. Agradeço de puderem me dar uma luz.

Objetivo do código:

  • Ao pressionar o botão, ele irá acender um LED
  • O LED permanece aceso
  • No mesmo instante, é enviado um comando de IRSEND para ligar um eletronico, uma unica vez
  • O LED permanece aceso
  • Ao pressionar o botão novamente, o LED será apagado
  • No mesmo instante, é enviado um comando de IRSEND para desligar um eletronico, uma unica vez
  • O LED permanece apagado até que seja pressionado novamente o botão

Meus problemas:

  • Consigo acender e apagar o LED com o botão, permanecendo aceso ou desligado
  • Quando coloco o comando de IR, ele fica repetindo enviando comando, isso faz meu eletronico ser ligado/desligado consecutivas vezes

Vejam o código:

#include <IRremote.h>

const int buttonPin = 1; // BOTAO POWER - PINO 1
const int ledPin = 8; // LIGAR FONTE PC/PROJETOR - PINO 4
 
int khz=38;
unsigned int Signal_0_0[] = {9000,4500,560,560,560,560,560,1690,560,560,560,560,560,560,560,560,560,560,560,1690,560,1690,560,560,560,1690,560,1690,560,1690,560,1690,560,1690,560,560,560,560,560,560,560,1690,560,560,560,560,560,560,560,560,560,1690,560,1690,560,1690,560,560,560,1690,560,1690,560,1690,560,1690,560};

int estado = 0;
int guarda_estado = LOW;

IRsend irsend; // IRLED - PINO 3

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
 
void loop(){
estado = digitalRead(buttonPin);
 
if (estado == HIGH) {
guarda_estado = !guarda_estado;
delay(500);
}
 
if (guarda_estado == HIGH) {
digitalWrite(ledPin, HIGH);

  irsend.sendRaw(Signal_0_0, sizeof(Signal_0_0)/sizeof(int), khz); //AnalysIR Batch Export (IRremote) - RAW
  delay(500);

  irsend.sendNEC(0x20DF10EF, 32); //AnalysIR Batch Export (IRremote) // AnalysIR IR Protocol: NEC, 
  delay(500);
  
}
else {
digitalWrite(ledPin, LOW);

  irsend.sendRaw(Signal_0_0, sizeof(Signal_0_0)/sizeof(int), khz); //AnalysIR Batch Export (IRremote) - RAW
  delay(500);

  irsend.sendNEC(0x20DF10EF, 32); //AnalysIR Batch Export (IRremote) // AnalysIR IR Protocol: NEC, 
  delay(500);
  
}

}

O teu código não está a fazer o que tu pensas.

estado = digitalRead(buttonPin);
unsigned char estado_led = 0; //variavel nova
 
if (estado == HIGH && guarda_estado =! estado) {
   //botão foi pressionado 
   if (estado_led) { //led estava ligado
      estado_led = 0;
      //coloca aqui os comandos IR para desligar o dispositivo electronico.
      }
   else { //led estava desligado.
      estado_led = 1;
      //coloca aqui o comando IR para ligar o dispoositivo.
   }
   digitalWrite(ledPin, estado_LED); //esta instrução pode ficar aqui
delay(500);
}
guarda_estado = estado;//faz update do estado do pino para a detecção de flanco funcionar em cima.

Precisa usar uma flag.
Segue exemplo de como ligar o LED e pode usar para fazer a parte de enviar o sinal.
Exemplo

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