Questo progetto Arduino usa 8 LED e i chip MAX9814 e 74HC595 per presentare il livello del suono. I LED si accendono seguendo il volume audio
Come funziona
Il microfono MAX9814 cattura il suono ambientale e invia questi dati all’Arduino. L’Arduino elabora i dati del microfono per determinare l’intensità del suono e controlla 8 LED disposti in un ordine specifico: 3 LED verdi rappresentano livelli sonori bassi, 2 LED blu per livelli medi e 3 LED rossi per livelli alti. Man mano che l’intensità del suono aumenta, si accendono più LED, passando dal verde al rosso, fornendo una rappresentazione visiva del livello sonoro.
Componenti
- Microfono MAX9814: capta le onde sonore.
- Arduino: elabora i dati del microfono e controlla i LED.
- Registro a scorrimento 74HC595: gestisce gli 8 LED con un numero minimo di pin Arduino.
- 8 LED: visualizzano i livelli sonori.
- 8 resistori da 330 ohm,
Codice sorgente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
const int micPin = A0; // Pin A0 is used for the microphone input int sample; // Variable to store the current sound sample int maxVal = 0; // Variable to track the maximum sound level detected int minVal = 1023; // Variable to track the minimum sound level detected // Shift register pins int LatchPin = 3; // Pin 3 is connected to the LatchPin (ST_CP) of the 74HC595 int ClockPin = 5; // Pin 5 is connected to the ClockPin (SH_CP) of the 74HC595 int DataPin = 2; // Pin 2 is connected to the DataPin (DS) of the 74HC595 // Binary patterns for the LEDs, representing different sound levels byte LEDs0 = 0b10000000; // LED pattern for the lowest sound level byte LEDs1 = 0b10000001; byte LEDs2 = 0b10000011; byte LEDs3 = 0b10000111; byte LEDs4 = 0b10001111; byte LEDs5 = 0b10011111; byte LEDs6 = 0b10111111; byte LEDs7 = 0b11111111; // LED pattern for the highest sound level void setup() { // Setting the shift register pins as outputs pinMode(LatchPin, OUTPUT); pinMode(ClockPin, OUTPUT); pinMode(DataPin, OUTPUT); // Setting the microphone pin as an input pinMode(micPin, INPUT); // Starting the serial communication for debugging (optional) Serial.begin(9600); } void loop() { // Process microphone data to determine the peak-to-peak value for (int i = 0; i < 100; i++) { // Take 100 samples to find the sound range sample = analogRead(micPin); // Read the current sound level from the microphone if (sample > maxVal) { // Update maxVal if the current sample is greater maxVal = sample; } if (sample < minVal) { // Update minVal if the current sample is lower minVal = sample; } } int peakToPeak = maxVal - minVal; // Calculate the peak-to-peak value // Convert the peak-to-peak value to a voltage level (0-5V range) float voltage = (peakToPeak * 5.0) / 1023.0; // Prepare to send data to the shift register by setting the latch pin low digitalWrite(LatchPin, LOW); // Determine which LED pattern to display based on the voltage level if(voltage > 2.4){ // Highest sound level shiftOut(DataPin, ClockPin, LSBFIRST, LEDs7); // Send the LED pattern for the highest sound digitalWrite(LatchPin, HIGH); // Latch the data to display the LEDs } else if(voltage > 2.1){ // Second highest sound level shiftOut(DataPin, ClockPin, LSBFIRST, LEDs6); // Send the corresponding LED pattern digitalWrite(LatchPin, HIGH); } else if(voltage > 1.8){ // Third highest sound level shiftOut(DataPin, ClockPin, LSBFIRST, LEDs5); // Send the corresponding LED pattern digitalWrite(LatchPin, HIGH); } else if(voltage > 1.5){ // Medium-high sound level shiftOut(DataPin, ClockPin, LSBFIRST, LEDs4); // Send the corresponding LED pattern digitalWrite(LatchPin, HIGH); } else if(voltage > 1.2){ // Medium sound level shiftOut(DataPin, ClockPin, LSBFIRST, LEDs3); // Send the corresponding LED pattern digitalWrite(LatchPin, HIGH); } else if(voltage > 0.9){ // Low-medium sound level shiftOut(DataPin, ClockPin, LSBFIRST, LEDs2); // Send the corresponding LED pattern digitalWrite(LatchPin, HIGH); } else if(voltage > 0.6){ // Low sound level shiftOut(DataPin, ClockPin, LSBFIRST, LEDs1); // Send the corresponding LED pattern digitalWrite(LatchPin, HIGH); } else if(voltage > 0.0){ // Lowest sound level shiftOut(DataPin, ClockPin, LSBFIRST, LEDs0); // Send the corresponding LED pattern digitalWrite(LatchPin, HIGH); } // Reset maxVal and minVal for the next set of samples maxVal = 0; minVal = 1023; } |
Analizziamo il codice. Inizialmente definiamo le variabili per il sampling dei valori, quelle per la gestione del 74HC595 ed i pattern di bit che gestiranno quali LED accendere.
Nel setup definiamo invece le modalità (output) dei pin del 74HC595, definiamo il microfono come input e inizializziamo la seriale.
Il loop è suddiviso in un ciclo di 100 passi, in cui vengono letti 100 valori del microfono e ne vengono estratti il maggiore ed il minore. Il valore picco-picco così ricvavato viene “digitalizzato” in 1024 steps (10 bit) e trasformato in un valore di tensione compreso tra 0 e 5V.
Viene quindi inviato un segnale (latch) all’integrato 74HC595 per avvertirlo che stiamo per trasmettere i dati. A seconda della tensione raggiunta nel nostro campionamento, “accenderemo” un determinato pattern di LED.
Considerazioni finali
Con una manciata di euro è possibile autocostruirsi un divertente strumento per l’analisi del “loudness”. Utilizzando un microfono più sensibile o un DAC a 16 bit potremo addirittura quadruplicare la sensibilità del nostro strumentino. Applicando un filtro basato su FFT, infine, potremo realizzare un vero e proprio analizzatore di spettro audio, tarato sulla potenza in uscita di differenti frequenze…
Buon divertimento!
Iscriviti ai nostri gruppi Telegram
Link utili
- Arduino UNO R3
- Elegoo UNO R3
- Arduino Starter Kit per principianti
- Elegoo Advanced Starter Kit
- Arduino Nano
- Raspberry PI 5
- Raspberry PI 400
- Raspberry PI Pico
- Programmiamo il Pico