Detecteer beweging en maak de indringer vervolgens bang met hoge alarmgeluiden en knipperende lichten. Klinkt dat leuk? Natuurlijk doet het. Dat is het doel van het Arduino-project van vandaag, geschikt voor beginners. We zullen volledig van nul schrijven en testen terwijl we verder gaan, zodat je hopelijk een idee krijgt van hoe het allemaal wordt gedaan in plaats van gewoon iets te installeren dat ik al heb gemaakt.
Disclaimer: dit gaat je huis niet echt beschermen. Het kan je zus misschien een akelige schok geven als ze je kamer binnensluipt.
Je hebt nodig:
- Een Arduino
- Ultrasone "ping" -sensor, ik gebruik HC-SR04 Een PIR zou beter zijn, maar die zijn duur. Een ping-sensor kan heimelijk in een deuropening worden geplaatst en nog steeds dezelfde basisopdracht hebben en is slechts $ 5
- Een piëzo zoemer
- Ledstriplicht, met dezelfde bedrading die we in dit project hebben gebruikt Bouw je eigen dynamische omgevingsverlichting voor een mediacentrum Bouw je eigen dynamische omgevingsverlichting voor een mediacentrum Als je veel films op je pc of mediacenter bekijkt, Ik weet zeker dat je voor het verlichtingsdilemma staat; schakel je alle lichten helemaal uit? Houd je ze voluit? Of ... Lees meer.
Terwijl je dit project bedraad, moet je niet alles elke keer verwijderen - bouw gewoon verder aan het laatste blok. Tegen de tijd dat je bij het gedeelte 'Het coderen van het alarmsysteem' komt, moet je alle stukjes en beetjes aangesloten hebben en er ongeveer zo uitzien:
Flitsende lichten
Gebruik het bedradingsschema van dit project Bouw uw eigen dynamische omgevingsverlichting voor een mediacentrum Bouw uw eigen dynamische omgevingsverlichting voor een mediacentrum Als u veel films op uw pc of mediacentrum bekijkt, weet ik zeker dat u met de verlichtingsdilemma; schakel je alle lichten helemaal uit? Houd je ze voluit? Of ... Lees meer om uw LED-strip aan te sluiten; verander de pinnen niet, omdat we PWM-uitvoer nodig hebben. Gebruik deze code om snel uw bedrading te testen. Als alles goed gaat, zou je dit moeten hebben:
Afstandssensor
Op de SR04-module vindt u 4 pinnen. VCC en GND gaan respectievelijk naar + 5V rail en grond; TRIG is de pin die wordt gebruikt om een sonarsignaal te verzenden, zet dit op pin 6; ECHO wordt gebruikt om het signaal terug te lezen (en dus de afstand te berekenen) - zet dit op 7.
Om dingen ongelooflijk eenvoudig te maken, is er een bibliotheek die we kunnen gebruiken, genaamd NewPing. Download en plaats in de Arduino Bibliotheekmap en start de IDE opnieuw voordat je verdergaat. Test met behulp van deze code; open de seriële monitor en zorg ervoor dat de snelheid is ingesteld op 115200 baud. Met een beetje geluk zou je een aantal afstandsmetingen op een vrij hoge snelheid naar je toe moeten zien komen. Je kunt een afwijking van 1 of 2 centimeter vinden, maar dit is prima. Probeer uw hand voor de sensor te laten lopen, deze op en neer te bewegen om de veranderende meetwaarden te observeren.
De code moet vrij eenvoudig te begrijpen zijn. Er zijn een paar aangiften van relevante pinnen aan het begin, inclusief een maximale afstand - dit kan variëren afhankelijk van de exacte sensor die je hebt, maar zolang je in staat bent om minder dan 1 meter uitlezingen nauwkeurig te krijgen, zou het in orde moeten zijn.
In de loop van deze test-app gebruiken we de ping () -functie om een echolood-ping uit te zenden en krijgt een waarde terug in milliseconden van hoe lang het duurde voordat de waarde terugkeerde. Om dit te begrijpen gebruiken we de NewPing-bibliotheken, gebouwd in constante van US_ROUNDTRIP_CM, die bepalen hoeveel microseconden er nodig zijn om een enkele centimeter te gaan. Er is ook een vertraging van 50 ms tussen pings om overbelasting van de sensor te voorkomen.
Piezo-alarm
De piëzokristalsensor is een eenvoudige en goedkope zoemer en we kunnen een PWM-pin 3 gebruiken om verschillende tonen te maken. Sluit één draad aan op pin 3, één op grondrail - het maakt niet uit welke.
Gebruik deze code om te testen.
De enige manier om het nogal onaangename en luide alarm te doden, is door aan de pluggen te trekken. De code is een beetje ingewikkeld om uit te leggen, maar het gaat om het gebruik van sinusgolven om een onderscheidend geluid te genereren. Tweak de nummers om te spelen met verschillende tonen.
Codering van het alarmsysteem
Nu we alle stukjes van deze puzzel hebben, laten we ze samen combineren.
Ga je gang en maak een nieuwe schets, genaamd Alarm . Begin met het combineren van alle variabelen en pindefinities die we tot nu toe in de testvoorbeelden hebben.
#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;
Begin met het schrijven van een functie basic setup () - we zullen alleen de lichten voor nu behandelen. Ik heb een vertraging van 5 seconden toegevoegd voordat de hoofdlus is gestart om ons wat tijd te geven om uit de weg te gaan, indien nodig.
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); }
Laten we een hulpfunctie gebruiken waarmee we snel één RGB-waarde naar de lichten kunnen schrijven.
//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); }
Ten slotte zal onze lus voor nu bestaan uit een eenvoudige kleurenflits tussen rood en geel (of, wat je ook wilt dat je alarm is - verander gewoon de RGB-waarden).
void loop(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yellow delay(100); }
Upload en test dat om er zeker van te zijn dat je op de goede weg bent.
Laten we nu de afstandssensor integreren om die lichten alleen te activeren als iets binnen komt, bijvoorbeeld 50 cm (net minder dan de breedte van een deurkozijn). We hebben de juiste pinnen gedefinieerd en de bibliotheek geïmporteerd, dus voeg vóór de functie setup () de volgende regel toe om deze te instantiëren:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
Voeg daaronder een variabele toe om de status van het alarm dat wordt geactiveerd in te schakelen of niet, uiteraard onterecht.
boolean triggered = false;
Voeg een regel toe aan de setup () functie, zodat we de output op serial en debug kunnen monitoren.
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
Laten we vervolgens de huidige lus hernoemen naar alarm () - dit is wat er wordt gebeld als het alarm is geactiveerd.
void alarm(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yelow delay(100); }
Maak nu een nieuwe loop () -functie, een waarin we een nieuwe ping halen, de resultaten lezen en het alarm activeren als er iets wordt gedetecteerd binnen het meterbereik.
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; } } }
Laat me de code kort uitleggen:
- Begin met controleren of het alarm is geactiveerd en, als dat het geval is, de alarmfunctie afvuren (alleen de lichten op het moment laten knipperen).
- Als het nog niet is geactiveerd, haalt u de huidige waarde van de sensor op.
- Als de sensor <100 cm aan het lezen is, heeft iets de straal opgevuld (pas deze waarde aan als deze te vroeg voor u triggert, uiteraard).
Geef het nu een proefrit, voordat we de irritante piezo-zoemer toevoegen.
Werken? Super goed. Laten we nu die zoemer toevoegen. Voeg pinMode toe aan de setup () -routine .
pinMode(ALARM, OUTPUT);
Voeg vervolgens de piezo zoemerlus toe aan de alarm () functie:
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); }
Als je op dit punt probeert te compileren, kom je een fout tegen - ik heb dit met opzet achtergelaten, zodat je enkele veelvoorkomende problemen kunt zien. In dit geval gebruiken zowel de NewPing-bibliotheek als de standaardtintbibliotheek dezelfde interrupts - ze zijn fundamenteel in strijd en er is niet veel wat u kunt doen om het te repareren. Oh jee.
Geen zorgen echter. Het is een veel voorkomend probleem en iemand heeft al een oplossing - download en voeg deze NewTone toe aan je Arduino Libraries-map. Pas het begin van je programma aan om dit op te nemen:
#include
En pas de lijn aan:
tone(ALARM, toneVal);
naar
NewTone(ALARM, toneVal);
in plaats daarvan.
Dat is het. Zet je wekker in de deuropening van je slaapkamer voor de volgende ongelukkige inbreker.
Of, een suffe hond, die volkomen onaangedaan leek door het alarm.
Heb je problemen met de code? Dit is de complete app. Als u willekeurige fouten krijgt, kunt u ze hieronder plakken en dan kijken of ik u kan helpen.
Image credit: Fire Alarm via Flickr