Upptäck rörelser och skrämm sedan en inkräktare med ett högt larm och blinkande lampor. Låter det kul? Självklart gör det det. Det är målet med dagens Arduino-projekt, lämpligt för nybörjare. Vi kommer att skriva helt från grunden och testa allt eftersom så att du förhoppningsvis kan få en uppfattning om hur det hela går till istället för att bara installera något jag redan har gjort.
Ansvarsfriskrivning: detta kommer inte att skydda ditt hus faktiskt. Det makt ge din syster en otäck chock när hon smyger in i ditt rum.
Du kommer att behöva:
En Arduino Ultrasonic “ping” sensor, jag använder HC-SR04 A PIR skulle vara bättre, men de är dyra. En pingsensor kan placeras i smyg i en dörröppning och fortfarande tjäna samma grundläggande jobb, och kostar bara $5 En piezo-summer LED-remslampa, med samma ledningar som vi använde i det här projektet.
När du kopplar upp det här projektet, ta inte bort allt varje gång – fortsätt bara att bygga på det sista blocket. När du kommer till avsnittet “Coding The Alarm System” bör du ha alla bitar och bitar anslutna, se ut ungefär så här:
Blinkande ljus
Använd kopplingsschemat från detta projekt för att koppla upp din LED-remsa; byt inte stiften, eftersom vi behöver PWM-utgång. Använd den här koden för att snabbt testa dina ledningar. Om allt går bra bör du ha detta:
Avståndssensor
På SR04-modulen hittar du 4 stift. VCC och GND gå till +5V järnväg respektive jord; TRIG är stiftet som används för att skicka en ekolodssignal, sätt detta på stift 6; EKO används för att läsa tillbaka signalen (och därför beräkna avståndet) — sätt detta på 7.
För att göra saker otroligt enkelt finns det ett bibliotek som vi kan använda som heter NewPing. Ladda ner och placera i din Arduino Bibliotek och starta om IDE innan du fortsätter. Testa med denna kod; öppna upp den seriella monitorn och se till att hastigheten är inställd på 115200 baud. Med lite tur bör du se några avståndsmätningar skickas tillbaka till dig i ganska hög hastighet. Du kan hitta en avvikelse på 1 eller 2 centimeter, men det här är bra. Försök att köra handen framför sensorn, flytta den upp och ner för att observera de ändrade värdena.
Koden bör vara ganska enkel att förstå. Det finns några 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äsningar korrekt, bör du klara dig.
I slingan av denna testapp använder vi ping() funktion för att skicka ut en ekolodsping och få tillbaka ett värde i millisekunder av hur lång tid det tog för värdet att returnera. För att förstå detta använder vi NewPing-biblioteken inbyggda i konstant av US_ROUNDTRIP_CM, som definierar hur många mikrosekunder det tar att gå en enda centimeter. Det finns också en fördröjning på 50 ms mellan pingarna för att undvika att överbelasta sensorn.
Piezolarm
Piezokristallsensorn är en enkel och billig summer, och vi kan använda ett PWM-stift 3 för att göra olika toner. Anslut en tråd 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 vidriga och högljudda larmet är att dra ur kontakterna. Koden är lite komplicerad 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 bitar av detta pussel, låt oss kombinera dem tillsammans.
Varsågod och gör en ny skiss, kallad Larm. Börja med att kombinera alla variabler och pindefinitioner vi har i testexemplen fram till nu.
#include <NewPing.h>
// 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 uppstart() funktion – vi kommer bara att ta itu med lamporna för tillfället. Jag har lagt till en 5 sekunders fördröjning innan huvudslingan startas för att ge oss lite tid att komma 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 att vi snabbt kan skriva ut ett enda RGB-värde till lamporna.
//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 loop för nu att bestå av en enkel färgblixt mellan rött och gult (eller vad du nu 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 säkerställa att du är på rätt väg.
Låt oss nu integrera avståndssensorn för att utlösa dessa lampor endast när något kommer inom, säg, 50 cm (bara mindre än bredden på en dörrkarm). Vi har redan definierat rätt stift och importerat biblioteket, så innan din uppstart() funktion lägg till följande rad för att instansiera den:
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 tillståndet för larmet som utlöses eller inte, som standard till false, naturligtvis.
boolean triggered = false;
Lägg till en rad i uppstart() funktion så att vi kan övervaka utdata 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 nuvarande slingan till larm() – det är vad som kommer att kallas om larmet har utlösts.
void alarm(){
color(255,0,0); //red
delay(100);
color(255,255,0); //yelow
delay(100);
}
Skapa nu en ny slinga() funktion, en där vi hämtar en ny ping, läser av resultaten och utlöser larmet om något upptäcks inom mätarområ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 kort:
Börja med att kontrollera om larmet har utlösts, och i så fall avfyra larmfunktionen (bara att blinka med lamporna för tillfället). Om den inte har utlösts ännu, hämta den aktuella avläsningen från sensorn. Om sensorn läser 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 summern tillbaka. Lägg till pinMode till uppstart() rutin.
pinMode(ALARM, OUTPUT);
Lägg sedan till piezosummerslingan till alarm()-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 det här laget, kommer du att stöta på ett fel — jag har lämnat det här medvetet så att du kan se några vanliga problem. I det här fallet använder både NewPing- och standardtonbiblioteket samma avbrott — de är i grunden 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 redan en lösning — ladda ner och lägg till denna NewTone till din Arduino Libraries-mapp. Justera början av ditt program för att inkludera detta:
#include <NewTone.h>
Och justera linjen:
tone(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 olyckliga inbrottstjuv.
Eller en knäpp hund, som verkade helt oberörd av larmet.
Har du problem med koden? Här är hela appen. Om du får slumpmässiga fel, försök klistra in dem nedan så ska jag se om jag kan hjälpa dig.
Bildkredit: Brandlarm via Flickr
Om författaren
James Bruce (720 publicerade artiklar)
James har en BSc i artificiell intelligens och är CompTIA A+ och Network+ certifierad. När han inte är upptagen som Hardware Review Editor, gillar han LEGO, VR och brädspel. Innan han började på MakeUseOf var han ljustekniker, engelskalärare och datacenteringenjör.
Mer från James Bruce
Prenumerera på vårt nyhetsbrev
Gå med i vårt nyhetsbrev för tekniska tips, recensioner, free e-böcker och exklusiva erbjudanden!
Klicka här för att prenumerera
