Arduino nattlys og soloppgang alarmprosjekt

I dag skal vi lage en soloppgangsvekkerklokke, som forsiktig og sakte vil vekke deg uten å benytte seg av en støtende støymaskin.

I dag skal vi lage en soloppgangsvekkerklokke, som forsiktig og sakte vil vekke deg uten å benytte seg av en støtende støymaskin.
Annonse

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 vil vekke deg uten å benytte seg av en støtende støymaskin.

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åkne opp følelsen 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 "real time clock" -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.

soloppgang-alarm-kretsen

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 eget strømdrevet lys.

For å slå på strømmen må reléet ditt vurdert til 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 bør være trygge. Reléer har en com- port, vanligvis i midten, som skal kobles til levende ledning som kommer inn i pluggen; Koble deretter stikkontakten til NO (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.

relé kabling

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 å kjenne fargekodingen av ledninger i ditt lokale område - hvis du ikke ellers kan koble til en vanlig kontakt i hjemmet ditt eller koble til en plugg, ikke prøv å legge inn et relé i ett!

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 klokkefunksjoner 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 ikke har 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 at 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 timingen ikke blir synkronisert, kan du bare tilbakestille Arduino ved starttidspunktet.

Koden skal være lett å forstå.

void clock(){ if(millis()>= previousMillis+86400000){ // a full day has elapsed, reset the clock; previousMillis +=86400000; } currentMillis = millis() - previousMillis; // this keeps our currentMillis the same each day currentMinutes = (currentMillis/1000)/60; } 

Nattlys Funksjon

Jeg har separert hovedløkkene i forskjellige funksjoner, slik at det er lettere å lese og fjerne eller justere. NightLight () -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- variabelen, som blir tilbakestilt hver dag.

PIR-sensoren kan være litt quirky hvis du aldri har brukt en før, men ledningen er ikke vanskelig - du finner VCC, GND og OUT tydelig 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å" -tilstand 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.

pir-sensor

Hvis du sover alene og ikke har noe imot å bruke de samme RGB-stripelysene for både soloppgangalarm og nattlys, bør du kunne justere koden lett nok.

 void nightlight(){ // Only work between the hours of reset ->sunrise. 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 dyp rø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 sikkert ha en reservealarm på plass).

 void sunrisealarm(){ //each second during the 30 minite period should increase the colour value by: float increment = (float) 255/(30*60); //red 255, green 255 gives us full brightness yellow if(currentMinutes>= minutesUntilSunrise){ //sunrise begins! float currentVal = (float)((currentMillis/1000) - (minutesUntilSunrise*60)) * increment; Serial.print("Current value for sunrise:"); Serial.println(currentVal); //during ramp up, write the current value of minutes X brightness increment if(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.

soloppgang-alarm

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. I C-språk er typingen av variablene svært viktig - et tall er ikke alltid bare et tall. For eksempel bør usignerte lange variabler 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 inntil 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 et signal fra digitalWrite (RED, 0) sendes ut - jeg tror ikke det er maskinvareproblem med strimlene siden de jobber 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.

lys-lekkasje

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!

In this article