Hoe maak je een eenvoudig Arduino-alarmsysteem
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 helemaal 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 macht geef je zus een akelige schok als ze je kamer binnensluipt.
Je hebt nodig:
- Een Arduino
- ultrasonore “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 aankomt “Codering van het alarmsysteem” sectie, moet je alle stukjes en beetjes aangesloten hebben, er ongeveer zo uitzien:
Flitsende lichten
Gebruik het bedradingsschema van dit project Maak 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 ga naar respectievelijk + 5V rail en aarde; TRIG is de pin die wordt gebruikt om een sonarsignaal te verzenden, plaats 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 uw Arduino's Bibliotheek map en start de IDE opnieuw voordat u 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 en deze op en neer te bewegen om de veranderende waarden te bekijken.
De code moet vrij eenvoudig te begrijpen zijn. Er zijn enkele verklaringen 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 nauwkeurig te worden, zou het goed moeten zijn.
In de loop van deze test-app gebruiken we de ping() functie om een sonar-ping uit te zenden, krijgt een waarde terug in milliseconden van hoe lang het duurde voordat de waarde terugkeerde. Om dit te begrijpen, gebruiken we de NewPing-bibliotheken die constant zijn gebouwd US_ROUNDTRIP_CM, die definieert 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 // Selecteer welke PWM-geschikte pinnen moeten worden gebruikt. #define RED_PIN 10 #define GREEN_PIN 11 #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino-pin vastgebonden aan triggerpen op de ultrasone sensor. #define ECHO_PIN 7 // Arduino-pin vastgebonden aan echopin op de ultrasone sensor. #define MAX_DISTANCE 100 // Maximale afstand waarop we willen pingen (in centimeters). #define ALARM 3 float sinVal; int toneVal;
Begin met het schrijven van een basis opstelling() functie - 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 () // stel pinModes in voor RGB strip pinMode (RED_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); // reset lampen analoog (RED_PIN, 0); analogWrite (BLUE_PIN, 0); analogWrite (RED_PIN, 0); delay (5000);
Laten we een hulpfunctie gebruiken waarmee we snel een enkele RGB-waarde naar de lichten kunnen schrijven.
// helpfunctie waarmee we een kleur in één opdracht kunnen verzenden ongeldige kleur (unsigned char red, unsigned char green, unsigned char blue) // de functie voor het genereren van kleuren analogWrite (RED_PIN, red); analogWrite (BLUE_PIN, blue); analogWrite (GREEN_PIN, groen);
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).
ongeldige lus () kleur (255,0,0); // rode vertraging (100); Kleur (255,255,0); // gele vertraging (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 binnenkomt, bijvoorbeeld 50 cm (net minder dan de breedte van een deurkozijn). We hebben al de juiste pinnen gedefinieerd en de bibliotheek geïmporteerd, dus vóór uw opstelling() functie voeg de volgende regel toe om het te instantiëren:
NewPing-sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing-instellingen van pinnen en maximale afstand.
Voeg daaronder een variabele toe om de status van het alarm dat wordt geactiveerd in te schakelen of niet, standaard natuurlijk op false.
boolean triggered = false;
Voeg een regel toe aan de opstelling() functie, zodat we de output op serial en debug kunnen monitoren.
Serial.begin (115200); // Open een seriële monitor op 115200 baud om de ping-resultaten te bekijken.
Laten we vervolgens de huidige lus hernoemen naar alarm() - Dit is wat er zal worden gebeld als het alarm is geactiveerd.
ongeldig alarm () kleur (255,0,0); // rode vertraging (100); Kleur (255,255,0); // yelowvertraging (100);
Maak nu een nieuw lus() 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); // Wacht 50ms tussen pings (ongeveer 20 pings / sec). 29ms zou de kortste vertraging moeten zijn tussen pings. unsigned int uS = sonar.ping (); // Stuur ping, ontvang ping-tijd in microseconden (uS). unsigned int distance = uS / US_ROUNDTRIP_CM; Serial.println (afstand); if (afstand < 100) triggered = true;
Laat me de code kort uitleggen:
- Begin met het controleren om te zien of het alarm is geactiveerd en, als dat zo is, de alarmfunctie afvuren (alleen de lichten knipperen op het moment).
- Als het nog niet is geactiveerd, haalt u de huidige waarde van de sensor op.
- Als de sensor aan het lezen is <100 cm, something has padded the beam (adjust this value if it's triggering too early for you, obviously).
Geef het nu een proefrit, voordat we de irritante piezo-zoemer toevoegen.
Werken? Super goed. Laten we nu die zoemer toevoegen. Toevoegen pinMode naar de opstelling() routine-.
pinMode (ALARM, UITVOER);
Voeg vervolgens de piezo zoemerlus toe aan de alarm () functie:
voor (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 map Arduino Libraries. Pas het begin van je programma aan om dit op te nemen:
#include
En pas de lijn aan:
toon (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
Ontdek meer over: Arduino.