Arduino nattlys og soloppgang alarmprosjekt
Mennesker er naturligvis programmert for å våkne opp med soloppgangen; Dessverre er det moderne livet diktert av en vilkårlig klokke som ofte tvinger oss til å våkne opp når det ikke er noe naturlig lys. I dag skal vi lage en soloppgangsvekkerklokke, som forsiktig og sakte vekker deg uten å benytte seg av en støtende støynivåmaskin.
Hvis du gjør en soloppgangsvekkerklokke, er det litt for mye for deg, sjekk ut disse iPhone- og Android-appene. Bruk disse appene for å hjelpe deg med å sove bedre. [Android og iOS] Bruk disse appene for å hjelpe deg med å sove bedre. [Android og iOS] Etter en hektisk dag, det beste du kan gjøre er å få en god mengde søvn. Det er alltid nye studier som viser at viktig søvn er virkelig for en person, og forbedrer ... Les mer som oppdager når det er best å vekke deg ved kroppsbevegelser Kan en app virkelig hjelpe deg med å sove bedre? Kan en app virkelig hjelpe deg med å sove bedre? Jeg har alltid vært litt søvnprodusent, og har for mye av livet holdt en grundig drømdagbok og studert så mye jeg kunne om å sove i prosessen. Det er en ... Les mer, sørg for at du ikke blir trukket bort fra den fantastiske drømmen, men i stedet, våkner du lyst og forfrisket - de jobber virkelig.
Prosjektbeskrivelse
Hoveddelen av prosjektet vil være noen 5 meter LED stripe lys lagt rundt sengen. Vi driver disse med en ekstern 12 volt forsyning, byttet med noen MOSFET N transistorer. Oppsettet for denne delen vil være identisk med det dynamiske belysningssystemet. Bygg din egen dynamiske omgivende belysning for et mediasenter. Bygg din egen dynamiske omgivelsesbelysning for et mediasenter. Hvis du ser mange filmer på PC eller mediasenter, er jeg sikker på at du har møtt lysproblemet; slår du helt av alle lysene? Holder du dem på full blast? Eller ... Les mer Jeg bygget før.
Timing vil være et problem - siden dette er en prototype, vil jeg sette Arduino å telle ned fra når den er tilbakestilt. I teorien skal vi bare miste et sekund eller to hver dag, men ideelt sett vil vi inkludere en “sanntidsklokke” chip for å gjøre dette mer pålitelig. Soloppgangslarmet starter 30 minutter før oppbremsingstid og øker utgangsnivået sakte til det er 100% lysstyrke - dette bør være nok til å vekke oss opp, men det er en god ide å fortsette å bruke vanlig vekkerklokke til kroppen din er vant til det.
Jeg vil også inkorporere et nattlys inn i dette prosjektet, som oppdager bevegelse og aktiverer et diskret lavnivålys under sengen med en 3 minutters timeout, skilt til LED-lampene som det ville føre til at både min kone og jeg våkner . Underbelysningen vil være en kommersiell nettverksenhet, så jeg hakker et relé i en stikkontakt for å slå på og av. Hvis du ikke er komfortabel med å arbeide med 110-240v AC strømnettet under noen omstendigheter (og det er vanligvis en god regel å ha), så koble til en 433 MHz trådløs sender med byttekontakter, som beskrevet på Raspberry Pi Arduino-hjemmevirksomhetsprosjektet Hjemmautomatiseringsguide med Hempebær Pi og Arduino Hjemmautomatiseringsguide Med Raspberry Pi og Arduino Hjemmautomatiseringsmarkedet er oversvømmet med dyre forbrukersystemer, inkompatible med hverandre og kostbart å installere. Hvis du har en Raspberry Pi og en Arduino, kan du i utgangspunktet oppnå det samme ved ... Les mer .
Deleliste og skjematisk
- Arduino
- Sett med RGB LED strip lys
- 12 volt strømforsyning
- 3 x MOSFET N transistorer (jeg bruker type STP16NF06FP)
- Relé og stikkontakt, eller trådløse kontrollerte kontakter og egnet sender
- Ditt valg av nattlys (vanlig strømforsyning med støpselet er greit)
- PIR bevegelsesføler (HC-SR501), eller en SC-04 sonar (ikke så effektiv)
- Lyssensor
- Prosjektkode - men les videre for å sikre at du forstår hvordan du tilpasser alt.
Her er komplett skjematisk.
Tilkobling av et relé
Merk: Hopp over denne delen hvis du vil bruke RGB-lampene som nattlys også - dette er spesielt for å slå på et separat strømdrevet lys.
For å slå på strømmen må reléet ditt kreves for spenning - 110V eller 240V AC avhengig av hvor du bor - og mer enn den totale strømstyrken du vil bytte. Den jeg har brukt fra denne sensorpakken (ansvarsfraskrivelse: det er min butikk) er 250VAC / 10A, så vi burde være trygge. Reléer har a com port, vanligvis i senteret, som skal kobles til levende ledning som kommer inn i stikkontakten; Koble deretter stikkontakten til stikkontakten til NEI (normalt åpen). Jeg burde ikke fortelle deg at du ikke skal gjøre dette, det er plugget i et stikkontakt, eller du skal dø. Hvis du er redd for å snakke med strømnettet, må du bruke trådløse strømuttak i stedet.
Jord- og nøytrale kabler skal gå rett til stikkontakten og vil ikke berøre reléet. Du kan ikke ha en jordlinje i USA. Det er ditt ansvar å vite fargekodingen av ledninger i ditt lokale område - hvis du ikke ellers kan koble en vanlig stikkontakt i hjemmet ditt eller rewire en plugg, ikke prøv å legge inn et relé i en!
For å teste, led reléssignalpinnen til 12, og kjør deretter et enkelt blinkprogram som er modifisert for å fungere på pin 12, ikke 13 som standard. Stikkontakten din skal slå på og av hvert par sekunder. Grunnen til at jeg ikke bruker pin 13 er at under oppladningsprosessen brenner den innebygde LED-en i rask rekkefølge for å indikere seriell aktivitet, noe som vil føre til at reléet også aktiveres.
Få timing rett
Timing og klokke funksjoner er vanskelige uten tilgang til en nettverkstilkobling eller dedikert Realtime Clock (disse inkluderer egne batterier for å holde klokken på gang selv når de viktigste Arduino har ingen strøm). For å holde kostnadene lave, kommer jeg til å jukse. Jeg vil være hardcoding en starttid for Arduino å begynne det nedtelling; Tidspunkter vil derfor være i forhold til denne starttiden. Hver 24 timer vil klokken nullstilles. Klokkefunksjonskoden nedenfor sørger for de globale variablene currentMillis og currentMinutes er korrekte hver dag. Arduino bør ikke miste mer enn noen få sekunder hver 45 dag; Imidlertid er denne hardkodede stilen for timing ganske begrenset, fordi et strømbrudd eller en uavhengig tilbakestilling vil ødelegge alt, så dette er sikkert et område som kan forbedres. Hvis timing ikke går ut av synkronisering, kan du bare tilbakestille Arduino ved starttidspunktet.
Koden skal være lett å forstå.
ugyldig klokke () hvis (millis ()> = tidligereMillis + 86400000) // en hel dag er gått, nullstill klokken; forrigeMillis + = 86400000; currentMillis = millis () - forrigeMillis; // dette holder vår nåværendeMillis den samme hver dag currentMinutes = (currentMillis / 1000) / 60;
Nattlys Funksjon
Jeg har separert hovedløkkene i forskjellige funksjoner, slik at det er lettere å lese og fjerne eller justere. De nattlys() funksjonen virker bare mellom timene når Arduino ble tilbakestilt (jeg antar at du sannsynligvis vil gjøre dette på eller rundt sengetid, når det er mørkt), og til soloppgangslarmet skal begynne. Jeg hadde i utgangspunktet forsøkt å bruke en lysavhengig motstand, men de er ikke veldig følsomme for blått lys (som skjer med fargen jeg bruker for nattlyset), og vanskelig å kalibrere til høyre. Å bruke klokken er fornuftig, uansett. Vi bruker den globale currentMinutes variabel, som blir tilbakestilt hver dag.
PIR-sensoren kan være litt quirky hvis du aldri har brukt den før, selv om det ikke er vanskelig å koble det opp, vil du finne VCC, GND, og UTE klart merket på baksiden. Det er to variable motstander du også; den ene merkede RX bestemmer området (opptil ca 7m), og en annen merket TX bestemmer forsinkelsen. Forsinkelsen er 5 sekunder ved den laveste innstillingen (helt mot klokken), og betyr at en kortvarig bevegelse vil utløse minst 5 sekunder med “på” Meld fra sensoren. Det bestemmer imidlertid også forsinkelsen mellom aktive tilstander - så hvis det går 5 sekunder og ingen bevegelse oppdages, sender sensoren et lavt signal i minst 5 sekunder, selv om det er bevegelse i løpet av denne perioden. Hvis du har forsinkelsen satt veldig høy på rundt 30 sekunder, kan det virke som at sensoren er ødelagt.
Hvis du sover alene og ikke har noe imot å bruke samme RGB-stripelys for både soloppgangalarm og nattlys, bør du kunne justere koden lett nok.
ugyldig nattlys () // Kun arbeid mellom timer for tilbakestilling -> soloppgang. if (currentMinutes < minutesUntilSunrise) if(digitalRead(trigger) == 1) nightLightTimeOff = millis()+nightLightTimeOut; // activate, or extend the time until turning off the light Serial.println("Activating nightlight"); //Turn light on if needed if(millis() < nightLightTimeOff) digitalWrite(nightLight,HIGH); else digitalWrite(nightLight,LOW);
Soloppgangslarm
For enkelhets skyld bruker jeg RGB-fargeværdien 255,255,0 for en dyp gul soloppgang - på denne måten blir inkrementet på begge fargekanaler det samme. Hvis du finner det våkner du for tidlig, bør du vurdere å begynne med en dyprød og falme mot gul eller hvit. Den rampen jeg har brukt i bare lineær - du vil kanskje undersøke å bruke en mer naturlig kurve for lysstyrkeverdier.
Funksjonen er enkel - det går ut hvor mye lyset skal økes med hvert sekund slik at det er fullt lysstyrke etter en periode på 30 minutter; da multipliserer det med mange sekunder det er for tiden i soloppgangen. Hvis den allerede er i full lysstyrke, forblir den i ytterligere 10 minutter for å være sikker på at du er oppe (og hvis du fortsatt ikke er oppe, bør du sannsynligvis ha en reservealarm på plass).
ugyldig soloppgangslarm () // hvert sekund i løpet av 30 minitiden bør øke fargeværdien ved å: flyte økning = (flyte) 255 / (30 * 60); // rød 255, grønn 255 gir oss full lysstyrke gul hvis (currentMinutes> = minutesUntilSunrise) // soloppgang begynner! float currentVal = (float) ((currentMillis / 1000) - (minutterUntilSunrise * 60)) * inkrement; Serial.print ("Nåværende verdi for soloppgang:"); Serial.println (currentVal); // under rampen opp, skriv gjeldende verdi av minutter X lysstyrkeøkning hvis (currentVal < 255) analogWrite(RED,currentVal); analogWrite(GREEN,currentVal); else if(currentMinutes - minutesUntilSunrise < 40) // once we're at full brightness, keep the lights on for 10 minutes longer analogWrite(RED,255); analogWrite(GREEN,255); else //after that, we're nuking them back to off state analogWrite(RED,0); analogWrite(GREEN,0);
Fallgruver og fremtidige oppgraderinger
Jeg har brukt dette de siste ukene nå, og det hjelper virkelig å våkne opp med å føle seg mer forfrisket og på en anstendig tid; nattlyset fungerer også veldig bra. Det er ikke perfekt skjønt, så her er noen ting som trenger arbeid og erfaringer under bygging.
Mens jeg gjorde dette prosjektet, møtte jeg mange problemer med å håndtere store tall, så hvis du planlegger å endre koden, vær så snill å huske på dette. På C-språk, den skrive av variablene dine er veldig viktig - et tall er ikke alltid bare et tall. For eksempel, usignert lenge variabler skal brukes til å lagre super store tall som vi håndterer når vi snakker om millisekunder, men selv et tall så lite som 60.000 kan ikke lagres som et vanlig heltall (et usignert int ville ha vært akseptabelt for opptil 68 000). Poenget er, les opp på variabeltypene dine når du bruker store tall, og hvis du finner merkelige feil, er det sannsynligvis fordi en av variablene dine ikke har nok biter!
Jeg har også funnet et problem med svært lav lysstyrke spenningslekkasje - noe som fører til at det minste lyset slippes ut selv når en digitalWrite (RØD, 0) signalet sendes ut - jeg tror ikke det er maskinvareproblem med strimlene siden de fungerer fint med de offisielle kontrollerne. Hvis noen kan løse dette problemet, vist nedenfor, ville jeg være mest takknemlig. Jeg har prøvd å trekke motstander, og begrense utgangsspenningen fra Arduino-pinnene. Jeg må kanskje legge til en enkel strømbryterkrets for å bare gi spenning til LED-stripen når det er nødvendig. eller det kan være feilmosfeter.
For fremtidig arbeid håper jeg å legge til i en IR-mottaker og kopiere noen av funksjonene til den opprinnelige kontrolleren - i det minste evnen til å endre farger som generell bruk, siden dette prosjektet gjør stripen til en dedikert natt lys. Jeg kan til og med legge til en automatisk 30 minutters timeout-funksjon.
Har du prøvd dette, gjort forbedringer, eller fått noen andre ideer? Gi meg beskjed i kommentarene!
Utforsk mer om: Arduino.