Comment faire un système d'alarme Arduino simple

Détecter le mouvement, puis effrayer le diable d'un intrus avec une alarme aiguë et des lumières clignotantes. Cela vous semble-t-il amusant?

Détecter le mouvement, puis effrayer le diable d'un intrus avec une alarme aiguë et des lumières clignotantes.  Cela vous semble-t-il amusant?
Publicité

Détecter le mouvement, puis effrayer le diable d'un intrus avec une alarme aiguë et des lumières clignotantes. Cela vous semble-t-il amusant? Bien sûr que oui. C'est l'objectif du projet Arduino d'aujourd'hui, adapté aux débutants. Nous écrirons complètement à partir de rien et nous testerons au fur et à mesure que nous avancerons, afin que vous puissiez avoir une idée de la façon dont tout cela se fait plutôt que d'installer simplement quelque chose que j'ai déjà fait.

Avertissement: cela ne va pas réellement protéger votre maison. Cela pourrait donner un choc méchant à votre sœur quand elle se faufile dans votre chambre.

Tu auras besoin:

  • Un Arduino
  • Capteur à ultrasons "ping", j'utilise HC-SR04 Un PIR serait mieux, mais ceux qui sont chers. Un capteur de ping peut être placé subrepticement dans une porte et toujours servir le même travail de base, et est seulement 5 $
  • Un buzzer piézo
  • Bande lumineuse LED, avec le même câblage que nous avons utilisé dans ce projet Construisez votre propre éclairage dynamique dynamique pour un centre multimédia Construisez votre propre éclairage dynamique dynamique pour un centre multimédia Si vous regardez beaucoup de films sur votre PC ou votre centre multimédia, Je suis sûr que vous avez fait face au dilemme de l'éclairage; éteignez-vous complètement toutes les lumières? Les gardez-vous à fond? Ou ... Lire la suite.

Au cours du câblage de ce projet, ne supprimez pas tout à chaque fois - continuez à construire sur le dernier bloc. Au moment où vous arrivez à la section "Coder le système d'alarme", vous devriez avoir tous les éléments branché, ressemblant à ceci:

câblage fini

Lumières clignotantes

Utilisez le diagramme de câblage de ce projet Construisez votre propre éclairage dynamique pour un centre média Construisez votre propre éclairage dynamique pour un centre multimédia Si vous regardez beaucoup de films sur votre PC ou votre centre multimédia, je suis sûr que vous avez fait face à dilemme d'éclairage; éteignez-vous complètement toutes les lumières? Les gardez-vous à fond? Ou ... Lire la suite pour brancher votre bande de LED; ne changez pas les broches, car nous avons besoin d'une sortie PWM. Utilisez ce code pour tester rapidement votre câblage. Si tout va bien, vous devriez avoir ceci:

led-rgb-test

Capteur de distance

Sur le module SR04, vous trouverez 4 broches. VCC et GND vont respectivement à + 5V rail et sol; TRIG est la broche utilisée pour envoyer un signal sonar, mettez ceci sur la broche 6; ECHO est utilisé pour lire le signal de retour (et donc calculer la distance) - mettre sur 7.

sr04

Pour rendre les choses incroyablement simples, il y a une bibliothèque que nous pouvons utiliser appelée NewPing. Téléchargez et placez dans le dossier Bibliothèque de votre Arduino et redémarrez l'EDI avant de continuer. Testez en utilisant ce code. ouvrez le moniteur série et assurez-vous que la vitesse est réglée sur 115200 bauds. Avec un peu de chance, vous devriez voir des mesures de distance vous être renvoyées à une vitesse assez élevée. Vous pouvez trouver une variance de 1 ou 2 centimètres, mais c'est bien. Essayez de passer votre main devant le capteur, en la déplaçant de haut en bas pour observer les changements de lectures.

ping-output

Le code devrait être assez simple à comprendre. Il y a quelques déclarations de broches pertinentes au début, y compris une distance maximale - cela peut varier selon le capteur exact que vous avez, mais tant que vous êtes en mesure d'obtenir des lectures de moins de 1 mètre, ça devrait aller.

Dans la boucle de cette application de test, nous utilisons la fonction ping () pour envoyer un ping sur sonar, en récupérant une valeur en millisecondes du temps nécessaire au retour de la valeur. Pour comprendre cela, nous utilisons les bibliothèques NewPing construites en constante de US_ROUNDTRIP_CM, qui définit combien de microsecondes il faut pour faire un centimètre. Il y a également un délai de 50 ms entre les pings pour éviter de surcharger le capteur.

Alarme piézo

Le capteur de cristal Piezo est un buzzer simple et bon marché, et nous pouvons utiliser une broche PWM 3 pour faire des sons différents. Connectez un fil à la broche 3, un à la mise à la terre du rail - peu importe lequel.

Utilisez ce code pour tester.

La seule façon de tuer l'alarme plutôt désagréable et bruyante est de tirer les bouchons. Le code est un peu complexe à expliquer, mais il implique l'utilisation d'ondes sinusoïdales pour générer un son distinctif. Tweak les numéros à jouer avec des tonalités différentes.

Codage du système d'alarme

Maintenant que nous avons toutes les pièces de ce puzzle, combinons-les ensemble.

Allez-y et faites une nouvelle esquisse, appelée Alarme . Commencez par combiner toutes les variables et définitions de broches que nous avons dans les exemples de test jusqu'à maintenant.

#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; 

Commencez par écrire une fonction de configuration de base () - nous ne traiterons que des lumières pour l'instant. J'ai ajouté un délai de 5 secondes avant le début de la boucle principale pour nous donner le temps de nous écarter si nécessaire.

 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); } 

Utilisons une fonction d'aide qui nous permet d'écrire rapidement une seule valeur RGB aux lumières.

 //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); } 

Enfin, notre boucle va pour l'instant consister en un simple flash de couleur entre le rouge et le jaune (ou, quoi que vous vouliez que votre alarme soit - il suffit de changer les valeurs RVB).

 void loop(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yellow delay(100); } 

Téléchargez et testez-le pour vous assurer que vous êtes sur la bonne voie.

Maintenant, intégrions le capteur de distance pour déclencher ces lumières seulement quand quelque chose arrive, par exemple, à 50 cm (juste inférieur à la largeur d'un cadre de porte). Nous avons déjà défini les bonnes broches et importé la bibliothèque, donc avant votre fonction setup () ajoutez la ligne suivante pour l'instancier:

 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance. 

En dessous de cela, ajoutez une variable pour stocker l'état de l'alarme déclenchée ou non, par défaut à false, bien sûr.

 boolean triggered = false; 

Ajouter une ligne à la fonction setup () afin que nous puissions surveiller la sortie en série et déboguer.

 Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results. 

Ensuite, renommons la boucle actuelle en alarme () - c'est ce qui sera appelé si l'alarme a été déclenchée.

 void alarm(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yelow delay(100); } 

Créez maintenant une nouvelle fonction loop (), dans laquelle nous allons chercher un nouveau ping, lire les résultats et déclencher l'alarme si quelque chose est détecté dans la plage du compteur.

 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; } } } 

Laissez-moi vous expliquer brièvement le code:

  • Commencez par vérifier si l'alarme a été déclenchée, et si c'est le cas, déclenchez la fonction d'alarme (juste en allumant les lumières pour le moment).
  • Si ce n'est pas encore déclenché, obtenez la lecture actuelle du capteur.
  • Si le capteur mesure <100 cm, quelque chose a recouvert le faisceau (ajustez cette valeur s'il se déclenche trop tôt pour vous, évidemment).

Faites un essai maintenant, avant d'ajouter le buzzer piezo ennuyeux.

Travail? Génial. Maintenant, ajoutons ce buzzer. Ajoutez pinMode à la routine setup () .

 pinMode(ALARM, OUTPUT); 

Ensuite, ajoutez la boucle piezo buzzer à la fonction alarm ():

 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 vous essayez de compiler à ce stade, vous allez rencontrer une erreur - j'ai délibérément laissé cela pour que vous puissiez voir quelques problèmes courants. Dans ce cas, la bibliothèque NewPing et la bibliothèque de tons standard utilisent les mêmes interruptions: elles sont fondamentalement incompatibles et il n'y a pas grand chose à faire pour y remédier. Oh cher.

Pas de soucis cependant. C'est un problème courant, et quelqu'un a déjà une solution - téléchargez et ajoutez ce NewTone à votre dossier Arduino Libraries. Ajustez le début de votre programme pour inclure ceci:

 #include 

Et ajustez la ligne:

 tone(ALARM, toneVal); 

à

 NewTone(ALARM, toneVal); 

au lieu.

C'est tout. Réglez votre alarme dans la porte de votre chambre pour le prochain cambrioleur malheureux.

Ou, un chien dopey, qui semblait complètement imprudent par l'alarme.

Vous avez des problèmes avec le code? Voici l'application complète. Si vous avez des erreurs aléatoires, essayez de les coller ci-dessous et je verrai si je peux vous aider.

Crédit d'image: Alarme incendie via Flickr

In this article