Detecta movimiento y luego asusta a un intruso con sonidos de alarma agudos y luces parpadeantes. Suena divertido? Claro que lo hace. Ese es el objetivo del proyecto Arduino de hoy, adecuado para principiantes. Escribiremos completamente desde cero y probaremos a medida que avanzamos para que, con suerte, pueda hacerse una idea de cómo se está haciendo todo en lugar de simplemente instalar algo que ya hice.
Descargo de responsabilidad: esto realmente no protegerá su casa. Sin embargo, podría causarle a su hermana una desagradable sorpresa cuando se cuela en su habitación.
Necesitarás:
- Un Arduino
- Sensor "ping" ultrasónico, estoy usando HC-SR04 Un PIR sería mejor, pero son caros. Un sensor de ping puede colocarse subrepticiamente en una puerta de entrada y seguir sirviendo el mismo trabajo básico, y solo cuesta $ 5.
- Un zumbador piezoeléctrico
- LED tira de luz, con el mismo cableado que usamos en este proyecto Crea tu propia iluminación ambiental dinámica para un centro de medios Crea tu propia iluminación ambiental dinámica para un centro de medios Si ves muchas películas en tu PC o centro de medios, yo ' Estoy seguro de que ha enfrentado el dilema de la iluminación; ¿Apagas completamente todas las luces? ¿Los mantienes en pleno funcionamiento? O ... Leer más.
Mientras está conectando este proyecto, no elimine todo cada vez, solo siga construyendo en el último bloque. Para cuando llegue a la sección "Codificación del sistema de alarma", debe tener todas las partes conectadas, con un aspecto similar a este:
Luces parpadeantes
Utilice el diagrama de cableado de este proyecto Cree su propia iluminación ambiental dinámica para un centro de medios Cree su propia iluminación ambiental dinámica para un centro de medios Si ve muchas películas en su PC o centro de medios, estoy seguro de que se ha enfrentado al dilema de iluminación; ¿Apagas completamente todas las luces? ¿Los mantienes en pleno funcionamiento? O ... Lea más para conectar su tira de LED; no cambie los pines, ya que necesitamos salida PWM. Use este código para probar rápidamente su cableado. Si todo va bien, deberías tener esto:
Sensor de distancia
En el módulo SR04, encontrará 4 pines. VCC y GND van a + 5V rail y ground respectivamente; TRIG es el pin que se usa para enviar una señal de sónar, póngalo en el pin 6; ECHO se utiliza para leer la señal de vuelta (y, por lo tanto, calcular la distancia) - poner esto en 7.
Para hacer las cosas increíblemente simples, hay una biblioteca que podemos usar llamada NewPing. Descargue y coloque en la carpeta Biblioteca de Arduino y reinicie el IDE antes de continuar. Prueba usando este código; abra el monitor de serie y asegúrese de que la velocidad esté configurada en 115200 baudios. Con un poco de suerte, deberías ver algunas mediciones de distancia que te envían a una velocidad bastante alta. Puede encontrar una variación de 1 o 2 centímetros, pero está bien. Intente pasar la mano por delante del sensor, moviéndolo hacia arriba y hacia abajo para observar las lecturas cambiantes.
El código debe ser bastante simple de entender. Hay algunas declaraciones de pines relevantes al principio, incluida una distancia máxima; esto puede variar según el sensor exacto que tenga, pero siempre que pueda obtener lecturas de menos de 1 metro con precisión, debería estar bien.
En el ciclo de esta aplicación de prueba, usamos la función ping () para enviar un sonar ping, recuperando un valor en milisegundos de cuánto tiempo tardó en regresar el valor. Para dar sentido a esto, usamos las bibliotecas NewPing creadas en constante de US_ROUNDTRIP_CM, que define cuántos microsegundos se necesitan para recorrer un solo centímetro. También hay una demora de 50 ms entre los pings para evitar sobrecargar el sensor.
Alarma piezoeléctrica
El sensor de cristal Piezo es un zumbador simple y barato, y podemos usar un pin 3 de PWM para crear diferentes tonos. Conecte un cable a la clavija 3, uno a la barra de tierra; no importa cuál.
Usa este código para probar.
La única manera de matar la alarma más bien desagradable y fuerte es sacar los enchufes. El código es un poco complejo de explicar, pero implica el uso de ondas sinusoidales para generar un sonido distintivo. Ajusta los números para jugar con diferentes tonos.
Codificando el sistema de alarma
Ahora que tenemos todas las piezas de este rompecabezas, vamos a combinarlas.
Continúa y crea un nuevo boceto, llamado Alarma . Comience por combinar todas las variables y definiciones de pines que tenemos en los ejemplos de prueba hasta ahora.
#include // Select which PWM-capable pins are to be used. #define RED_PIN 10 #define GREEN_PIN 11 #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters). #define ALARM 3 float sinVal; int toneVal;
Comience por escribir una función de configuración básica () ; solo trataremos las luces por ahora. He agregado un retraso de 5 segundos antes de que el ciclo principal comience para darnos un poco de tiempo para salir del camino si es necesario.
void setup(){ //set pinModes for RGB strip pinMode(RED_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); //reset lights analogWrite(RED_PIN, 0); analogWrite(BLUE_PIN, 0); analogWrite(RED_PIN, 0); delay(5000); }
Usemos una función de ayuda que nos permite escribir rápidamente un solo valor RGB a las luces.
//helper function enabling us to send a colour in one command void color (unsigned char red, unsigned char green, unsigned char blue) // the color generating function { analogWrite(RED_PIN, red); analogWrite(BLUE_PIN, blue); analogWrite(GREEN_PIN, green); }
Finalmente, nuestro bucle por ahora va a consistir en un simple flash de color entre rojo y amarillo (o, lo que sea que quiera que sea su alarma, simplemente cambie los valores RGB).
void loop(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yellow delay(100); }
Sube y prueba eso para asegurarte de que estás en el camino correcto.
Ahora, integremos el sensor de distancia para activar esas luces solo cuando algo entre 50 cm (por ejemplo, menos que el ancho del marco de una puerta). Ya hemos definido los pines correctos e importamos la biblioteca, por lo tanto, antes de la función de instalación (), agregue la siguiente línea para instanciarla:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
Debajo de eso, agregue una variable para almacenar el estado de la alarma activada o no, por defecto, falsa por defecto.
boolean triggered = false;
Agregue una línea a la función setup () para que podamos monitorear la salida en serie y depurar.
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
A continuación, cambiemos el nombre del bucle de corriente a alarma () : esto es lo que se llamará si la alarma se ha disparado.
void alarm(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yelow delay(100); }
Ahora crea una nueva función de bucle () en la que buscamos un nuevo ping, leemos los resultados y activamos la alarma si detecta algo dentro del rango del medidor.
void loop(){ if(triggered == true){ alarm(); } else{ delay(50);// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings. unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS). unsigned int distance = uS / US_ROUNDTRIP_CM; Serial.println(distance); if(distance< 100){ triggered = true; } } }
Déjame explicar el código brevemente:
- Comience comprobando para ver si la alarma se ha activado, y si es así, apague la función de alarma (solo parpadea las luces en este momento).
- Si aún no se activó, obtenga la lectura actual del sensor.
- Si el sensor lee <100 cm, algo ha rellenado el haz (ajuste este valor si se activa demasiado pronto, obviamente).
Pruébelo ahora, antes de agregar el molesto zumbador piezoeléctrico.
¿Trabajando? Estupendo. Ahora vamos a agregar ese timbre de vuelta. Agregue pinMode a la rutina setup () .
pinMode(ALARM, OUTPUT);
Luego agregue el zumbador piezoeléctrico a la función de alarma ():
for (int x=0; x<180; x++) { // convert degrees to radians then obtain sin value sinVal = (sin(x*(3.1412/180))); // generate a frequency from the sin value toneVal = 2000+(int(sinVal*1000)); tone(ALARM, toneVal); }
Si intenta compilar en este punto, se encontrará con un error: lo dejé deliberadamente para que pueda ver algunos problemas comunes. En este caso, tanto la biblioteca NewPing como la de tono estándar utilizan las mismas interrupciones; básicamente entran en conflicto, y no hay mucho que pueda hacer para solucionarlo. Oh querido.
Sin preocupaciones. Es un problema común, y alguien ya tiene una solución: descargue y agregue este NewTone a su carpeta Arduino Libraries. Ajuste el comienzo de su programa para incluir esto:
#include
Y ajusta la línea:
tone(ALARM, toneVal);
a
NewTone(ALARM, toneVal);
en lugar.
Eso es. Coloque su alarma en la puerta de su habitación para el próximo ladrón.
O un perro tonto, que parecía completamente impertérrito por la alarma.
¿Tiene problemas con el código? Aquí está la aplicación completa. Si obtiene errores aleatorios, intente pegarlos a continuación y veré si puedo ayudar.
Crédito de la imagen: alarma de incendio a través de Flickr