,

Fazendo som com LDR e buzzer

Posted by

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.

Diagrama esquemático do circuito, LDR com buzzer
Diagrama esquemático do circuito, LDR com buzzer

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.

Fazer som com LDR, buzzer e arduino
Fazer som com LDR, buzzer e arduino

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

O seu endereço de email não será publicado. Campos obrigatórios marcados com *