Sådan laver du et simpelt Arduino alarmsystem

Registrere bevægelse, og skræm derefter hælen ud af en indtrenger med højlydede alarmlyde og blinkende lys. Lyder det sjovt?

Registrere bevægelse, og skræm derefter hælen ud af en indtrenger med højlydede alarmlyde og blinkende lys.  Lyder det sjovt?
Reklame

Registrere bevægelse, og skræm derefter hælen ud af en indtrenger med højlydede alarmlyde og blinkende lys. Lyder det sjovt? Det gør det selvfølgelig. Det er målet med dagens Arduino-projekt, der er egnet til begyndere. Vi skriver helt fra bunden og testen, når vi går sammen, så du kan forhåbentlig få en ide om, hvordan det hele bliver gjort, snarere end blot at installere noget, jeg allerede har lavet.

Ansvarsfraskrivelse: Dette vil ikke rent faktisk beskytte dit hus. Det kan give din søster et ubehageligt chok, når hun sniger sig ind i dit værelse.

Du skal bruge:

  • En Arduino
  • Ultralyd "ping" sensor, jeg bruger HC-SR04 En PIR ville være bedre, men de er dyre. En ping sensor kan placeres surreptitiously i en døråbning og stadig tjene det samme grundlæggende job og er kun $ 5
  • En piezo summer
  • LED strip lys med samme ledninger, vi brugte tilbage i dette projekt. Byg din egen dynamiske omgivende belysning til et mediecenter. Byg din egen dynamiske omgivende belysning til et mediecenter. Hvis du ser mange film på din pc eller mediecenter, Jeg er sikker på at du har konfronteret lysproblemet; slukker du helt for alle lys? Holder du dem på fuld blast? Eller ... Læs mere.

Da du kabler op på dette projekt, skal du ikke fjerne alt hver gang - bare fortsæt med at bygge på den sidste blok. Når du kommer til afsnittet "Kodning af alarmsystemet", skal du have alle bits og stykker koblet op og se noget på følgende måde:

færdig ledningsføring

Blinkende lys

Brug ledningsdiagrammet fra dette projekt Byg din egen dynamiske omgivende belysning til et mediecenter Byg din egen dynamiske omgivende belysning til et mediecenter Hvis du ser mange film på din pc eller mediecenter, er du sikker på at du har konfronteret belysning dilemma; slukker du helt for alle lys? Holder du dem på fuld blast? Eller ... Læs mere for at tilslutte din LED stripe; Skift ikke stifterne, da vi har brug for PWM output. Brug denne kode til hurtigt at teste dine ledninger. Hvis alt går godt, bør du have dette:

førte-rgb-test

Distance Sensor

På SR04 modulet finder du 4 stifter. VCC og GND går til + 5V skinne og jord henholdsvis; TRIG er stiften, der bruges til at sende et sonarsignal, sæt dette på pin 6; ECHO bruges til at læse signalet tilbage (og derfor beregne afstanden) - sæt dette på 7.

SR04

For at gøre tingene utrolig enkle, er der et bibliotek, vi kan bruge kaldet NewPing. Download og placér i din Arduino's Library mappe og genstart IDE før du fortsætter. Test ved hjælp af denne kode; Åbn seriemonitoren og sørg for, at hastigheden er indstillet til 115200 baud. Med held og lykke bør du se, at nogle afstande målinger sendes tilbage til dig med en temmelig høj hastighed. Du kan finde en variance på 1 eller 2 centimeter, men det er fint. Prøv at køre din hånd foran sensoren, flytte den op og ned for at observere de ændrede aflæsninger.

ping-output

Koden skal være ret simpel at forstå. Der er et par erklæringer om relevante stifter i starten, herunder en maksimal afstand - dette kan variere alt efter den nøjagtige sensor, du har, men så længe du kan få mindre end 1 meter aflæsning præcist, skal du være i orden.

I løbet af denne test app bruger vi ping () -funktionen til at sende en sonar ping og får en værdi i millisekunder af hvor lang tid det tog for værdien at returnere. For at forstå dette bruger vi NewPing-bibliotekerne bygget i konstant af US_ROUNDTRIP_CM, som definerer hvor mange mikrosekunder det tager at gå en enkelt centimeter. Der er også en 50 ms forsinkelse mellem pings for at undgå overbelastning af sensoren.

Piezo Alarm

Piezo krystal sensoren er en simpel og billig summer, og vi kan bruge en PWM pin 3 til at lave forskellige toner. Tilslut en ledning til pin 3, en til jordskinne - det er ligegyldigt hvilket.

Brug denne kode til at teste.

Den eneste måde at dræbe den temmelig ubehagelige og høje alarm på er at trække propperne. Koden er lidt kompleks at forklare, men det indebærer at bruge sine bølger til at generere en karakteristisk lyd. Tweak tallene for at spille med forskellige toner.

Kodning af alarmsystemet

Nu da vi har alle stykker af dette puslespil, lad os kombinere dem sammen.

Gå videre og lav en ny skitse, kaldet Alarm . Begynd ved at kombinere alle de variabler og pin definitioner, vi har i testeksemplerne indtil nu.

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

Begynd med at skrive en grundlæggende opsætning () -funktion - vi skal kun beskæftige sig med lysene for nu. Jeg har tilføjet en 5 sekunders forsinkelse, før hovedløkken er begyndt at give os tid til at komme ud af vejen, hvis det er nødvendigt.

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

Lad os bruge en hjælperfunktion, der giver os mulighed for hurtigt at skrive en enkelt RGB-værdi ud til lysene.

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

Endelig vil vores loop for nu bestå af en simpel farveflash mellem rød og gul (eller hvad du vil have din alarm til at være - bare ændre RGB-værdierne).

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

Upload og test det for at sikre, at du er på rette spor.

Lad os nu integrere afstandssensoren for kun at udløse disse lys, når noget kommer indenfor, f.eks. 50 cm (lige under bredden af ​​en dørramme). Vi har allerede defineret de rigtige stifter og importeret biblioteket, så før din setup () -funktion tilføjes følgende linje for at instantiere det:

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

Under det, tilføj en variabel til at gemme tilstanden for alarmen, der udløses eller ej

 boolean triggered = false; 

Tilføj en linje til funktionen setup (), så vi kan overvåge udgangen på seriel og fejlfinding.

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

Lad os derefter omdøbe den aktuelle loop til alarm () - dette er hvad der vil blive kaldt, hvis alarmen er blevet udløst.

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

Opret nu en ny loop () -funktion, hvor vi henter en ny ping, læs resultaterne og udløs alarmen, hvis der er fundet noget inden for måleområdet.

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

Lad mig forklare koden kort:

  • Start med at kontrollere, om alarmen er udløst, og i så fald sluk for alarmfunktionen (blinker kun lysene i øjeblikket).
  • Hvis den ikke er udløst endnu, skal du få den aktuelle læsning fra sensoren.
  • Hvis sensoren læser <100 cm, har noget polstret strålen (juster denne værdi, hvis det udløses for tidligt for dig selvfølgelig).

Giv det en prøveperiode nu, før vi tilføjer den irriterende piezo summer.

Arbejder? Store. Lad os nu tilføje den summere tilbage. Tilføj pinMode til setup () rutinen.

 pinMode(ALARM, OUTPUT); 

Tilføj derefter piezo summer-sløjfen til alarmen () -funktionen:

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

Hvis du forsøger at kompilere på dette tidspunkt, vil du løbe ind i en fejl - jeg har overgivet dette med vilje, så du kan se nogle fælles problemer. I dette tilfælde bruger både NewPing og standardtonebiblioteket de samme afbrydelser - de er i modstrid med det grundlæggende, og der er ikke meget du kan gøre for at rette op på det. Åh gud.

Ingen bekymringer dog. Det er et almindeligt problem, og en person har allerede en løsning - download og tilføj denne NewTone til din Arduino Biblioteker mappe. Juster starten på dit program for at inkludere dette:

 #include 

Og juster linjen:

 tone(ALARM, toneVal); 

til

 NewTone(ALARM, toneVal); 

i stedet.

Det er det. Indstil din alarm i døråbningen på dit soveværelse til den næste uhøflige ville være indbrudstyv.

Eller en dopey hund, som syntes helt uberørt af alarmen.

Har du problemer med koden? Her er den komplette app. Hvis du får tilfældige fejl, kan du prøve at indsætte dem nedenfor, og jeg kan se om jeg kan hjælpe.

Billedkredit: Brandalarm via Flickr

In this article