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? 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 makt 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 “Kodning av larmsystemet” avsnitt, borde du ha alla bitar kopplade upp och ser något ut så här:
Blinkande ljus
Använd kopplingsschemat 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:
Avståndsgivare
På SR04-modulen hittar du 4 stift. VCC och GND Gå till + 5V räls och mark respektive; TRIG är stiftet som används för att skicka en sonarsignal, sätt detta på stift 6; EKO används för att läsa signalen tillbaka (och beräkna sedan avståndet) - sätt det på 7.
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 Bibliotek mappen 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.
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 noggrant, borde du vara bra.
I loop av denna testapp använder vi ping () funktion för att skicka ut en sonar ping, att få tillbaka 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 Larm. Börja med att kombinera alla variabler och pindefinitioner som vi har i testexemplen fram tills nu.
#inkludera // Välj vilka PWM-stift som ska användas. #define RED_PIN 10 #define GREEN_PIN 11 #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino stift bundet till utlösningsstift på ultraljudssensorn. #define ECHO_PIN 7 // Arduino stift bundet till ekkolås på ultraljudssensorn. #define MAX_DISTANCE 100 // Maximal avstånd vi vill pinga för (i centimeter). #define ALARM 3 float sinVal; int toneVal;
Börja med att skriva en grundläggande inrätta() 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 () // ställa in pinModes för RGB-strip pinMode (RED_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); // återställ ljus analogWrite (RED_PIN, 0); analogWrite (BLUE_PIN, 0); analogWrite (RED_PIN, 0); fördröjning (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.
// hjälparfunktion som gör det möjligt för oss att skicka en färg i en kommandot tom färg (unsigned char red, unsigned char green, unsigned char blue) // den färggenererande funktionen analogWrite (RED_PIN, röd); analog skriv (BLUE_PIN, blå); analogskrivning (GREEN_PIN, grön);
Slutligen kommer vår slinga för nu att bestå av en enkel färgflamp mellan röd och gul (eller, vad du än vill att ditt larm ska vara - ändra bara RGB-värdena).
tomrumsling () färg (255,0,0); // röd fördröjning (100); färg (255,255,0); // gul fördröjning (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 stift och importerat biblioteket, så före din inrätta() funktion lägg till följande rad för att inställa den:
NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing inställning av stiften och maximalt avstånd.
Under det, lägg till en variabel för att lagra läget för larmet som utlöses eller inte, givetvis felaktigt.
booleskt utlöst = false;
Lägg till en rad till inrätta() funktion så att vi kan övervaka utmatningen på seriell och debug.
Serial.begin (115200); // Öppna seriell bildskärm vid 115200 baud för att se pingresultat.
Låt oss sedan byta namn på den aktuella slingan till larm() - Det här är vad som kommer att ringas om larmet har lösts.
tomrumsalarm () färg (255,0,0); // röd fördröjning (100); färg (255,255,0); // yelow delay (100);
Skapa nu en ny slinga() funktion, en där vi hämtar en ny ping, läser resultaten och utlöser larmet om något detekteras inom mätområdet.
void loop () if (triggered == true) alarm (); annars fördröjning (50); // Vänta 50ms mellan pings (ca 20 pings / sek). 29ms ska vara den kortaste fördröjningen mellan pings. unsigned int uS = sonar.ping (); // Skicka ping, få pingtid i mikrosekunder (uS). osignerat int avstånd = uS / US_ROUNDTRIP_CM; Serial.println (avstånd); if (avstånd < 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 för tillfället).
- Om det inte utlöses ännu, få nuvarande läsning från sensorn.
- Om sensorn läser <100 cm, something has padded the beam (adjust this value if it's triggering too early for you, obviously).
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 till inrätta() rutin-.
pinMode (ALARM, UTGÅNG);
Lägg sedan till piezoomvandlaren till alarmet () -funktionen:
för (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:
#inkludera
Och justera linjen:
ton (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 vildbrott.
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
Utforska mer om: Arduino.