Arduino - Sensor de Som

O sensor de som é capaz de detectar a presença de som no ambiente ao redor. Ele pode ser usado para criar projetos que reagem ao som, como luzes ativadas por palmas ou um alimentador de pets ativado por som.

Neste tutorial, vamos aprender a usar o Arduino e o sensor de som para detectar o som. Em detalhes, vamos aprender:

Sensor de som com Arduino

Depois, você pode ajustar o código para acender um LED ou uma lâmpada (por meio de um relé) quando ele detectar som, ou até fazer um servo motor girar.

Sobre o Sensor de Som

O sensor de som pode ser usado para detectar a presença de som no ambiente ao redor. Existem dois tipos de módulo sensor de som:

  • Módulo sensor de som digital: fornece o valor de sinal digital (ON/OFF)
  • Módulo sensor de som analógico: fornece valores de sinal analógico e digital

A sensibilidade da saída digital pode ser ajustada usando um potenciômetro embutido.

Pinagem do Sensor de Som Digital

O sensor de som digital tem três pinos:

  • Pino VCC: precisa ser conectado ao VCC (3.3V a 5V)
  • Pino GND: precisa ser conectado ao GND (0V)
  • Pino OUT: é um pino de saída: HIGH quando está silencioso e LOW quando um som é detectado. Este pino precisa ser conectado a um pino de entrada do Arduino.
Pinagem do Sensor de Som
image source: diyables.io

O sensor de som também tem um potenciômetro embutido, que pode ser usado para ajustar a sensibilidade do sensor. Além disso, ele tem dois LEDs indicadores:

  • Um LED indicador para a alimentação
  • Um LED indicador para o estado do som: aceso quando há som, apagado quando está silencioso

Pinagem do Sensor de Som Analógico

O sensor de som analógico tem quatro pinos:

  • Pino +: precisa ser conectado ao 5V
  • Pino G: precisa ser conectado ao GND (0V)
  • Pino DO: é um pino de saída digital: HIGH quando está silencioso e LOW quando um som é detectado. Este pino precisa ser conectado a um pino de entrada digital do Arduino.
  • Pino AO: é um pino de saída analógica: fornece o valor analógico que indica o nível do som. Este pino precisa ser conectado a um pino de entrada analógica do Arduino.
Pinagem do sensor de som analógico
image source: diyables.io

O sensor de som analógico tem um prático potenciômetro embutido que permite ajustar facilmente a sensibilidade da saída digital. Além disso, ele vem com dois LEDs indicadores:

  • Um LED indicador mostra o estado da alimentação.
  • Outro LED indicador mostra o estado do som, acendendo quando um som é detectado e apagando quando está silencioso.

Como Funciona

O módulo tem um potenciômetro embutido para definir a sensibilidade ao som.

  • Quando o som é detectado, o pino de saída do sensor fica em LOW
  • Quando o som NÃO é detectado, o pino de saída do sensor fica em HIGH

Diagrama de Ligação

Diagrama de Ligação do Sensor de Som com Arduino

This image is created using Fritzing. Click to enlarge image

A ligação real:

Conexão do Sensor de Som com Arduino

Como Programar o Sensor de Som

  • Inicializa o pino do Arduino no modo de entrada digital usando a função pinMode(). Por exemplo, o pino 5
pinMode(5, INPUT);
  • Lê o estado do pino do Arduino usando a função digitalRead().
int soundState = digitalRead(5);

Código Arduino - Detectando o som

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-sound-sensor */ // Arduino's pin connected to OUT pin of the sound sensor #define SENSOR_PIN 5 int lastState = HIGH; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the Arduino's pin as an input pinMode(SENSOR_PIN, INPUT); } void loop() { // read the state of the the input pin: currentState = digitalRead(SENSOR_PIN); if (lastState == HIGH && currentState == LOW) Serial.println("The sound has been detected"); else if (lastState == LOW && currentState == HIGH) Serial.println("The sound has disappeared"); // save the the last state lastState = currentState; }

Passos Rápidos

  • Copie o código acima e abra-o no Arduino IDE
  • Clique no botão Upload no Arduino IDE para carregar o código no Arduino
  • Bata palmas na frente do sensor de som
  • Veja o resultado no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The sound has been detected The sound has disappeared The sound has been detected The sound has disappeared
Ln 11, Col 1
Arduino Uno on COM15
2

Lembre-se de que, se você perceber que o LED fica sempre aceso ou sempre apagado, mesmo quando há som, você pode ajustar o potenciômetro para regular a sensibilidade ao som do sensor.

Agora podemos personalizar o código para acender um LED ou uma lâmpada quando um som for detectado, ou até fazer um servo motor girar. Você encontra mais informações e instruções passo a passo nos tutoriais indicados no final deste tutorial.

Solução de Problemas

Se o sensor de som não estiver funcionando corretamente, tente os seguintes passos:

  • Reduza as vibrações: O sensor de som também é sensível a vibrações mecânicas e ao ruído do vento. Montar o sensor de som em uma superfície firme pode ajudar a minimizar essas vibrações.
  • Considere o alcance de detecção: Lembre-se de que este sensor de som tem um alcance de detecção curto, de cerca de 10 polegadas. Para obter leituras precisas, você precisará fazer o barulho mais perto do sensor de som.
  • Verifique a fonte de alimentação: Garanta que a fonte de alimentação seja limpa, pois o sensor de som é sensível a ruídos na alimentação por ser um circuito analógico.

Vídeo

O vídeo de demonstração abaixo usa o código abaixo. Observe que o vídeo mostra o Arduino Uno R4, mas funciona da mesma forma no Arduino Uno R3:

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-sound-sensor */ //===================================================== // SOUND CONTROLLED LED EFFECTS // 1 Clap -> Blink All // 2 Claps -> Water Wave // 3 Claps -> Inside Out // 4 Claps -> Random Dance //===================================================== #define SOUND_PIN 10 const byte LED_PINS[] = {2,3,4,5,6,7,8,9}; const byte NUM_LEDS = sizeof(LED_PINS); const unsigned long CLAP_DEBOUNCE = 80; const unsigned long CLAP_TIMEOUT = 700; //----------------------------------------------------- // Clap detection //----------------------------------------------------- bool lastSound = HIGH; unsigned long lastClapTime = 0; byte clapCount = 0; bool waitingSequence = false; //----------------------------------------------------- // Effect control //----------------------------------------------------- byte currentEffect = 0; //----------------------------------------------------- // Effect 1 variables //----------------------------------------------------- unsigned long blinkTimer = 0; bool blinkState = false; //----------------------------------------------------- // Effect 2 variables //----------------------------------------------------- unsigned long waveTimer = 0; int waveIndex = 0; //----------------------------------------------------- // Effect 3 variables //----------------------------------------------------- unsigned long insideTimer = 0; int insideStep = 0; //----------------------------------------------------- // Effect 4 variables //----------------------------------------------------- unsigned long danceTimer = 0; //===================================================== void setup() { Serial.begin(115200); pinMode(SOUND_PIN, INPUT); for(int i=0;i<NUM_LEDS;i++) { pinMode(LED_PINS[i], OUTPUT); digitalWrite(LED_PINS[i], HIGH); // OFF } randomSeed(analogRead(A0)); Serial.println("System Ready"); } //===================================================== void loop() { detectClaps(); runEffect(); } //===================================================== // CLAP DETECTION //===================================================== void detectClaps() { bool soundValue = digitalRead(SOUND_PIN); unsigned long now = millis(); // Falling edge detection if(lastSound == HIGH && soundValue == LOW) { if(now - lastClapTime > CLAP_DEBOUNCE) { clapCount++; lastClapTime = now; waitingSequence = true; Serial.print("Clap: "); Serial.println(clapCount); } } lastSound = soundValue; // Sequence complete if(waitingSequence && (now - lastClapTime > CLAP_TIMEOUT)) { if(clapCount >= 1 && clapCount <= 4) { currentEffect = clapCount; Serial.print("Effect = "); Serial.println(currentEffect); resetEffectState(); } clapCount = 0; waitingSequence = false; } } //===================================================== void resetEffectState() { turnOffAll(); blinkState = false; waveIndex = 0; insideStep = 0; blinkTimer = waveTimer = insideTimer = danceTimer = millis(); } //===================================================== void turnOffAll() { for(int i=0;i<NUM_LEDS;i++) { digitalWrite(LED_PINS[i], HIGH); } } //===================================================== void runEffect() { switch(currentEffect) { case 1: effectBlinkAll(); break; case 2: effectWaterWave(); break; case 3: effectInsideOut(); break; case 4: effectDance(); break; default: break; } } //===================================================== // EFFECT 1 //===================================================== void effectBlinkAll() { if(millis() - blinkTimer >= 200) { blinkTimer = millis(); blinkState = !blinkState; for(int i=0;i<NUM_LEDS;i++) { digitalWrite( LED_PINS[i], blinkState ? LOW : HIGH ); } } } //===================================================== // EFFECT 2 //===================================================== void effectWaterWave() { if(millis() - waveTimer >= 70) { waveTimer = millis(); turnOffAll(); digitalWrite( LED_PINS[waveIndex], LOW ); waveIndex++; if(waveIndex >= NUM_LEDS) { waveIndex = 0; } } } //===================================================== // EFFECT 3 //===================================================== void effectInsideOut() { if(millis() - insideTimer >= 120) { insideTimer = millis(); turnOffAll(); switch(insideStep) { case 0: digitalWrite(LED_PINS[3], LOW); digitalWrite(LED_PINS[4], LOW); break; case 1: digitalWrite(LED_PINS[2], LOW); digitalWrite(LED_PINS[5], LOW); break; case 2: digitalWrite(LED_PINS[1], LOW); digitalWrite(LED_PINS[6], LOW); break; case 3: digitalWrite(LED_PINS[0], LOW); digitalWrite(LED_PINS[7], LOW); break; } insideStep++; if(insideStep > 3) { insideStep = 0; } } } //===================================================== // EFFECT 4 //===================================================== void effectDance() { if(millis() - danceTimer >= 80) { danceTimer = millis(); turnOffAll(); int a = random(NUM_LEDS); int b = random(NUM_LEDS); int c = random(NUM_LEDS); digitalWrite(LED_PINS[a], LOW); digitalWrite(LED_PINS[b], LOW); digitalWrite(LED_PINS[c], LOW); } }

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!