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, 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. Det kan gi søsteren din en 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 omgivende belysning 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 av alarmsystemet" -delen, bør du ha alle biter og biter koblet opp, ser noe slik ut:
Blinkende lys
Bruk ledningsdiagrammet fra dette prosjektet. Bygg din egen dynamiske omgivelsesbelysning for et mediasenter. Bygg din egen dynamiske omgivelsesbelysning for et mediasenter. 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år til + 5V skinne og bakken henholdsvis; TRIG er pinnen som brukes til å sende et sonarsignal, sett dette på pinne 6; ECHO er vant 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 Library- 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 sendes tilbake til deg med en ganske høy fart. 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 en 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 funksjonen ping () til å 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å.
#include // Select which PWM-capable pins are to be used. #define RED_PIN 10 #define GREEN_PIN 11 #define BLUE_PIN 9 #define TRIGGER_PIN 6 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN 7 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE 100 // Maximum distance we want to ping for (in centimeters). #define ALARM 3 float sinVal; int toneVal;
Begynn med å skrive en grunnleggende oppsett () -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.
void setup(){ //set pinModes for RGB strip pinMode(RED_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); //reset lights analogWrite(RED_PIN, 0); analogWrite(BLUE_PIN, 0); analogWrite(RED_PIN, 0); delay(5000); }
La oss bruke en hjelperfunksjon som gjør at vi raskt kan skrive en enkelt RGB-verdi ut til lysene.
//helper function enabling us to send a colour in one command void color (unsigned char red, unsigned char green, unsigned char blue) // the color generating function { analogWrite(RED_PIN, red); analogWrite(BLUE_PIN, blue); analogWrite(GREEN_PIN, green); }
Endelig vil vår sløyfe for nå bestå av en enkel fargelampe mellom rød og gul (eller hva du vil at alarmen skal være - bare endre RGB-verdiene).
void loop(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yellow delay(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 oppsettet () -funksjonen legger du til følgende linje for å ordne det:
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
Under det, legg til en variabel for å lagre tilstanden til alarmen som utløses eller ikke, for å mislykkes, selvfølgelig.
boolean triggered = false;
Legg til en linje i oppsettet () -funksjonen, slik at vi kan overvåke utgangen på seriell og feilsøking.
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
Deretter la vi omdøpe den nåværende sløyfen til alarm () - dette er hva som skal ringes hvis alarmen er utløst.
void alarm(){ color(255, 0, 0); //red delay(100); color(255, 255, 0); //yelow delay(100); }
Opprett nå en ny sløyfe () -funksjon, en der vi henter en ny ping, les resultatene og utløs alarmen dersom det oppdages noe innenfor måleområdet.
void loop(){ if(triggered == true){ alarm(); } else{ delay(50);// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings. unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS). unsigned int distance = uS / US_ROUNDTRIP_CM; Serial.println(distance); if(distance< 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, har noe polstret strålen (juster denne verdien hvis den utløses for tidlig for deg selvsagt).
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 i oppsettet () -rutinen.
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:
#include
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