En realitat es tracta d'un micròfon i un petit amplificador muntat en una placa, com aquest que permet ajustar l'amplificació del senyal.
[AF]El sensor es connecta amb tres fils: els d'alimentació (positiu, VCC, i negatiu, GND) i el de senyal que connectarem a una entrada analògica.
El sensor ens dóna una lectura proporcional al senyal de so, que és una ona. Atès que les entrades analògiques només admeten tensions positives, el sensor suma la meitat de la tensió d'alimentació al senyal de sortida. Això vol dir que en silenci llegirem un valor de 511 i quan hi ha so tindrem valors que oscil·laran al voltant d'aquest nombre. El programa següent activa el LED de la placa quan sent un so prou fort (un xiulet o picar de mans) i el manté activat durant 0,1 s. Si el so no supera el llindar el LED s'apaga.
#define MICpin A6 #define llindar 700 #define LED 6
int lectura;
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
}
void loop() {
lectura = analogRead(MICpin);
Serial.print("Lectura = ");
Serial.println(lectura);
if(lectura > llindar){
digitalWrite(LED, HIGH);
delay(100);
} else {
digitalWrite(LED, LOW);
}
}
Si volem conèixer el nivell de so actual caldrà tractar els valors llegits per trobar l'amplitud o el valor RMS del so. Una forma senzilla és llegir el senyal un cert nombre de vegades i guardar-se el valor més gran i el més petit. Acabada la lectura, l'amplitud serà la resta dels dos; llavors podrem tornar a mirar l'evolució del senyal.
#define MICpin A6
int lectura, ampli, maxim, minim;
void setup() {
Serial.begin(9600);
}
void loop() {
maxim = 0;
minim = 1024;
for (int i = 0; i < 500; i++){
lectura = analogRead(MICpin);
if(lectura > maxim){
maxim = lectura;
}
if(lectura < minim){
minim = lectura;
}
}
Serial.print("Maxim = ");
Serial.println(maxim);
Serial.print("Minim = ");
Serial.println(minim);
ampli = maxim - minim;
Serial.print("Amplitud = ");
Serial.println(ampli);
}
Una ona de so pot tenir uns màxims molt acusats però de durada molt curta. Llavors ens donarà una amplitud gran però que no representa la potència del so. Una manera molt millor de mesurar el nivell del so és calcular el seu valor eficaç o RMS normalitzat. Per calcular el valor eficaç normalitzat necessitem calcular primer la mitjana:

I després calcularem el valor eficaç de la resta entre cada valor i la mitjana per tal que els valors estiguin normalitzats (centrats en el zero):

El següent programa fa el càlcul que hem comentat.
#define MICpin A6 #define numMost 500
int lectures[numMost]; int lectura, maxim, minim, suma; float rms, lecCorr, mitjana;
void setup() {
Serial.begin(9600);
}
void loop() {
maxim = 0;
minim = 1024;
suma = 0;
for (int i = 0; i < numMost; i++){
lectura = analogRead(MICpin);
suma = suma + lectura;
if(lectura > maxim){
maxim = lectura;
}
if(lectura < minim){
minim = lectura;
}
lectures[i] = lectura;
}
Serial.print("Maxim = ");
Serial.println(maxim);
Serial.print("Minim = ");
Serial.println(minim);
mitjana = float(suma) / numMost;
rms = 0;
for (int i = 0; i < numMost; i++){
lecCorr = float(lectures[i]) - mitjana;
rms = rms + lecCorr * lecCorr;
}
rms = sqrt(rms / numMost);
Serial.print("RMS = ");
Serial.println(rms);
}
En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.