Arduino Buzzer acionado por IR

Saudações a todos! gostaria de tirar uma duvida sobre um microcontrolador que estou criando no tinkercard que não está fazendo o esperado :frowning:

De forma resumida, é um microcontrolador que deveria acionar o buzzer para alarmar (o tipo do alarme não importa nesse caso) ao ser teclado algum botão do Controle infravermelho. o codigo que estou utilizando é esse:

#include <IRremote.h>

#define IR_RECEIVE_PIN 11  // Pino do receptor IR
#define LED_PIN 13       // Pino do LED vermelho
#define BUZZER_PIN 12     // Pino do buzzer
int tecla;
const int teclaAlarme = 12345; //Deixando esses numeros para que funcionem a maioria dos botoões

void setup() {
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN);
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  digitalWrite(BUZZER_PIN, LOW);
}

void loop() {
  if (IrReceiver.decode()) {
    tecla = IrReceiver.decodedIRData.command;
    Serial.println(tecla);

    // Liga o LED por 500ms
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    
    // Verifica se a tecla pressionada é a tecla de alarme
    if (tecla == teclaAlarme) {
      // Toca o buzzer
      tone(BUZZER_PIN, 1000);
      // Frequência de 1000Hz
      delay(300);
      noTone(BUZZER_PIN);
    }
    IrReceiver.resume();
  }
}

e o meu circuito está dessa forma:

Agradeço quem puder me tirar essa duvida.

Você já tentou perguntar ao chatGPT?

Talvez vc consiga, explique direitinho ao ChatGPT todas as funções, para saber o que está dando errado!

Tópico movido; por favor leia Como obter o melhor desse Fórum

1 Like

Olá! Bem vindo ao Fórum.

Eu acho que o que você diz no comentário não está funcionando como você queria.

O buzzer só será ativado quando a variável tecla for exatamente 12345 e não quando qualquer tecla for apertada. Para o buzzer funcionar com qualquer tecla é suficiente fazer:

if (tecla != 0) {
      // Toca o buzzer
      tone(BUZZER_PIN, 1000);
      // Frequência de 1000Hz
      delay(300);
      noTone(BUZZER_PIN);
    }

PS: Eu não sei se o Tinkercad diferencia buzzers ativos de passivos. Seu código foi feito para buzzer passivo.

O Chat GPT realmente pode ser muito útil em ajudar na programação, mas só se o usuário tiver entendimento suficiente para identificar eventuais pontos falhos do código sugerido.

Até chegar nesse ponto, é interessante que a pessoa procure aprender a programar por si mesma :wink:

1 Like

Sim, diversas vezes e de maneiras diferentes para extrair outros resultados e testar também, mas todos foram falhos...

Acredito que o que faz a distinção do buzzer ser ativo ou passivo, seja o codigo, ainda não me familiarizei com todas as funções do tinkercard para responder isso de forma precisa...

Eu troquei o trecho do codigo que voce forneceu, não obtive sucesso... Agora eu so consigo pressionar exatamente 1 tecla, ele apos pressionar a primeira tecla que seja, "para", não consigo mais clicar em nenhum outro botão.

Fico imaginando se o problema está realmente no codigo ou no circuito em si.

Bom, eu não tenho como avaliar ele nesse momento, mas dou uma olhada no fim de semana, caso você não consiga resolver até lá.

Uma pergunta que me ocorreu com base na "deixa" do @fabio_arduino : esse código você tirou de algum tutorial e modificou ou é obra do Chat GPT?

Eu tirei de 2 tutoriais que vi e uni, um sobre IR que eu peguei algumas ideias e o outro sobre um sensor de movimentos que aciona um buzzer. A minha ideia inicial era fazer somente 1 microcontrolador que acionasse o buzzer pelo sensor de movimentos e pelo controle, mas não consegui e optei por fazer separadamente (tenho já feito o de sensor de movimentos que aciona o buzzer).

Eu ainda estou tentando, agradeço o seu feedback sobre algo que esteja errado e eu não tenha visto, acredito que seja algum erro "bobo" mas como não possuo muito conhecimento ainda, estou a deriva das pesquisas.

Eu estava vasculhando aqui a internet e vi que há uma incompatibilidade entre a biblioteca IRremote e o uso da função tone(). Acho que isso é que está fazendo seu programa travar.

Eu refiz sua montagem no Wokwi (tirando o buzzer) e o programa abaixo funciona normalmente:

#include <IRremote.h>

#define IR_RECEIVE_PIN 11  // Pino do receptor IR
#define LED_PIN 13       // Pino do LED vermelho
//#define BUZZER_PIN 12     // Pino do buzzer
int tecla;
const int teclaAlarme = 12345; //Deixando esses numeros para que funcionem a maioria dos botoões

void setup() {
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN);
  pinMode(LED_PIN, OUTPUT);
  //pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  //digitalWrite(BUZZER_PIN, LOW);
}

void loop() {
  if (IrReceiver.decode()) {
    tecla = IrReceiver.decodedIRData.command;
    Serial.println(tecla);
    IrReceiver.resume();

    // Liga o LED por 500ms
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
  }
}

Se o buzzer for absolutamente necessário no seu projeto e se o tipo de alarme não importa, a solução mais simples é trocar o buzzer passivo por um ativo, que vai emitir o som em uma única frequência, mas é ativado como um LED.

Com esse seu comentario eu fui atras de saber como utilizar o buzzer ativo no tinkercard, então achei uma "solução".

O problema do IRemote e a função tone() realmente podem ter incompatibilidades e ter alguns travamentos, mas também é possivel usar o digitalWrite(BUZZER_PIN,HIGH), que foi o que eu testei e funcionou! Acho uma pena não poder usar o tone() para controlar a frequencia, mas isso já é um grande adianto. Agradeço!

Sim, como você mesmo disse, ao menos no Wokwi a distinção entre um buzzer ativo e um passivo é apenas na programação. Esse último formato que você usou é justamente a programação para um buzzer ativo. :wink:

Fico feliz que esteja avançando! Divirta-se! :upside_down_face:

1 Like