Arduino Night Light och Sunrise Alarm Project

Idag kommer vi att göra en väckarklocka för soluppgång, som försiktigt och långsamt väcker dig utan att tillgripa en offensiv brusmaskin.

Idag kommer vi att göra en väckarklocka för soluppgång, som försiktigt och långsamt väcker dig utan att tillgripa en offensiv brusmaskin.
Annons

Människor är naturligt programmerade att vakna med soluppgången; Tyvärr är det moderna livet dikterat av en godtycklig klocka som ofta tvingar oss att vakna när det inte finns något naturligt ljus. Idag kommer vi att göra en väckarklocka för soluppgång, som försiktigt och långsamt väcker dig utan att tillgripa en offensiv brusmaskin.

Om du gör en soluppgång väckarklocka är lite för mycket för dig, kolla in dessa iPhone- och Android-appar. Använd dessa appar för att hjälpa dig att sova bättre [Android och iOS] Använd dessa appar för att hjälpa dig att sova bättre [Android & IOS] Efter en hektisk dag, det bästa du kan göra är att få en bra mängd sömn. Det finns alltid nya studier som visar att viktiga sömn verkligen är för en person, vilket förbättrar ... Läs mer som upptäcker när det är bäst att väcka dig genom kroppsrörelser Kan en app verkligen hjälpa dig att sova bättre? Kan en app verkligen hjälpa dig att sova bättre? Jag har alltid varit lite av en sömnstimulator, och har för mycket av mitt liv hållit en noggrann drömdagbok och studerat så mycket jag kunde om att sova i processen. Det finns en ... Läs mer, se till att du inte dras ifrån den fantastiska drömmen, men i stället vaknar du känner dig ljus och uppdaterad - de jobbar verkligen.

Projektbeskrivning

Huvuddelen av projektet kommer att vara ca 5 meter LED stripljus som ligger runt sängen. Vi kommer att driva dessa med en extern 12 volt-strömförsörjning, omkopplad med vissa MOSFET N-transistorer. Inställningen för denna del kommer att vara identisk med det dynamiska belysningssystemet. Bygg din egen dynamiska omgivande belysning för ett mediecenter. Bygg din egen dynamiska omgivande belysning för ett mediasenter. Om du tittar på många filmer på din dator eller mediasenter, är jag visst att du har mött belysningsdilemmet stänger du helt av alla ljus? Håller du dem på full blast? Eller ... Läs mer Jag byggde förut.

Timing kommer att vara ett problem - eftersom det här är en prototyp, kommer jag att ställa in Arduino att räkna ner från när det är återställt. I teorin borde vi bara förlora en sekund eller två varje dag, men helst skulle vi inkludera ett "real time clock" -chip för att göra det mer tillförlitligt. Soluppgångslarmet startar 30 minuter före vaknatiden och ökar långsamt utmatningsnivån till 100% ljusstyrka - det borde vara tillräckligt för att väcka oss, men det är en bra idé att fortsätta använda din vanliga väckarklocka tills din kropp är van vid det.

Jag kommer också att införliva ett nattljus i detta projekt, vilket upptäcker rörelse och aktiverar ett diskret lågnivåljus under sängen med en 3 minuters timeout, separat för LED-lamporna, eftersom det skulle leda till att både min fru och jag vaknar . Underbelysningen kommer att vara en kommersiell huvudenhet, så jag ska hacka ett relä i ett stickkontakt för att slå på och av. Om du inte är bekväm att arbeta med 110-240v AC-nätaggregat under några omständigheter (och det är vanligtvis en bra regel att ha), koppla sedan upp en 433 MHz trådlös sändare med kopplingsuttag, som beskrivs på Raspberry Pi Arduino-hemautomatiseringsprojektet Hemautomatiseringsguide med Raspberry Pi och Arduino Hemautomationsguide med Raspberry Pi och Arduino Hemautomationsmarknaden översvämmas med dyra konsumentsystem, inkompatibla med varandra och kostsamt att installera. Om du har en Raspberry Pi och en Arduino, kan du i princip uppnå samma sak på ... Läs mer.

Delar och schematisk

  • Arduino
  • Set med RGB LED-stripljus
  • 12 volt strömförsörjning
  • 3 x MOSFET N-transistorer (jag använder typ STP16NF06FP)
  • Relä och eluttag, eller trådlösa kontrollerade uttag och lämplig sändare
  • Ditt val av nattlampa (vanlig strömförsörjning med plugg är bra)
  • PIR-rörelsessensor (HC-SR501) eller en SC-04 sonar (inte lika effektiv)
  • Ljussensor
  • Projektkod - men läs vidare så att du förstår hur man anpassar allt.

Här är den fullständiga schematiska.

soluppgång-larm-krets

Anslutning av ett relä

Obs! Hoppa över det här avsnittet om du vill använda RGB-lamporna som nattlampa - det här är speciellt för att koppla in ett separat strömsläckt ljus.

För att koppla strömmen måste din relä vara märkt för spänning - 110V eller 240V AC beroende på var du bor - och mer än den totala strömstyrkan du kommer att byta. Den som jag har använt från detta sensorpaket (ansvarsfrånvaro: det är min butik) är 250VAC / 10A, så vi borde vara säkra. Reläer har en com- port, vanligtvis i mitten, som ska anslutas till den levande ledningen som kommer in i kontakten; Anslut sedan uttaget för levande kontakt till NO (normalt öppet). Jag borde inte behöva berätta för dig att du inte gör det här, det är anslutet till ett uttag, eller du kommer att dö. Om du är rädd för att röra med strömförsörjning, använd i stället trådlösa kontakter.

relä-ledningar

Jord- och nätsladdarna ska gå direkt till uttaget och kommer inte att röra reläet. Du får inte ha en jordlinje i USA. Det är ditt ansvar att känna till färgkodningen av ledningar i ditt lokalsamfund - om du inte annars kan ansluta ett vanligt stickkontakt i ditt hem eller byta ut en plugg, försök inte att inbädda ett relä i ett!

För att testa, koppla reläsignalstiftet till 12, kör sedan ett enkelt blinkprogram som är modifierat för att fungera på stift 12, inte 13 som standard. Ditt uttag ska sätta på och stänga av några sekunder. Anledningen till att jag inte använder pin 13 är att under uppladdningsprocessen brinner den inbyggda LED-enheten i snabb följd för att indikera seriell aktivitet, vilket skulle medföra att reläet aktiveras också.

Få timing rätt

Timing och klockfunktioner är svåra utan tillgång till en nätverksanslutning eller dedikerad realtidsklocka (dessa inkluderar egna batterier för att hålla klockan på gång även när huvud Arduino inte har någon ström). För att hålla kostnaderna låga, kommer jag att fuska. Jag kommer att hardcoding en starttid för Arduino att börja det är nedräkning; tidpunkter kommer därför att vara i förhållande till denna starttid. Varje 24 timmar återställs klockan. Klockans funktionskod nedan gör att de globala variablerna CurrentMillis och currentMinutes är korrekta varje dag. Arduino borde inte förlora mer än några sekunder var 45: e dag; Men den här hårdkodade stilen för timing är ganska begränsad, eftersom en strömavbrott eller oavsiktlig återställning kommer att bryta allt, så det här är verkligen ett område som kan förbättras. Om timing inte blir synkroniserad, återställ bara Arduino vid den inställda starttiden.

Koden ska vara lätt att förstå.

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; } 

Nattljusfunktion

Jag har separerat huvudslingorna i olika funktioner så det är lättare att läsa och ta bort eller justera. Funktionen nightLight () fungerar endast mellan timmarna när Arduino återställdes (jag antar att du förmodligen gör det på eller runt sänggåendet när det är mörkt) och tills soluppgångslarmet börjar börja. Jag hade ursprungligen försökt använda ett ljusberoende motstånd, men de är inte särskilt känsliga för blått ljus (vilket råkar vara den färg jag använder för nattljuset) och svår att kalibrera rätt. Att använda klockan är mer meningsfull, ändå. Vi använder den globala currentMinutes- variabeln, som återställs varje dag.

PIR-sensorn kan vara lite otrevlig om du aldrig har använt en förut, men det är inte svårt att ansluta det, det är inte svårt att hitta VCC, GND och OUT tydligt på baksidan. Det finns också två variabla motstånd du; den ena märkta RX bestämmer intervallet (upp till ca 7m), och en annan märkt TX bestämmer fördröjning. Fördröjningen är 5 sekunder vid den lägsta inställningen (helt moturs), och innebär att en momentan rörelse kommer att utlösa minst 5 sekunder av "on" -status från sensorn. Det bestämmer dock fördröjningen mellan aktiva tillstånd - så om 5 sekunder förflutit och ingen rörelse detekteras skickar sensorn en låg signal i minst 5 sekunder även om det finns rörelse under den perioden. Om du har förseningen mycket hög på cirka 30 sekunder, kan det verka som att sensorn är trasig.

pir-sensor

Om du sover ensam och inte har något emot att använda samma RGB-stripljus för både soluppgångslarmet och nattljuset, bör du kunna justera koden tillräckligt enkelt.

 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); } } 

Soluppgångslarm

För enkelhet använder jag RGB-färgvärdet 255, 255, 0 för en djup gul soluppgång - så blir inkrementet på båda färgkanalerna detsamma. Om du tycker att det väcker dig för tidigt, överväga att börja med en djupröd och blekna i riktning mot gult eller vitt. Den ramp som jag har använt på bara linjär - du kanske vill undersöka med en mer naturlig kurva för ljusstyrka värden.

Funktionen är enkel - det går ut hur mycket ljuset ska ökas med varje sekund så att den är i full ljusstyrka efter en 30-minutersperiod; multiplicerar sedan att med några sekunder är det för närvarande i soluppgången. Om den redan är i full ljusstyrka, fortsätter den i ytterligare 10 minuter för att se till att du är uppe (och om du fortfarande inte är uppe, ska du noga ha ett backuplarm på plats).

 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); } } } 

Fallgropar och framtida uppgraderingar

Jag har använt det här de senaste veckorna nu och det hjälper verkligen att vakna känna sig mer uppdaterad och på en anständig tid; nattlampan fungerar riktigt bra också. Det är dock inte perfekt, så här är några saker som behöver arbete och lärdomar som lärs under byggandet.

soluppgång-larm

Under det här projektet har jag stött på många problem med att hantera stora antal, så om du planerar att ändra koden, var vänlig och beakta det här. På C-språk är det viktigt att du skriver in dina variabler - ett tal är inte alltid bara ett tal. Till exempel bör osignerade långvariabler användas för att lagra super stora tal som vi hanterar när vi talar om millisekunder, men till och med ett tal så lite som 60 000 kan inte lagras som ett vanligt heltal (ett unsigned int skulle ha varit acceptabelt för upp till 68 000 ) . Poängen är, läs upp på dina variabla typer när du använder stora siffror, och om du hittar udda buggar, är det förmodligen för att en av dina variabler inte har tillräckligt med bitar!

Jag har också funnit ett problem med mycket låga ljusstyrka spänningsläckor - vilket leder till att det minsta ljuset sänds även när en digitalWrite-signal (RED, 0) släpps - jag tror inte att det är hårdvaruproblem med remsorna eftersom de fungerar bra med de officiella kontrollanterna. Om någon kan lösa detta problem, bilden nedan, skulle jag vara mest tacksam. Jag har försökt dra ned motstånd och begränsar utspänningen från Arduino-stiften. Jag kan behöva lägga till en enkel strömbrytarkrets för att bara mata spänning till LED-remsan när det behövs. eller det kan vara felaktiga MOSFET.

ljus-läckage

För framtida arbete hoppas jag lägga till en IR-mottagare och kopiera några av funktionerna hos den ursprungliga kontrollen - åtminstone förmågan att byta färger som ett allmänt bruksljus, eftersom det här projektet förvandlas till en särskild natt ljus. Jag kan till och med lägga till en automatisk 30 minuters timeout-funktion.

Har du provat det här, gjort förbättringar eller fått några andra idéer? Låt mig veta i kommentarerna!

In this article