Hur man gör ett enkelt Arduino Alarmsystem

Upptäck rörelse, skräck då av en inkräktare med högljudda larmljud och blinkande lampor. Låter det roligt?

Upptäck rörelse, skräck då av en inkräktare med högljudda larmljud och blinkande lampor.  Låter det roligt?
Annons

Upptäck rörelse, skräck då av en inkräktare med högljudda larmljud och blinkande lampor. Låter det roligt? Det gör det självklart. Det är målet för dagens Arduino-projekt, lämpligt för nybörjare. Vi ska skriva helt från början och testa när vi går vidare så att du kan förhoppningsvis få en uppfattning om hur allting görs istället för att bara installera något jag redan har gjort.

Ansvarsbegränsning: Detta kommer inte att skydda ditt hus. Det kan ge din syster en otäck chock när hon smygar in i ditt rum men.

Du kommer att behöva:

  • En Arduino
  • Ultraljuds "ping" -sensor, jag använder HC-SR04 En PIR skulle vara bättre, men de är dyra. En pingsensor kan placeras surreptitiously i en dörröppning och tjänar fortfarande samma grundläggande jobb och är bara $ 5
  • En piezo summer
  • LED-strålkastare med samma ledningar som vi använde tillbaka i det här projektet Bygg din egen dynamiska omgivande belysning för ett mediecenter Bygg din egen dynamiska omgivande belysning för ett mediecenter Om du tittar på många filmer på din dator eller mediecenter, Jag är säker på att du har mött belysningsdilemmet stänger du helt av alla ljus? Håller du dem på full blast? Eller ... Läs mer.

När du kopplar upp det här projektet, ta inte bort allt varje gång - fortsätt bygga på det sista blocket. När du kommer till avsnittet "Kodning av larmsystemet" borde du ha alla bitar kopplade upp och ser något ut så här:

färdig-ledningar

Blinkande ljus

Använd ledningsdiagrammet från det här projektet Bygg din egen dynamiska omgivande belysning för ett mediecenter Bygg din egen dynamiska omgivande belysning för ett mediecenter Om du tittar på många filmer på datorn eller mediasystemet är du säker på att du har mött belysning dilemma; stänger du helt av alla ljus? Håller du dem på full blast? Eller ... Läs mer för att ansluta din LED-remsa; Ändra inte stiften, eftersom vi behöver PWM-utgång. Använd den här koden för att snabbt testa kablarna. Om allt går bra, borde du ha det här:

lett-rgb-testet

Avståndsgivare

På SR04-modulen hittar du 4 stift. VCC och GND går till + 5V räls och mark respektive; TRIG är stiftet som används för att skicka en sonarsignal, sätta denna på stift 6; ECHO används för att läsa signalen tillbaka (och beräkna sedan avståndet) - sätt det på 7.

SR04

För att göra sakerna otroligt enkla finns det ett bibliotek vi kan använda som heter NewPing. Hämta och placera i din Arduino biblioteksmapp och starta om IDE innan du fortsätter. Test med den här koden; öppna seriell bildskärm och se till att hastigheten är inställd på 115200 baud. Med någon tur bör du se några avståndsmätningar som skickas tillbaka till dig med en ganska hög hastighet. Du kan hitta en varians på 1 eller 2 centimeter, men det här är bra. Prova att springa handen framför sensorn, flytta den upp och ner för att observera de ändrade avläsningarna.

ping-output

Koden ska vara ganska enkelt att förstå. Det finns ett fåtal försäkran om relevanta stiften i början, inklusive ett maximalt avstånd - det kan variera beroende på vilken exakt sensor du har, men så länge du kan få mindre än 1 meter avläsning exakt, borde du ha det bra.

I loppet av denna testapp använder vi funktionen ping () för att skicka ut en sonarping och återkommer ett värde i millisekunder av hur lång tid det tog för värdet att återvända. För att förstå detta använder vi NewPing-biblioteken byggda i konstant av US_ROUNDTRIP_CM, som definierar hur många mikrosekunder det tar att gå en enda centimeter. Det finns också en 50 ms fördröjning mellan pings för att undvika överbelastning av sensorn.

Piezo Alarm

Piezo-kristallgivaren är en enkel och billig summer, och vi kan använda en PWM-pin 3 för att göra olika toner. Anslut en ledning till stift 3, en till jordskena - det spelar ingen roll vilken.

Använd den här koden för att testa.

Det enda sättet att döda det ganska obnoxious och högljudda larmet är att dra pluggarna. Koden är lite komplex att förklara, men det handlar om att använda sinusvågor för att skapa ett distinkt ljud. Tweak siffrorna för att spela med olika toner.

Kodning av larmsystemet

Nu när vi har alla bitar av detta pussel, låt oss kombinera dem tillsammans.

Fortsätt och gör en ny skiss, kallad Alarm . Börja med att kombinera alla variabler och pindefinitioner som vi har i testexemplen fram tills 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; 

Börja med att skriva en grundläggande setup () -funktion - vi kommer bara att ta itu med lamporna för nu. Jag har lagt till en 5 sekunders fördröjning innan huvudslingan börjar ge oss lite tid att gå ur vägen om det behövs.

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

Låt oss använda en hjälpfunktion som gör det möjligt för oss att snabbt skriva ett enda RGB-värde ut mot ljusen.

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

Slutligen kommer vår slinga för närvarande att bestå av en enkel färgflash mellan röd och gul (eller, vad du än vill att ditt larm ska vara - ändra bara RGB-värdena).

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

Ladda upp och testa det för att du är på rätt spår.

Låt oss nu integrera avståndssensorn för att utlösa dessa ljus endast när något kommer in, säg 50 cm (bara mindre än en dörrrams bredd). Vi har redan definierat rätt pinnar och importerat biblioteket, så före din inställning () -funktion lägger du till följande rad för att ordna det:

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

Under det, lägg till en variabel för att lagra läget för larmet som utlöses eller inte, givetvis felaktigt.

 boolean triggered = false; 

Lägg till en rad i funktionen setup () så att vi kan övervaka utmatningen på seriell och debug.

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

Låt oss sedan byta namn på den aktuella slingan till larmet () - det här är vad som kommer att ringas om larmet har lösts.

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

Skapa nu en ny loop () -funktion, en där vi hämtar en ny ping, läs resultaten och utlös larmet om något detekteras inom mätområ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; } } } 

Låt mig förklara koden kortfattat:

  • Börja med att kontrollera om larmet har utlösts, och om så är fallet, avaktivera larmfunktionen (bara blinkar lamporna just nu).
  • Om det inte utlöses ännu, få nuvarande läsning från sensorn.
  • Om sensorn läser <100 cm har något vadderat strålen (justera detta värde om det utlöses för tidigt för dig självklart).

Ge det en provkörning nu, innan vi lägger till den irriterande piezoomvandlaren.

Arbetssätt? Bra. Låt oss nu lägga till den summaren tillbaka. Lägg till pinMode i rutinen setup () .

 pinMode(ALARM, OUTPUT); 

Lägg sedan till piezoomvandlaren till alarmet () -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); } 

Om du försöker kompilera vid denna punkt kommer du att lösa ett fel - jag har lämnat det medvetet så att du kan se några vanliga problem. I det här fallet använder både NewPing- och standardtonbiblioteket samma störningar - de är i grunden motstridiga och det finns inte mycket du kan göra för att åtgärda det. Kära nån.

Inga bekymmer men. Det är ett vanligt problem, och någon har redan en lösning - ladda ner och lägg till denna NewTone i din Arduino Libraries-mapp. Justera början på ditt program för att inkludera detta:

 #include 

Och justera linjen:

 tone(ALARM, toneVal); 

till

 NewTone(ALARM, toneVal); 

istället.

Det är allt. Ställ ditt larm upp i ditt sovrums dörröppning för nästa, olyckliga, inbrottstjuv.

Eller en dopig hund, som verkade helt oskadd av larmet.

Har du problem med koden? Här är den fullständiga appen. Om du får slumpmässiga fel, försök klistra in dem nedan och jag ser om jag kan hjälpa till.

Bildkredit: Brandlarm via Flickr

In this article