Advertentie

Detecteer beweging en maak een indringer bang met een hoog alarmgeluid 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 opnieuw schrijven en testen terwijl we verder gaan, zodat je hopelijk een idee krijgt van hoe het allemaal wordt gedaan in plaats van simpelweg iets te installeren dat ik al heb gemaakt.

Disclaimer: dit gaat je huis niet echt beschermen. Het macht geef je zus een nare schok als ze je kamer binnen sluipt.

Je hebt nodig:

  • Een Arduino
  • Ultrasone 'ping'-sensor die 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 basisbaan vervullen, en kost slechts $ 5
  • Een piezo-zoemer
  • LED-stripverlichting, met dezelfde bedrading die we gebruikten terug in dit project Bouw uw eigen dynamische omgevingsverlichting voor een mediacentrumAls u veel films op uw pc of mediacenter bekijkt, weet ik zeker dat u voor het belichtingsdilemma staat; schakel je alle lichten volledig uit? Houd je ze op volle toeren? Of... Lees verder .

Terwijl u dit project aansluit, moet u niet elke keer alles verwijderen - bouw gewoon door op het laatste blok. Tegen de tijd dat je bij "Coding The Alarm System" komt, zou je alle stukjes en beetjes moeten hebben aangesloten, en er ongeveer zo uit zien:

afgewerkte bedrading

Flitsende lichten

Gebruik het bedradingsschema van dit project Bouw uw eigen dynamische omgevingsverlichting voor een mediacentrumAls u veel films op uw pc of mediacenter bekijkt, weet ik zeker dat u voor het belichtingsdilemma staat; schakel je alle lichten volledig uit? Houd je ze op volle toeren? Of... Lees verder om uw ledstrip aan te sluiten; verander de pinnen niet, want we hebben PWM-uitvoer nodig. Gebruik deze code om uw bedrading snel te testen. Als alles goed gaat, zou je dit moeten hebben:

led-rgb-test

Afstandssensor

Op de SR04-module vind je 4 pinnen. VCC en GND ga naar respectievelijk + 5V rail en grond; TRIG is de pin die wordt gebruikt om een ​​sonarsignaal te verzenden, zet deze dan op pin 6; ECHO wordt gebruikt om het signaal terug te lezen (en dus de afstand te berekenen) - zet dit op 7.

sr04

Om het ongelooflijk eenvoudig te maken, is er een bibliotheek die we kunnen gebruiken NewPing. Download en plaats in je Arduino’s Bibliotheek map en start de IDE opnieuw op voordat u doorgaat. Test met deze code; open de seriële monitor en zorg ervoor dat de snelheid is ingesteld op 115200 baud. Met een beetje geluk zou je moeten zien dat sommige afstandsmetingen met een vrij hoge snelheid naar je worden teruggestuurd. Mogelijk vindt u een afwijking van 1 of 2 centimeter, maar dit is prima. Probeer uw hand voor de sensor te houden en beweeg deze op en neer om de veranderende meetwaarden te observeren.

ping-uitgang

De code moet redelijk eenvoudig te begrijpen zijn. Er zijn aan het begin een paar verklaringen van relevante pinnen, inclusief een maximale afstand - dit kan variëren de exacte sensor die u heeft, maar zolang u minder dan 1 meter nauwkeurig kunt aflezen, zou u dat moeten zijn prima.

In de lus van deze test-app gebruiken we de ping() functie om een ​​sonarping uit te zenden, waarbij een waarde in milliseconden wordt teruggezocht van hoe lang het duurde voordat de waarde terugkeerde. Om dit te begrijpen, gebruiken we de NewPing-bibliotheken die constant zijn ingebouwd US_ROUNDTRIP_CM, die definieert hoeveel microseconden er nodig zijn om een ​​centimeter te gaan. Er is ook een vertraging van 50 ms tussen pings om overbelasting van de sensor te voorkomen.

Piëzo-alarm

De piëzo-kristalsensor 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 en één op de grondrail - het maakt niet uit welke.

Gebruik deze code testen.

De enige manier om het nogal onaangename en luide alarm te doden, is door aan de stekkers 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. Pas de cijfers aan om met verschillende tonen te spelen.

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 gebruikt.

#include  // Selecteer welke PWM-compatibele pinnen moeten worden gebruikt. # definieer RED_PIN 10. # definieer GREEN_PIN 11. #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino pin vastgemaakt aan triggerpin op de ultrasone sensor. #define ECHO_PIN 7 // Arduino-pin verbonden met echo-pin op de ultrasone sensor. #define MAX_DISTANCE 100 // Maximale afstand waarvoor we willen pingen (in centimeters). #define ALARM 3 float sinVal; int toneVal; 

Begin met het schrijven van een basis opstelling() functie - we behandelen voorlopig alleen de lichten. Ik heb een vertraging van 5 seconden toegevoegd voordat de hoofdlus wordt gestart, om ons wat tijd te geven om uit de weg te gaan als dat nodig is.

leegte setup () {// set pinModes voor RGB strip pinMode (RED_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); // reset lichten analogWrite (RED_PIN, 0); analogWrite (BLUE_PIN, 0); analogWrite (RED_PIN, 0); vertraging (5000); }

Laten we een helperfunctie gebruiken waarmee we snel een enkele RGB-waarde naar de lichten kunnen schrijven.

// helperfunctie waarmee we een kleur in één opdracht kunnen verzenden. leegte kleur (niet-ondertekend char rood, niet-ondertekend char groen, niet-ondertekend char blauw) // de kleurgenererende functie. {analogWrite (RED_PIN, rood); analogWrite (BLUE_PIN, blauw); 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).

leegte 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 u op de goede weg bent.

Laten we nu de afstandssensor integreren om die lichten alleen te activeren als er iets binnenkomt, bijvoorbeeld 50 cm (net minder dan de breedte van een deurkozijn). We hebben de juiste pinnen al gedefinieerd en de bibliotheek geïmporteerd, dus voordat je opstelling() functie voeg de volgende regel toe om deze te instantiëren:

NewPing-sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup van pinnen en maximale afstand. 

Voeg daaronder een variabele toe om de status van het al dan niet geactiveerde alarm op te slaan, uiteraard standaard ingesteld op false.

boolean triggered = false; 

Voeg een regel toe aan de opstelling() functie zodat we de uitvoer kunnen volgen op serieel en debug.

Serial.begin (115200); // Open seriële monitor op 115200 baud om pingresultaten te zien. 

Laten we vervolgens de huidige lus hernoemen naar alarm() - zo wordt het genoemd als het alarm is afgegaan.

ongeldig alarm () {kleur (255,0,0); // rode vertraging (100); kleur (255.255,0); // yelow delay (100); }

Maak nu een nieuwe lus() functie, een functie waarin we een nieuwe ping ophalen, de resultaten lezen en het alarm activeren als er iets wordt gedetecteerd binnen het meterbereik.

leegte lus () {if (triggered == true) {alarm (); } else {delay (50); // Wacht 50 ms tussen pings (ongeveer 20 pings / sec). 29ms zou de kortste vertraging tussen pings moeten zijn. unsigned int uS = sonar.ping (); // Stuur ping, ontvang pingtijd in microseconden (VS). unsigned int distance = uS / US_ROUNDTRIP_CM; Serial.println (afstand); if (afstand <100) {geactiveerd = waar; } } }

Laat me de code kort uitleggen:

  • Begin door te controleren of het alarm is geactiveerd, en zo ja, schakel de alarmfunctie uit (op dit moment knipperen alleen de lichten).
  • Als het nog niet is geactiveerd, haalt u de huidige meting op van de sensor.
  • Als de sensor <100 cm leest, heeft iets de straal opgevuld (pas deze waarde natuurlijk aan als deze te vroeg voor u wordt geactiveerd).

Probeer het nu uit, voordat we de vervelende piezo-zoemer toevoegen.

Werken? Super goed. Laten we nu die zoemer terug toevoegen. Toevoegen pinMode naar de opstelling() routine.

pinMode (ALARM, UITGANG); 

Voeg vervolgens de piëzo-zoemerlus toe aan de functie alarm ():

voor (int x = 0; x <180; x ++) {// zet graden om in radialen en verkrijg dan sin-waarde sinVal = (sin (x * (3.1412 / 180))); // genereer een frequentie uit de sin-waarde toneVal = 2000+ (int (sinVal * 1000)); toon (ALARM, toneVal); }

Als je op dit punt probeert te compileren, kom je een fout tegen - ik heb dit met opzet achtergelaten zodat je een aantal veelvoorkomende problemen kunt zien. In dit geval gebruiken zowel de NewPing- als de standaardtoonbibliotheek dezelfde interrupts - ze zijn in wezen conflicterend en u kunt niet veel doen om het te repareren. Oh jee.

Geen zorgen. Het is een veel voorkomend probleem en iemand heeft al een oplossing - download en voeg deze toe NewTone naar je Arduino Libraries map. Pas het begin van uw 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 domme hond, die volledig onaangedaan leek door het alarm.

Heeft u problemen met de code? Hier is de complete app. Als je willekeurige fouten krijgt, plak ze dan hieronder en ik kijk of ik je kan helpen.

Afbeelding tegoed: Brandalarm via Flickr

James heeft een BSc in Artificial Intelligence en is CompTIA A + en Network + gecertificeerd. Hij is de hoofdontwikkelaar van MakeUseOf en brengt zijn vrije tijd door met het spelen van VR paintball en bordspellen. Hij bouwt al pc's sinds hij een kind was.