Hvordan lage et enkelt Arduino alarmsystem
Oppdag bevegelse, så skrem deg av en inntrenger med høylydede alarmlyder og blinkende lys. Lyder det morsomt? Selvfølgelig gjør det det. Det er målet for dagens Arduino-prosjekt, egnet for nybegynnere. Vi skal skrive helt fra bunnen av og prøve når vi går sammen, så du kan forhåpentligvis få en ide om hvordan alt blir gjort i stedet for å bare installere noe jeg allerede har gjort.
Ansvarsfraskrivelse: Dette kommer ikke til å faktisk beskytte huset ditt. Den kanskje gi søsteren et stygg sjokk når hun sniker seg inn i rommet ditt skjønt.
Du vil trenge:
- En Arduino
- ultralyd “ping” sensor, jeg bruker HC-SR04 En PIR ville være bedre, men de er dyre. En ping sensor kan plasseres surreptitiously i en døråpning og fortsatt tjene den samme grunnleggende jobben, og er bare $ 5
- En piezo summer
- LED strip lys med samme ledninger vi brukte tilbake i dette prosjektet Bygg din egen dynamiske omgivende belysning for et mediesenter Bygg din egen dynamiske omgivelsesbelysning for et mediesenter Hvis du ser mange filmer på PC eller mediasenter, Jeg er sikker på at du har møtt lysdilemmaet; slår du helt av alle lysene? Holder du dem på full blast? Eller ... Les mer .
Når du kobler opp dette prosjektet, må du ikke fjerne alt hver gang - bare fortsett å bygge på den siste blokken. Når du kommer til “Koding alarmsystemet” delen, bør du ha alle biter og biter koblet opp, ser noe ut som dette:
Blinkende lys
Bruk ledningsdiagrammet fra dette prosjektet. Bygg din egen dynamiske omgivelsesbelysning for et mediasenter. Bygg din egen dynamiske omgivelsesbelysning for et mediesenter. Hvis du ser mange filmer på PC eller mediasenter, er du sikker på at du har møtt belysning dilemma; slår du helt av alle lysene? Holder du dem på full blast? Eller ... Les mer for å koble din LED stripe; Ikke bytt pinnene, da vi trenger PWM-utgang. Bruk denne koden til å teste kablingene dine raskt. Hvis alt går bra, bør du ha dette:
Avstandssensor
På SR04-modulen finner du 4 pins. VCC og GND Gå til + 5V skinne og bakken henholdsvis; TRIG er pinnen brukt til å sende et sonarsignal, sett dette på pinne 6; EKKO brukes til å lese signalet tilbake (og derfor beregne avstanden) - sett dette på 7.
For å gjøre ting utrolig enkelt, er det et bibliotek vi kan bruke som heter NewPing. Last ned og plasser i Arduino s Bibliotek mappe og start IDE før du fortsetter. Test med denne koden; åpne seriell skjerm og sørg for at hastigheten er satt til 115200 baud. Med noen hell, bør du se noen avstandsmålinger som sendes tilbake til deg med ganske høy hastighet. Du kan finne en varianse på 1 eller 2 centimeter, men dette er greit. Prøv å løpe hånden foran sensoren, flytte den opp og ned for å observere de endrede avlesningene.
Koden skal være ganske enkelt å forstå. Det er noen få erklæringer om relevante pinner i starten, inkludert maksimal avstand - dette kan variere i henhold til den nøyaktige sensoren du har, men så lenge du klarer å få mindre enn 1 meter avlesning nøyaktig, bør du ha det bra.
I løpet av denne testappen bruker vi ping () Fungerer for å sende ut en sonarping, og får tilbake en verdi i millisekunder av hvor lang tid det tok for verdien å returnere. For å forstå dette, bruker vi NewPing-bibliotekene bygget i konstant av US_ROUNDTRIP_CM, som definerer hvor mange mikrosekunder det tar å gå en enkelt centimeter. Det er også en 50 ms forsinkelse mellom pings for å unngå overbelastning av sensoren.
Piezo Alarm
Piezo krystall-sensoren er en enkel og billig summer, og vi kan bruke en PWM pin 3 for å lage forskjellige toner. Koble en ledning til pin 3, en til jordskinne - det spiller ingen rolle hvilken.
Bruk denne koden til å teste.
Den eneste måten å drepe den ganske ubehagelige og høye alarmen er å trekke støpselene. Koden er litt kompleks å forklare, men det innebærer å bruke sinusbølger til å generere en særegen lyd. Tweak tallene for å spille med forskjellige toner.
Koding alarmsystemet
Nå som vi har alle brikkene i dette puslespillet, la oss kombinere dem sammen.
Gå videre og lage en ny skisse, kalt Alarm. Begynn med å kombinere alle variablene og pindefinisjonene vi har i testeksemplene til nå.
#inkludere // Velg hvilke PWM-kompatible pinner som skal brukes. #define RED_PIN 10 #define GREEN_PIN 11 #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino pin festet til utløserkniv på ultralydssensoren. #define ECHO_PIN 7 // Arduino pin festet til ekko pin på ultralydssensoren. #define MAX_DISTANCE 100 // Maksimal avstand vi vil pinge for (i centimeter). #define ALARM 3 float sinVal; int toneVal;
Begynn med å skrive en grunnleggende setup () funksjon - vi skal bare håndtere lysene for nå. Jeg har lagt til en 5 sekunders forsinkelse før hovedløkken er begynt å gi oss litt tid til å komme seg ut av veien hvis det er nødvendig.
tomt oppsett () // sett pinModes for RGB strip pinMode (RED_PIN, OUTPUT); pinMode (BLUE_PIN, OUTPUT); pinMode (GREEN_PIN, OUTPUT); // Tilbakestill lys analogWrite (RED_PIN, 0); analog (BLUE_PIN, 0); analog (RED_PIN, 0); forsinkelse (5000);
La oss bruke en hjelperfunksjon som gjør at vi raskt kan skrive en enkelt RGB-verdi ut til lysene.
// hjelpefunksjon slik at vi kan sende en farge i en kommandoen tomt farge (usignert karbon rød, usignert karbongrønn, usignert karbonblå) // fargegenererende funksjon analogWrite (RED_PIN, rød); analog skriv (BLUE_PIN, blå); analog skriv (GREEN_PIN, grønn);
Endelig vil vår sløyfe for tiden bestå av en enkel fargelampe mellom rød og gul (eller hva du vil at alarmen skal være - bare endre RGB-verdiene).
tomromsløyfe () 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 spor.
La oss nå integrere avstandssensoren for å utløse disse lysene bare når noe kommer inn, si 50 cm (bare mindre enn bredden på en dørramme). Vi har allerede definert de riktige pinnene og importert biblioteket, så før din setup () funksjon legge til følgende linje for å instantiere den:
NewPing sonar (TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing oppsett av pinner og maksimal avstand.
Under det, legg til en variabel for å lagre tilstanden til alarmen som utløses eller ikke, for å mislykkes, selvfølgelig.
boolsk utløst = false;
Legg til en linje til setup () fungere slik at vi kan overvåke utgangen på seriell og feilsøking.
Serial.begin (115,200); // Åpne seriell skjerm ved 115200 baud for å se pingresultatene.
Deretter la oss omdøpe den nåværende sløyfen til alarm() - Dette er hva som skal ringes hvis alarmen er utløst.
ugyldig alarm () farge (255,0,0); // rød forsinkelse (100); farge (255,255,0); // yelow forsinkelse (100);
Opprett nå en ny løkke () funksjon, en der vi henter en ny ping, leser resultatene og utløser alarmen hvis det oppdages noe innenfor måleområdet.
void loop () if (utløst == true) alarm (); ellers forsinkelse (50); // Vent 50ms mellom pings (ca. 20 pings / sek). 29ms skal være den korteste forsinkelsen mellom pings. usignert int uS = sonar.ping (); // Send ping, få ping tid i microseconds (uS). usignert int avstand = uS / US_ROUNDTRIP_CM; Serial.println (avstand); if (avstand < 100) triggered = true;
La meg forklare koden kort:
- Start med å sjekke for å se om alarmen har blitt utløst, og i så fall brann av alarmfunksjonen (bare blinker lysene for øyeblikket).
- Hvis den ikke utløses ennå, få den nåværende lesingen fra sensoren.
- Hvis sensoren leser <100 cm, something has padded the beam (adjust this value if it's triggering too early for you, obviously).
Gi det en prøvekjøring nå, før vi legger til den irriterende piezo-buzeren.
Arbeider? Flott. La oss legge til den summen tilbake. Legg til pinMode til setup () rutine.
pinMode (ALARM, OUTPUT);
Deretter legger du piezo summer-sløyfen til alarmen () -funksjonen:
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);
Hvis du prøver å kompilere på dette punktet, kommer du til å løpe inn i en feil - jeg har etterlatt dette med vilje, slik at du kan se noen vanlige problemer. I dette tilfellet bruker både NewPing- og standardtonebiblioteket de samme forstyrrelsene - de er i motsetning i utgangspunktet, og det er ikke mye du kan gjøre for å fikse det. Åh kjære.
Ingen bekymringer skjønt. Det er et vanlig problem, og noen har allerede en løsning - last ned og legg til denne NewTone i mappen Arduino Libraries. Juster begynnelsen på programmet ditt for å inkludere dette:
#inkludere
Og juster linjen:
tone (ALARM, toneVal);
til
NewTone (ALARM, toneVal);
i stedet.
Det er det. Still inn alarmen din i døråpningen på soverommet ditt til neste, uhøflig, ville-være innbruddstyv.
Eller en dopey hund, som virket helt unfazed av alarmen.
Har du problemer med koden? Her er den komplette appen. Hvis du får tilfeldige feil, kan du prøve å lim inn dem under og jeg vil se om jeg kan hjelpe.
Bildetekst: Brannalarm via Flickr
Utforsk mer om: Arduino.