Reklame

Registrer bevægelse, og skræm derefter pokker ud af en ubuden gæst med en høj tonehøjde og blinkende lys. Lyder det sjovt? Selvfølgelig gør det det. Det er målet med dagens Arduino-projekt, der er velegnet til begyndere. Vi skriver helt fra bunden og tester, mens vi går sammen, så du forhåbentlig kan få en idé om, hvordan det hele foregår i stedet for blot at installere noget, jeg allerede har lavet.

Ansvarsfraskrivelse: dette vil ikke faktisk beskytte dit hus. Det magt give din søster et grimt chok, når hun sniger sig ind i dit værelse.

Du har brug for:

  • En Arduino
  • Ultralyd “ping” sensor, jeg bruger HC-SR04 En PIR ville være bedre, men de er dyre. En ping-sensor kan placeres uhyggeligt i en døråbning og stadig tjene det samme grundlæggende job, og er kun $ 5
  • En piezo summer
  • LED-strimmellys, med de samme ledninger, vi brugte tilbage i dette projekt Byg din egen dynamiske omgivelsesbelysning til et mediecenterHvis du ser en masse film på din pc eller mediecenter, er jeg sikker på, at du står over for lysdilemmaet; slukker du alle lys helt? Holder du dem på fuld blast? Eller... Læs mere .

Når du tilslutter dette projekt, skal du ikke fjerne alt hver gang - bare fortsæt med at bygge videre på den sidste blok. Når du kommer til afsnittet "Kodning af alarmsystemet", skal du have alle bits og stykker forbundet, så du ser sådan ud:

færdig ledningsføring

Blinkende lys

Brug ledningsdiagrammet fra dette projekt Byg din egen dynamiske omgivelsesbelysning til et mediecenterHvis du ser en masse film på din pc eller mediecenter, er jeg sikker på, at du står over for lysdilemmaet; slukker du alle lys helt? Holder du dem på fuld blast? Eller... Læs mere at tilslutte din LED-strip; skift ikke nålene, da vi har brug for PWM-output. Brug denne kode for hurtigt at teste dine ledninger. Hvis alt går godt, skal du have dette:

ledede-rgb-test

Afstandsføler

På SR04-modulet finder du 4 pins. VCC og GND gå til henholdsvis + 5V skinne og jord; TRIG er den pin, der bruges til at sende et ekkolodsignal, sæt dette på pin 6; EKKO bruges til at læse signalet tilbage (og derfor beregne afstanden) - sæt dette på 7.

SR04

For at gøre tingene utroligt enkle er der et bibliotek, vi kan bruge kaldet NewPing. Download og placer i dine Arduino'er Bibliotek mappe og genstarte IDE'en, før du fortsætter. Test med denne kode; åbn den serielle skærm, og sørg for, at hastigheden er indstillet til 115200 baud. Med held og lykke skal du se, at nogle afstandsmålinger sendes tilbage til dig med en temmelig høj hastighed. Du finder muligvis en varians på 1 eller 2 centimeter, men det er fint. Prøv at køre hånden foran sensoren, bevæg den op og ned for at se de skiftende målinger.

ping-output

Koden skal være ganske enkelt at forstå. Der er et par erklæringer om relevante stifter i starten, inklusive en maksimal afstand - dette kan variere afhængigt af den nøjagtige sensor, du har, men så længe du er i stand til at få mindre end 1 meter nøjagtighed, skal du være det bøde.

I løkken på denne testapp bruger vi ping () funktion til at sende en ekkolod ping, få en værdi tilbage i millisekunder, hvor lang tid det tog, før værdien kom tilbage. For at give mening om dette bruger vi NewPing-biblioteker, der er bygget konstant af US_ROUNDTRIP_CM, der definerer hvor mange mikrosekunder det tager at gå en centimeter. Der er også en 50 ms forsinkelse mellem pings for at undgå overbelastning af sensoren.

Piezo Alarm

Piezo krystalsensoren er en enkel og billig summer, og vi kan bruge en PWM-pin 3 til at lave forskellige toner. Tilslut en ledning til pin 3, en til jordskinne - det betyder ikke noget, hvilket.

Brug denne kode at teste.

Den eneste måde at dræbe den temmelig modbydelige og høje alarm er at trække i stikkene. Koden er lidt kompleks at forklare, men den involverer at bruge sinusbølger til at generere en karakteristisk lyd. Tilpas numrene for at spille med forskellige toner.

Kodning af alarmsystemet

Nu hvor vi har alle brikkerne i dette puslespil, lad os kombinere dem sammen.

Gå videre og lav en ny skitse, kaldet Alarm. Start med at kombinere alle variabler og pin-definitioner, vi har i testeksemplerne indtil nu.

#omfatte  // Vælg hvilke PWM-stifter, der skal bruges. #definér RED_PIN 10. #definer GREEN_PIN 11. #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino-pin bundet til at udløse pin på ultralydssensoren. #definér ECHO_PIN 7 // Arduino-pin bundet til ekko-pin på ultralydssensoren. #define MAX_DISTANCE 100 // Maksimal afstand, vi ønsker at pinge til (i centimeter). #definer ALARM 3 float sinVal; int toneVal; 

Begynd med at skrive en grundlæggende Opsætning() funktion - vi behandler kun lysene i øjeblikket. Jeg har tilføjet en forsinkelse på 5 sekunder, før hovedsløjfen er startet, så vi får tid til at komme ud af vejen, hvis det er nødvendigt.

tom opsætning () {// sæt pinModes til RGB strip pinMode (RED_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); // nulstille lys analogWrite (RED_PIN, 0); analogWrite (BLUE_PIN, 0); analogWrite (RED_PIN, 0); forsinkelse (5000); }

Lad os bruge en hjælperfunktion, der giver os mulighed for hurtigt at skrive en enkelt RGB-værdi ud til lysene.

// hjælperfunktion, der gør det muligt for os at sende en farve i en kommando. tom farve (usigneret char rød, usigneret char grøn, usigneret char blue) // den farvegenererende funktion. {analogWrite (RED_PIN, rød); analogWrite (BLUE_PIN, blå); analogWrite (GREEN_PIN, grøn); }

Endelig vil vores løkke for nuværende bestå af en simpel farveblitz mellem rød og gul (eller hvad du end vil have din alarm til - bare ændre RGB-værdier).

void loop () {farve (255,0,0); // rød forsinkelse (100); farve (255.255,0); // gul forsinkelse (100); }

Upload og test det for at sikre, at du er på det rigtige spor.

Lad os nu integrere afstandsføleren for kun at udløse disse lys, når noget kommer inden for f.eks. 50 cm (bare mindre end en dørkarms bredde). Vi har allerede defineret de rigtige ben og importeret biblioteket, så før dit Opsætning() funktion tilføje følgende linje for at øjeblikkelig gøre det:

NyPing-ekkolodd (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing-opsætning af stifter og maksimal afstand. 

Under det tilføjes en variabel for at gemme tilstanden af ​​alarmen, der udløses eller ikke, og som standard er selvfølgelig falsk.

boolsk udløst = falsk; 

Føj en linje til Opsætning() funktion, så vi kan overvåge output på seriel og debug.

Serial.begin (115200); // Åbn seriel skærm ved 115200 baud for at se pingresultater. 

Lad os derefter omdøbe den aktuelle loop til alarm () - det her kaldes, hvis alarmen er udløst.

tom alarm () {farve (255,0,0); // rød forsinkelse (100); farve (255.255,0); // yelow forsinkelse (100); }

Opret nu en ny loop () funktion, hvor vi henter en ny ping, læser resultaterne og udløser alarmen, hvis der registreres noget inden for målerområdet.

void loop () {if (udløst == true) {alarm (); } andet {forsinkelse (50); // Vent 50 ms mellem pings (ca. 20 pings / sek). 29 ms skal være den korteste forsinkelse mellem pings. usigneret int u = sonar.ping (); // Send ping, få pingtid i mikrosekunder (us). usigneret int-afstand = uS / US_ROUNDTRIP_CM; Serial.println (afstand); if (afstand <100) {udløst = sandt; } } }

Lad mig forklare koden kort:

  • Start med at kontrollere for at se, om alarmen er blevet udløst, og i bekræftende fald, sluk alarmfunktionen (bare blinkende lysene i øjeblikket).
  • Hvis det ikke er udløst endnu, skal du få den aktuelle aflæsning fra sensoren.
  • Hvis sensoren læser <100 cm, har noget polstret strålen (juster denne værdi, hvis den udløser for tidligt for dig, åbenbart).

Giv det en prøvekørsel nu, før vi tilføjer den irriterende piezo-summer.

Arbejder? Store. Lad os nu tilføje den summer tilbage. Tilføje pinMode til Opsætning() rutine.

pinMode (ALARM, OUTPUT); 

Føj derefter piezo summer-loop til alarm () -funktionen:

for (int x = 0; x <180; x ++) {// konverter grader til radianer, og få derefter syndeværdien sinVal = (sin (x * (3.1412 / 180))); // generere en frekvens fra sinværdien toneVal = 2000+ (int (sinVal * 1000)); tone (ALARM, toneVal); }

Hvis du prøver at samle på dette tidspunkt, vil du opstå en fejl - jeg har overladt dette med vilje, så du kan se nogle almindelige problemer. I dette tilfælde bruger både NewPing og standardtone-biblioteket de samme afbrydelser - de er i modstrid med dem, og der er ikke meget, du kan gøre for at ordne det. Åh gud.

Ingen bekymringer dog. Det er et almindeligt problem, og nogen har en løsning allerede - download og tilføj dette Newtone til din Arduino-bibliotek-mappe. Juster starten af ​​dit program, så det inkluderer dette:

#omfatte 

Og juster linjen:

 tone (ALARM, toneVal); 

til

 NewTone (ALARM, toneVal); 

i stedet.

Det er det. Indstil alarmen i døren til dit soveværelse for den næste uheldige indbrudstyv.

Eller en dumhund, der syntes aldeles upazeret af alarmen.

Har du problemer med koden? Her er komplet app. Hvis du får tilfældige fejl, kan du prøve at indsætte dem nedenfor, så ser jeg, om jeg kan hjælpe.

Billedkredit: Brandalarm via Flickr

James har en BSc i kunstig intelligens og er CompTIA A + og Network + certificeret. Han er hovedudvikler af MakeUseOf og bruger sin fritid på at spille VR paintball og brætspil. Han har bygget pc'er siden han var barn.