Hoy toca hacer algo “chulo” con Arduino, un detector de sonido para encender luz con palmadas. Este circuito sin duda es el más típico en domótica. ¿Quién no ha visto en alguna película como encienden luces con una palmada? Esto hace unos años parecía ciencia ficción… hoy es algo tan normal como el ver mi serie favorita en el teléfono móvil.
Este circuito es muy sencillo, pero ya veréis que como yo soy un poco exigente, lo vamos a complicar un poquito más, pero con la intención para que sea un circuito mejor que conste.
Índice de Contenido
Material necesario
- 1 Arduino. (Comprar Arduino UNO)
- 1 Sensor PIR. (Comprar módulo detector de sonido).
- Cables
Módulo detector de sonido
La parte principal de este circuito, es un módulo detector de sonido. Este hace prácticamente todo el trabajo duro por nosotros.
El módulo tiene un pequeño altavoz que capta los sonidos, un potenciómetro y cuatro pines. Dos de estos pines son salidas, una digital y otra analógica.
La particularidad del módulo, es que cuando el sonido que recoge el altavoz supere un nivel (que se ajusta con el potenciómetro), la salida digital D0 pasará a estado lógico 1. Ahora es cuando muchos de vosotros pensareis “Para que usar Arduino, si este módulo lo hace ya todo. Le conecto un relé con una bombilla y punto…”
Si hiciéramos eso… tendríamos un circuito que destella con el sonido. No buscamos eso. Queremos un circuito que cuando le toque las palmas me encienda la luz del salón, y cuando se las vuelva a tocar, me apague la luz.
Para logar lo anterior, tenemos que echar mano de nuestro amigo Arduino. ¿Estáis listos?
Ah se me olvidaba, la salida analógica A0 muestra el valor analógico que recoge el micrófono, pero necesita ser amplificada para poder usarla en nuestro Arduino. Ya hay módulos que hacen todo eso, por lo que no merece la pena usar este módulo si necesitamos medir niveles de sonidos.
Ahora si, ¿Estáis listos?
Esquema eléctrico
Esquema gráfico de montaje
Código encender luz con palmadas
const int pinLED = 13; const int pinMicrophone = 9; bool state1 = false; bool state2 = false; bool state3 = false; bool stateLED = false; bool soundDetected = false; unsigned long tem; void setup(){ pinMode(pinLED, OUTPUT); pinMode(pinMicrophone, INPUT); Serial.begin(9600); } void loop(){ soundDetected = digitalRead(pinMicrophone); if ((soundDetected==true) && (state1==false) && (state2==false) && (state3==false)) { state1 = true; Serial.println("Estado1 true"); tem = millis(); delay (200); } else if ((soundDetected == true) && (state1==true) && (state2==false) && (state3==false) ) { state2 = true; Serial.println("Estado2 true"); delay (200); } else if ((soundDetected == true) && (state1==true) && (state2==true) && (state3==false) ) { state3 = true; Serial.println("Estado3 true"); delay (200); } if ((state1==true) && (state2==true) && (state3==true)){ stateLED = !stateLED; digitalWrite(pinLED , stateLED); Serial.println("Reset"); state1 = false; state2 = false; state3 = false; } if (((millis()-tem) >= 500) && (state1==true) && (state2==false || state3==false)){ // Reseteamos estados al pasar 500 ms Serial.println("Reset Time"); Serial.println((millis()-tem)); state1 = false; state2 = false; state3 = false; } }
Podéis descargaros el código directamente en un sketch: Descargar sketch
Descripción del código
El código tiene una primera definición de variables y constantes que se usaran en el programa. Seguido de esto, está la declaración de entradas y puerto serie que podemos emplear para verificar el funcionamiento.
Podría haber hecho un sencillo programa que cuando tocara las palmas sen encendiera la luz, cuando las volviera a tocar se apagara. Pero me parecía muy sencillo, y cualquier ruido me podría encender la luz de mi salón.
En cambio, el código anterior necesita tres palmadas consecutivas y espaciadas entre ellas. Es decir, no vale una palmada cada 10 segundos, deben ser una tras otra. De esto se encarga el primer bloque de if y else if.
El segundo if ((state1==true) && (state2==true) && (state3==true)) comprueba si se han producido tres sonidos (palmadas) anteriores. Si es cierto, cambiamos el estado de la salida y reseteamos las variables para comenzar de nuevo.
El último if (((millis()-tem) >= 500) && (state1==true) && (state2==false || state3==false)) asegura que no pasa mas de 500ms entre sonido y sonido.
Los delay (200) los empleo para evitar que sonidos con rebotes activen el circuito. Si se cae un objeto rígido al suelo este suele rebotar varias veces en un espacio de tiempo muy corto.
Cada vez que se entre en la función loop() se ejecuta primero la lectura de la salida del módulo de sonido. Esta lectura lo hace la función digitalRead(pinMicrophone).
Ajustes del circuito
No os desesperéis si no os funciona a la primera. Tendréis que ajustar el módulo de sonido antes de poder usarlo.
Con la ayuda de un destornillador, debéis girar el potenciómetro del módulo hacia un lado hasta que la luz de estado del módulo se quede encendida. En es punto retrocedéis el giro hasta que se apague el LED. Ese es el punto crítico se sensibilidad el módulo. Si queréis menos sensibilidad, podéis seguir retrocediendo el potenciómetro.
Ya tendréis listo el circuito para probarlo. Se debe encender y apagar el LED que incorpora la placa de Arduino.
Para ver los paso por los que pasa el programa, se puede abrir el puerto serie y verlo.
¿Os ha gustado este circuito? ¿Muy chulo verdad? Yo siempre he querido tener uno de esto, pero no ha sido hasta que descubrí Arduino que me ha facilitado todo.
Si queréis podéis ver una versión en vídeo de este artículo, para aquellos que no les gusta leer mucho. Ver vídeo, y de paso suscribiros a mi canal para ayudarme a crecer.
¡Nos vemos!
Sos UN GENIO! Anda todo perfecto. Te mando un gran abrazo y muchas gracias
Casi me sale, Cual libreria utilizaste?
No se utiliza ninguna librería.
Hola, si quisiera activar con las palmas una secuencia de luces leds, utilizando como base vuestro ejemplo ¿cómo se haría? gracias!