Você já pensou em fazer sons com LDR e buzzer? Acabei de fazer e vou mostrar como fazer exatamente isso neste post. Vamos fazer sons cuja frequência de oscilação muda dependendo da quantidade de luz recebida por um sensor.
A ideia é usar a função tone() no Arduino para gerar uma frequência, ligando-a e desligando-a (alternativamente) dependendo da quantidade de luz incidente em um sensor de luz LDR. Então mapearemos (usando a função map() do Arduino) o valor analógico do sensor para um intervalo específico de tempos em milissegundos.
Para este projeto, usarei um SeeedStudio Xiao ESP32-C6, um chip WiFi (do qual não usaremos o WiFi). Ele tem entradas analógicas que lerão em 4096 passos (12 bits) em vez dos 1024 passos (10 bits) do Arduino UNO. Tudo o que precisamos fazer é declarar no código do Arduino que queremos usar os 12 bits completos:
analogReadResolution(12);
Diagrama esquemático
Você pode ver abaixo o quão simples é esse experimento, tudo o que temos é um sensor de luz LDR (pino A0, com um resistor de 10k em série) e um buzzer conectado diretamente ao pino D7 do ESP32-C6.
Abaixo você pode ver a montagem do protótipo. Note que o sensor LDR já está soldado na placa de circuito, é uma característica dela.
O código
Conforme dito acima, estamos usando o Arduino e seu IDE (versão 2.3.3) para escrever, compilar e baixar o código para o Xiao ESP32-C6. Não há muito o que fazer, basicamente crio uma função que é inserida a cada intervalo de 25 a 800 milissegundos, dependendo das leituras do LDR. Dentro da função, essencialmente inverto o estado de um LED (pino 15, LED integrado do Xiao ESP32-C6) e o estado (ligado ou desligado) do pino do buzzer.
Com a maior quantidade de luz, temos um intervalo de 25 ms, enquanto com a menor quantidade de luz (essencialmente escuro), temos um intervalo de 800 ms.
long oldtime;
int ldrvalueconverted;
#define led 15
#define buzzer D7
void setup() {
// put your setup code here, to run once:
analogReadResolution(12);
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
ldrvalueconverted = map(analogRead(A0), 0, 4095, 800, 25);
if(millis() - oldtime > ldrvalueconverted){
oldtime= millis();
digitalWrite(led, !digitalRead(led));
if(digitalRead(led)){
tone(buzzer, 3000);
}else{
noTone(buzzer);
}
}
}
Escolhi a frequência de 3000Hz na função tone() porque soava bem, nada mais. Observe que fiz uma declaração IF dependente do estado do pino do LED, quando está HIGH eu toco o tom, quando está LOW eu vou noTone().
Pra finalizar
Há um vídeo do experimento abaixo, aproveite. Se quiser saber mais sobre sensor aqui no blog, clique aqui.
Deixe um comentário