Annons

Upptäck rörelse och skräm sedan bort pjäsen från en inkräktare med höga larmljud och blinkande lampor. Låter det roligt? Naturligtvis gör det det. Det är målet med dagens Arduino-projekt som passar nybörjare. Vi kommer att skriva helt från början och testa när vi går med så att du förhoppningsvis kan få en uppfattning om hur det går till snarare än att bara installera något jag redan har gjort.

Friskrivningsklausul: detta kommer inte att skydda ditt hus. Det makt ge din syster en otäck chock när hon dock smyger in i ditt rum.

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 ping-sensor kan placeras i en dörröppning och fortfarande tjäna samma grundläggande jobb, och är bara $ 5
  • En piezosummer
  • LED-remslampa, med samma ledningar som vi använde tillbaka i detta projekt Bygg din egen dynamiska omgivningsbelysning för ett mediecenterOm du tittar på många filmer på din dator eller mediecenter är jag säker på att du har mött belysningens dilemma; stänger du helt av alla lampor? Håller du dem på full spräng? Eller...
    instagram viewer
    Läs mer
    .

När du ansluter till detta projekt ska du inte ta bort allt varje gång - fortsätt bara att bygga vid det sista blocket. När du kommer till avsnittet "Kodning av alarmsystemet" bör du ha alla bitar och bitar kopplade upp och se ut så här:

färdiga-ledningar

Blinkande ljus

Använd kopplingsschemat från detta projekt Bygg din egen dynamiska omgivningsbelysning för ett mediecenterOm du tittar på många filmer på din dator eller mediecenter är jag säker på att du har mött belysningens dilemma; stänger du helt av alla lampor? Håller du dem på full spräng? Eller... Läs mer att ansluta din LED-remsa; ändra inte stiften, eftersom vi behöver PWM-utgång. Använda sig av den här koden för att snabbt testa dina ledningar. Om allt går bra, bör du ha detta:

ledda-rgb-testet

Avståndsgivare

På SR04-modulen hittar du fyra stift. VCC och GND gå till + 5V järnväg respektive mark; TRIG är stiftet som används för att skicka en sonarsignal, sätta detta på stift 6; EKO används för att läsa tillbaka signalen (och därför beräkna avståndet) - lägg detta på 7.

SR04

För att göra saker otroligt enkla finns det ett bibliotek som vi kan använda som heter NewPing. Ladda ner och placera i dina Arduino's Bibliotek mappa och starta om IDE innan du fortsätter. Testa med den här koden; öppna upp seriemonitorn och se till att hastigheten är inställd på 115200 baud. Med all lycka bör du se att några avståndsmätningar skickas tillbaka till dig med ganska hög hastighet. Du kan hitta en varians på 1 eller 2 centimeter, men det är bra. Försök att köra handen framför sensorn, flytta den upp och ner för att observera de förändrade avläsningarna.

ping-output

Koden bör vara ganska enkelt att förstå. Det finns några få deklarationer av relevanta stift i början, inklusive ett maximalt avstånd - detta kan variera beroende på den exakta sensorn du har, men så länge du kan få mindre än 1 meters avläsning exakt, borde du vara det bra.

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

Piezo-larm

Piezo-kristalsensorn är en enkel och billig summer, och vi kan använda en PWM-stift 3 för att skapa olika toner. Anslut en tråd till stift 3, en till jordskena - det spelar ingen roll vilken.

Använda sig av den här koden att testa.

Det enda sättet att döda det ganska motbjudande och högljudda larmet är att dra i pluggarna. Koden är lite komplex att förklara, men den innebär att man använder sinusvågor för att generera ett distinkt ljud. Justera siffrorna för att spela med olika toner.

Kodning av larmsystemet

Nu när vi har alla pusselbitarna, låt oss kombinera dem tillsammans.

Gå vidare och skapa en ny skiss, kallad Larm. Börja med att kombinera alla variabler och pin-definitioner som vi har i testexemplen fram till nu.

#inkludera  // Välj vilka PWM-stifter som ska användas. # definiera RED_PIN 10. # definiera GREEN_PIN 11. #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino-pin knuten för att utlösa stift på ultraljudssensorn. #definiera ECHO_PIN 7 // Arduino-stift knuten till ekotappen på ultraljudssensorn. #define MAX_DISTANCE 100 // Maximalt avstånd vi vill pingla (i centimeter). #define ALARM 3 float sinVal; int tonVal; 

Börja med att skriva en grundläggande uppstart() funktion - vi kommer bara att ta itu med lamporna för tillfället. Jag har lagt till en fördröjning på 5 sekunder innan huvudslingan börjar ge oss lite tid att komma 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älla lamporna 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 att vi snabbt kan skriva ut ett enda RGB-värde till lamporna.

// hjälpfunktion som gör att vi kan skicka en färg i ett kommando. tom färg (osignerad röd röd, osignerad rödgrön, osignerad rödblå) // den färggenererande funktionen. {analogWrite (RED_PIN, röd); analogWrite (BLUE_PIN, blå); analogWrite (GREEN_PIN, grön); }

Slutligen kommer vår slinga för nu att bestå av en enkel färgblink mellan rött och gult (eller vad du än vill att ditt larm ska vara - ändra bara RGB-värden).

void loop () {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 se till att du är på rätt spår.

Låt oss nu integrera avståndsgivaren för att utlösa dessa lampor endast när något kommer in, till exempel, 50 cm (bara mindre än bredden på en dörrkar) Vi har redan definierat rätt stift och importerat biblioteket, så innan ditt uppstart() funktion lägg till följande rad för att instansera den:

NyPing-ekolod (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing-inställning av stift och maximalt avstånd. 

Under det lägger du till en variabel för att lagra tillståndet för larmet som utlöses eller inte, och som standard är naturligtvis felaktigt.

boolean utlöst = falsk; 

Lägg till en linje i uppstart() funktion så att vi kan övervaka utgången på seriell och felsökning.

Serial.begin (115200); // Öppna seriell monitor på 115200 baud för att se pingresultat. 

Låt oss därefter byta namn på den aktuella slingan till larm() - det här är vad som kommer att kallas om larmet har utlösts.

tomt larm () {färg (255,0,0); // röd fördröjning (100); färg (255 255,0); // yelow-fördröjning (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 upptäcks inom mätområdet.

void loop () {if (triggered == true) {alarm (); } annars {fördröjning (50); // Vänta 50ms mellan pingarna (cirka 20 pings / sek). 29 ms bör vara den kortaste förseningen mellan pings. osignerad 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 kort:

  • Börja med att kontrollera om larmet har utlösts, och i så fall avfyra larmfunktionen (bara blinkar lamporna just nu).
  • Om den inte har utlösts ännu, få den aktuella avläsningen från sensorn.
  • Om sensorn läser <100 cm har något stoppat strålen (justera detta värde om det utlöser för tidigt för dig, uppenbarligen).

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

Arbetssätt? Bra. Låt oss nu lägga till den summern igen. Lägg till pinMode till uppstart() rutin.

pinMode (ALARM, OUTPUT); 

Lägg sedan till piezosignalslingan till larmfunktionen ():

för (int x = 0; x <180; x ++) {// konvertera grader till radianer och erhåll sedan sinvärdet sinVal = (sin (x * (3.1412 / 180))); // generera en frekvens från sinvärdet toneVal = 2000+ (int (sinVal * 1000)); ton (ALARM, toneVal); }

Om du försöker sammanställa just nu kommer du att få ett fel. Jag har lämnat detta medvetet så att du kan se några vanliga problem. I detta fall använder både NewPing och standardtonsbiblioteket samma avbrott - de är i princip motstridiga, och det finns inte mycket du kan göra för att fixa det. Kära nån.

Inga bekymmer dock. Det är ett vanligt problem, och någon har en lösning redan - ladda ner och lägg till detta Newtone till din Arduino-bibliotek. Justera början av programmet så att det inkluderar detta:

#inkludera 

Och justera linjen:

 ton (ALARM, toneVal); 

till

 NewTone (ALARM, toneVal); 

istället.

Det är allt. Ställ in ditt larm i dörröppningen till ditt sovrum för nästa olyckligt inbrott.

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

Har du problem med koden? Här är komplett app. Om du får slumpmässiga fel kan du försöka klistra in dem nedan så ser jag om jag kan hjälpa till.

Bildkredit: Brandlarm via Flickr

James har en kandidatexamen i artificiell intelligens och är CompTIA A + och Network + certifierad. Han är ledande utvecklare av MakeUseOf och tillbringar sin fritid med att spela VR-paintball och brädspel. Han har byggt datorer sedan han var liten.