Saudações a todos! gostaria de tirar uma duvida sobre um microcontrolador que estou criando no tinkercard que não está fazendo o esperado
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();
}
}
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
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.
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.