Annonse
Registrer bevegelse, og skrem deretter pokker fra en inntrenger med høye alarmlyder og blinkende lys. Høres det morsomt ut? Selvfølgelig gjør den det. Det er målet med dagens Arduino-prosjekt, som passer for nybegynnere. Vi skriver helt fra grunnen av og tester mens vi går sammen, slik at du forhåpentligvis kan få en ide om hvordan det hele blir gjort i stedet for å bare installere noe jeg allerede har laget.
Ansvarsfraskrivelse: dette vil ikke faktisk beskytte huset ditt. Den kanskje gi søsteren din et stygt sjokk når hun sniker seg inn på rommet ditt.
Du vil trenge:
- En Arduino
- Ultralyd “ping” sensor, bruker jeg HC-SR04 En PIR ville være bedre, men de er dyre. En ping-sensor kan plasseres skjult i en døråpning og fremdeles tjene den samme grunnleggende jobben, og er bare $ 5
- En piezo-summer
- LED-stripelys, med de samme ledningene vi brukte tilbake i dette prosjektet Bygg din egen dynamiske omgivelsesbelysning for et mediesenterHvis du ser mange filmer på din PC eller mediesenter, er jeg sikker på at du har møtt lysdilemmaet; slår du helt av alle lysene? Holder du dem på full blest? Eller... Les mer .
Når du kobler til dette prosjektet, ikke fjern alt hver gang - bare fortsett å bygge videre på den siste blokken. Når du kommer til delen "Koding av alarmsystemet", bør du ha alle bitene og delene koblet sammen og se slik ut:
Blinkende lys
Bruk koblingsskjemaet fra dette prosjektet Bygg din egen dynamiske omgivelsesbelysning for et mediesenterHvis du ser mange filmer på din PC eller mediesenter, er jeg sikker på at du har møtt lysdilemmaet; slår du helt av alle lysene? Holder du dem på full blest? Eller... Les mer å koble til LED-stripen din; ikke endre pinnene, da vi trenger PWM-utgang. Bruk denne koden for raskt å teste ledningene. Hvis alt går bra, bør du ha dette:
Avstandsføler
På SR04-modulen finner du 4 pinner. VCC og GND gå til henholdsvis + 5V skinne og bakken; TRIG er pinnen som brukes til å sende et ekkoloddsignal, sett dette på pinne 6; EKKO brukes til å lese signalet tilbake (og beregne derfor avstanden) - sett dette på 7.
For å gjøre ting utrolig enkle, er det et bibliotek vi kan bruke kalt NewPing. Last ned og plasser i Arduino-ene dine Bibliotek mappe og start IDE på nytt før du fortsetter. Test med denne koden; åpne opp seriemonitoren og sørg for at hastigheten er satt til 115200 baud. Med hell, bør du se at noen avstandsmålinger blir sendt tilbake til deg med ganske høy hastighet. Det kan hende du finner en varians på 1 eller 2 centimeter, men dette er bra. Prøv å løpe hånden foran sensoren, flytt den opp og ned for å observere de endrede målingene.
Koden skal være ganske enkelt å forstå. Det er noen få erklæringer om relevante pinner i starten, inkludert maksimal avstand - dette kan variere iht den nøyaktige sensoren du har, men så lenge du er i stand til å få mindre enn 1 meters avlesning nøyaktig, bør du være det fint.
I sløyfen til denne testappen bruker vi ping () funksjon for å sende ut et ekkolodd ping, og få tilbake en verdi i millisekunder på hvor lang tid det tok før verdien kom tilbake. For å forstå dette bruker vi NewPing-bibliotekene som er bygd konstant i US_ROUNDTRIP_CM, som definerer hvor mange mikrosekunder det tar å gå en centimeter. Det er også en 50 ms forsinkelse mellom pingene for å unngå overbelastning av sensoren.
Piezo Alarm
Piezo-krystallsensoren er en enkel og billig summer, og vi kan bruke en PWM-pinne 3 for å lage forskjellige toner. Koble en ledning til pinne 3, en til jordskinne - det spiller ingen rolle hvilken.
Bruk denne koden å teste.
Den eneste måten å drepe den ganske motbydelige og høye alarmen er å trekke i pluggene. Koden er litt kompleks å forklare, men den innebærer å bruke sinusbølger for å generere en særegen lyd. Finpusse tallene for å spille med forskjellige toner.
Koding av alarmsystemet
Nå som vi har alle brikkene i dette puslespillet, la oss kombinere dem sammen.
Gå videre og lag en ny skisse, kalt Alarm. Begynn med å kombinere alle variablene og pin-definisjonene vi har i testeksemplene til nå.
#inkludere // Velg hvilke PWM-kompakte pinner som skal brukes. #definere RED_PIN 10. #definere GREEN_PIN 11. #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino-pin bundet for å utløse pinne på ultralydsensoren. #define ECHO_PIN 7 // Arduino-pin bundet til ekkopinne på ultralydsensoren. #define MAX_DISTANCE 100 // Maksimal avstand vi ønsker å pinge på (i centimeter). #definere ALARM 3 flyte sinVal; int toneVal;
Begynn med å skrive en grunnleggende setup () funksjon - vi vil bare håndtere lysene foreløpig. Jeg har lagt til en forsinkelse på 5 sekunder før hovedsløyfen begynner å gi oss litt tid til å komme oss ut av veien om nødvendig.
void setup () {// angi pinModes for RGB strip pinMode (RED_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); // tilbakestill lys analogWrite (RED_PIN, 0); analogWrite (BLUE_PIN, 0); analogWrite (RED_PIN, 0); forsinkelse (5000); }
La oss bruke en hjelperfunksjon som lar oss raskt skrive en enkelt RGB-verdi ut til lysene.
// hjelperfunksjon som lar oss sende en farge i en kommando. tom farge (usignert røye, usignert røye grønt, usignert røyeblå) // den fargenererende funksjonen. {analogWrite (RED_PIN, rød); analogWrite (BLUE_PIN, blå); analogWrite (GREEN_PIN, grønn); }
Endelig vil loopen vår for nå bestå av en enkel fargeblits mellom rødt og gult (eller hva du enn vil at alarmen din skal være - bare endre RGB-verdiene).
void loop () {farge (255,0,0); // rød forsinkelse (100); farge (255,255,0); // gul forsinkelse (100); }
Last opp og test det for å sikre at du er på rett vei.
La oss integrere avstandsføleren for å utløse lysene bare når noe kommer inn, for eksempel, 50 cm (bare mindre enn bredden på en dørkarm). Vi har allerede definert de rette pinnene og importert biblioteket, så før ditt setup () funksjon legg til følgende linje for å starte den:
NyPing ekkolodd (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing-oppsett av pinner og maksimal avstand.
Under det kan du legge til en variabel for å lagre tilstanden til alarmen som utløses eller ikke, og som standard, selvfølgelig, til falsk.
boolsk utløst = falsk;
Legg til en linje til setup () funksjon slik at vi kan overvåke utgangen på seriell og feilsøke.
Serial.begin (115200); // Åpne seriemonitor på 115200 baud for å se pingresultater.
La oss deretter gi nytt navn til den gjeldende sløyfen til alarm() - det er dette som vil bli kalt hvis alarmen er utløst.
void alarm () {farge (255,0,0); // rød forsinkelse (100); farge (255,255,0); // gul forsinkelse (100); }
Nå oppretter en ny Løkke() funksjon, en der vi henter en ny ping, leser resultatene og utløser alarmen hvis noe blir oppdaget innenfor målerområdet.
void loop () {if (trigget == true) {alarm (); } annet {forsinkelse (50); // Vent 50 ms mellom pings (ca. 20 pings / sek). 29 ms skal være den korteste forsinkelsen mellom pings. usignert int u = sonar.ping (); // Send ping, få pingtid i mikrosekunder (uS). usignert int-distanse = uS / US_ROUNDTRIP_CM; Serial.println (avstand); if (avstand <100) {utløst = sant; } } }
La meg forklare koden kort:
- Begynn med å sjekke for å se om alarmen er utløst, og i tilfelle, slå av alarmfunksjonen (bare blinker lysene for øyeblikket).
- Hvis den ikke er utløst ennå, kan du få den gjeldende lesningen fra sensoren.
- Hvis sensoren leser <100 cm, har noe polstret strålen (juster denne verdien hvis den utløses for tidlig for deg, tydeligvis).
Gi den en prøvekjøring nå, før vi legger til den irriterende piezo-summeren.
Arbeider? Flott. La oss legge til summeren tilbake. Legg til pinMode til setup () rutine.
pinMode (ALARM, UTGANG);
Legg deretter til piezo summer-loop til alarm () -funksjonen:
for (int x = 0; x <180; x ++) {// konvertere grader til radianer og oppnå deretter syndeverdi sinVal = (sin (x * (3.1412 / 180))); // generere en frekvens fra syndsverdien toneVal = 2000+ (int (sinVal * 1000)); tone (ALARM, toneVal); }
Hvis du prøver å samle på dette tidspunktet, vil du få en feil - jeg har overlatt dette bevisst slik at du kan se noen vanlige problemer. I dette tilfellet bruker både NewPing og standardtone-biblioteket de samme avbrytelsene - de er i konflikt i utgangspunktet, og det er ikke mye du kan gjøre for å fikse det. Å kjære.
Ingen bekymringer. Det er et vanlig problem, og noen har en løsning allerede - last ned og legg til dette Newtone til mappen Arduino Libraries. Juster begynnelsen på programmet slik at det inkluderer dette:
#inkludere
Og juster linjen:
tone (ALARM, toneVal);
til
NewTone (ALARM, toneVal);
i stedet.
Det er det. Still alarmen opp i døren til soverommet ditt for neste uheldige innbruddstyv.
Eller, en dopete hund, som virket fullstendig ukjent av alarmen.
Har du problemer med koden? Her er komplett app. Hvis du får tilfeldige feil, kan du prøve å lime dem inn nedenfor, så ser jeg om jeg kan hjelpe.
Bildekreditt: Brannalarm via Flickr
James har en BSc i kunstig intelligens, og er CompTIA A + og Network + sertifisert. Han er hovedutvikler av MakeUseOf, og bruker fritiden sin på å spille VR paintball og brettspill. Han har bygd pc-er siden han var liten.