Annonse
Mennesker er naturlig nok programmert til å våkne opp med soloppgangen; Dessverre er det moderne livet diktert av en vilkårlig klokke, som ofte tvinger oss til å våkne når det ikke er naturlig lys. I dag lager vi en soloppgang vekkerklokke, som forsiktig og sakte vil vekke deg uten å ty til en støtende støydempende maskin.
Hvis det å lage en soloppgang vekkerklokke er litt for mye for deg, kan du sjekke ut disse iPhone og Android-apper Bruk disse appene for å hjelpe deg med å sove bedre [Android og iOS]Etter en hektisk dag er det beste du kan gjøre å få en gunstig søvnmengde. Det dukker alltid opp nye studier som beviser hvor viktig søvn virkelig er for en person, forbedrer ... Les mer som oppdager når det er best å vekke deg av kroppsbevegelser Kan en app virkelig hjelpe deg med å sove bedre?Jeg har alltid vært litt av en søvneksperiment, og har i store deler av livet holdt en grundig drømdagbok og studert så mye jeg kunne om å sove i prosessen. Det er en ... Les mer , og sørg for at du ikke blir dratt bort fra den kjempeflotte drømmen, men i stedet, våk opp og føl deg lys og forfrisket - de fungerer virkelig.
Prosjektoversikt
Hoveddelen av prosjektet vil være rundt 5 meter LED-stripelys lagt rundt sengen. Vi får strøm med en ekstern 12 volt strømforsyning, byttet ved hjelp av noen MOSFET N-transistorer. Oppsettet for denne delen vil være identisk med dynamisk belysningssystem 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 Jeg bygde før.
Tidspunktet vil være et problem - siden dette er en prototype, setter jeg Arduino til å telle ned fra hver gang den tilbakestilles. I teorien skulle vi bare miste et sekund eller to hver dag, men ideelt sett vil vi ta med en "sanntids klokke" -brikke for å gjøre dette mer pålitelig. Soloppgangsalarmen vil starte 30 minutter før oppvåkningstid, og øke sakte nivået til det er på 100% lysstyrke - Dette bør være nok til å vekke oss, selv om det er en god ide å fortsette å bruke din vanlige vekkerklokke til kroppen din er vant til den.
Jeg vil også innlemme et nattlys i dette prosjektet, som oppdager bevegelse og aktiverer et diskret lavt nivå lys under sengen med en 3 minutters time-out, atskilt fra LED-lysene da de ville fått både min kone og jeg til å våkne opp. Belysningen under sengen vil være en kommersiell strømnettet, så jeg vil ha et relé inne i en stikkontakt for å slå den av og på. Hvis du ikke er komfortabel med å jobbe med nettstrøm fra 110-240v AC under noen omstendigheter (og det er generelt en god regel å ha), og tråd deretter opp en 433 MHz trådløs sender med bryteruttak, som beskrevet på Raspberry Pi Arduino hjemmeautomatiseringsprosjekt Hjemmeautomatiseringsguide med bringebær Pi og ArduinoHjemmeautomatiseringsmarkedet er oversvømmet av dyre forbrukssystemer, uforenlige med hverandre og kostbare å 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 stripelys
- 12 volt strømforsyning
- 3 x MOSFET N-transistorer (jeg bruker type STP16NF06FP)
- Relé- og stikkontakt, eller trådløse kontrollerte stikkontakter og passende sender
- Ditt valg av nattlys (vanlig strøm drevet med plugg er greit)
- PIR bevegelsessensor (HC-SR501), eller en SC-04 ekkolodd (ikke så effektiv)
- Lyssensor
- Prosjektkode - men les videre for å sikre at du forstår hvordan du kan tilpasse alt.
Her er det komplette skjemaet.
Kabling opp et stafett
Merk: Hopp over dette avsnittet hvis du også vil bruke RGB-lysene som nattlys - dette er spesielt for å slå på et separat strømdrevet lys.
For å skifte strøm, må reléet være vurdert 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 butikken min) er 250VAC / 10A, så vi skal være trygge. Reléer har en com port, vanligvis i sentrum, som skal kobles til strømføringen som kommer inn i pluggen; koble deretter kontakten til stikkontakten til NEI (normalt åpent). Jeg skulle ikke være nødt til å fortelle deg om ikke å gjøre dette når det er koblet til et stikkontakt, eller så kommer du til å dø. Hvis du er redd for å rote med nettstrøm, kan du bruke trådløse svitsjede stikkontakter i stedet.
Jord- og nøytralkablene skal gå rett til kontakten og vil ikke berøre reléet. Det er ikke sikkert at du har en jordstrekning i USA. Det er ditt ansvar å vite fargekodingen av ledninger i ditt lokale område - Hvis du ikke ellers kunne koble en vanlig stikkontakt i hjemmet eller koble til en støpsel, ikke prøv å legge inn et stafett i et!
For å teste, koble reléets signalpinne til 12, og kjør deretter et enkelt blinkprogram som er endret for å fungere på pinne 12, ikke 13 som standard. Stikkontakten skal slå seg av og på med noen få sekunder. Årsaken til at jeg ikke bruker pinne 13 er fordi LED-en ombord under opplastingsprosessen skyter raskt opp for å indikere seriell aktivitet, noe som vil føre til at reléet også aktiveres.
Å få timingen riktig
Tid- og klokkefunksjoner er vanskelige uten tilgang til en nettverkstilkobling eller dedikert Realtime Clock (Disse inkluderer egne batterier for å holde klokken i gang selv når hoved Arduino ikke har strøm). For å holde kostnadene lave, kommer jeg til å jukse. Jeg vil kode hardt for en starttid for Arduino å begynne nedtellingen; timing vil derfor være relativt til denne starttiden. Hver døgn tilbakestilles klokken. Klokkefunksjonskoden nedenfor sørger for at de globale variablene currentMillis og currentMinutes har rett hver dag. Arduino bør ikke miste mer enn noen få sekunder hver 45 dag; Imidlertid er denne hardkodede timingen stil ganske begrenset ved at strømbrudd eller utilsiktet tilbakestilling vil ødelegge alt, så dette er absolutt et område som kan forbedres. Hvis timingen ikke er synkronisert, bare tilbakestill Arduino til den angitte starttiden.
Koden skal være lett å forstå.
void ur () {if (millis ()> = forrigeMillis + 86400000) {// en hel dag har gått, tilbakestill klokken; forrigeMillis + = 86400000; } currentMillis = millis () - forrigeMillis; // dette holder vår nåværendeMillis den samme hver dag currentMinutes = (currentMillis / 1000) / 60; }
Nattlysfunksjon
Jeg har skilt ut hovedløkkene i forskjellige funksjoner, slik at det er lettere å lese og fjerne eller justere. De nattlys() -funksjonen fungerer bare mellom timene da Arduino ble tilbakestilt (jeg antar at du sannsynligvis vil gjøre dette på eller rundt leggetid, når det er mørkt), og til soloppgangsalarmen skal begynne. Jeg hadde først prøvd å bruke en lysavhengig motstand, men de er ikke veldig følsomme for blått lys (som tilfeldigvis er fargen jeg bruker til nattlyset), og vanskelig å kalibrere riktig. Å bruke klokken er uansett mer fornuftig. Vi bruker det globale currentMinutes variabel, som blir tilbakestilt hver dag.
PIR-sensoren kan være litt finurlig hvis du aldri har brukt en før, selv om det ikke er vanskelig å koble den opp - vil du finne VCC, GND, og UTE tydelig merket på baksiden. Det er to variable motstander også; den ene merkede RX bestemmer rekkevidde (opp til ca. 7m), og en annen merket TX bestemmer forsinkelse. Forsinkelsen er 5 sekunder ved den laveste innstillingen (helt mot klokken), og betyr at enhver øyeblikkelig bevegelse vil utløse minst 5 sekunder “på” -tilstand fra sensoren. Imidlertid bestemmer det også forsinkelsen mellom aktive tilstander - så hvis det går 5 sekunder og ingen bevegelse er registrert, vil sensoren sende et lavt signal i minst 5 sekunder, selv om det er bevegelse i løpet av det periode. Hvis du har satt forsinkelsen veldig høyt rundt 30 sekunder, kan det se ut som sensoren er ødelagt.
Hvis du sover alene og ikke har noe imot å bruke de samme RGB-stripelysene for både soloppgangsalarmen og nattlyset, bør du kunne justere koden lett nok.
ugyldig nattlys () {// Arbeid bare mellom tilbakestillings timer -> soloppgang. if (currentMinutes
Soloppgangsalarm
For enkelhets skyld bruker jeg RGB-fargeverdien 255,255,0 til en dyp gul soloppgang - på denne måten vil økningen på begge fargekanalene være den samme. Hvis du synes det er å vekke deg for tidlig, kan du vurdere å begynne med en dyp rød og falme mot gult eller hvitt. Rampen opp har jeg brukt på bare lineær måte - det kan være lurt å undersøke å bruke en mer naturlig kurve for lysstyrkeverdier.
Funksjonen er enkel - den regner ut hvor mye lyset skal økes av hvert sekund, så det er i full lysstyrke etter en periode på 30 minutter; multipliserer seg så at med hvor mange sekunder det nå er i soloppgangen. Hvis den allerede er i full lysstyrke, holder den på i ytterligere 10 minutter for å sikre at du er oppe (og hvis du fremdeles ikke er oppe, bør du sannsynligvis ha en sikkerhetskopi-alarm på plass).
void sunrisealarm () {// hvert sekund i løpet av 30 minite-perioden skal øke fargeverdien med: float inkrement = (float) 255 / (30 * 60); // rød 255, grønn 255 gir oss full lysstyrke gul hvis (currentMinutes> = minutesUntilSunrise) {// soloppgang begynner! float currentVal = (float) ((currentMillis / 1000) - (minutesUntilSunrise * 60)) * økning; Serial.print ("Nåværende verdi for soloppgang:"); Serial.println (currentVal); // under rampen opp, skriv nåverdien på minutter X lysstyrkeøkning hvis (strømVal <255) {analogWrite (RØD, strømVal); analogWrite (GRØNN, strømVal); } annet hvis (currentMinutes - minutesUntilSunrise <40) {// når vi er i full lysstyrke, hold lysene på i 10 minutter lenger analogWrite (RED, 255); analogWrite (GRØNN, 255); } annet {// etter det, kaster vi dem tilbake til off-state analogWrite (RED, 0); analogWrite (GRØNT, 0); } } }
Fallgruver og fremtidige oppgraderinger
Jeg har brukt dette de siste ukene nå, og det hjelper virkelig å våkne opp og føle meg mer uthvilt og på et anstendig tidspunkt; nattlyset fungerer veldig bra også. Det er ikke perfekt, så her er noen få ting som trenger arbeid og lærdom under bygging.
Mens jeg laget dette prosjektet, møtte jeg mange problemer med å håndtere store tall, så hvis du planlegger å endre koden, husk dette. På C språk, det er veldig viktig å skrive inn variablene dine - et tall er ikke alltid bare et tall. For eksempel, usignert lenge variabler bør 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, lese opp variabeltypene dine når du bruker store tall, og hvis du finner rare feil, er det sannsynligvis fordi en av variablene dine ikke har nok biter!
Jeg har også funnet et problem med veldig lav lysstyrke spenningslekkasjer - noe som fører til at den minste mengden lys blir avgitt, selv når en digitalWrite (RØD, 0) signalet sendes ut - jeg tror ikke det er maskinvareproblem med stripene siden de fungerer fint med de offisielle kontrollerne. Hvis noen kan løse dette problemet, bildet nedenfor, ville jeg være veldig takknemlig. Jeg har prøvd å trekke ned motstander og begrense utgangsspenningen fra Arduino-pinnene. Det kan hende jeg må legge til en enkel strømbryterkrets for bare å levere spenning til LED-stripen når det faktisk trengs; eller det kan være defekte MOSFET-er.
For fremtidig arbeid håper jeg å legge til en IR-mottaker og duplisere noen av funksjonene til den originale kontrolleren - kl minst muligheten til å endre farger som et generelt lys, da akkurat nå dette prosjektet gjør stripen til en dedikert natt lys. Jeg kan til og med legge til en automatisk timeout-funksjon på 30 minutter.
Har du prøvd dette, gjort forbedringer eller fått andre ideer? Gi meg beskjed i kommentarene!
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.