Arduino Night Light och Sunrise Alarm Project

Arduino Night Light och Sunrise Alarm Project / DIY

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 soluppgång väckarklocka, 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 tyder på hur viktigt 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 en “riktig tids klocka” chip för att göra detta 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.

Anslutning av ett relä

Notera: Hoppa över det här avsnittet om du vill använda RGB-lamporna som nattlampa - det här är speciellt för att släcka 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 effekten som du kommer att byta. Den som jag har använt från det här sensorpaketet (ansvarsfriskrivning: det är min butik) är 250VAC / 10A, så vi borde vara säkra. Reläer har a com hamn, vanligtvis i mitten, som ska anslutas till den levande kabeln som kommer in i kontakten; Anslut sedan uttaget till uttaget NEJ (normalt öppen). 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.

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 lokala område - om du inte annars skulle kunna ansluta ett vanligt stickkontakt i ditt hem eller byta ut en plugg, försök inte inbädda ett relä i en!

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 åtkomst till en nätverksanslutning eller dedikerad Riktig tids klocka (dessa inkluderar sina 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 säkerställer 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 av 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 klocka () if (millis ()> = previousMillis + 86400000) // en hel dag har gått, återställ klockan; tidigareMillis + = 86400000;  currentMillis = millis () - tidigareMillis; // detta håller vår nuvarandeMillis densamma varje dag 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. De nattlampa() funktionen 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 variabel, 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 koppla upp det - du hittar VCC, GND, och UT tydligt märkt 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 kortvarig rörelse kommer att trigga minst 5 sekunder av “på” Ange 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.

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

tom nattljus () // Endast arbete mellan timmarna för återställning -> soluppgång. om (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).

tomt soluppgångs alarm () // varje sekund under 30 minitiden bör öka färgvärdet med: float increment = (float) 255 / (30 * 60); // röd 255, grön 255 ger oss full ljusstyrka gul om (currentMinutes> = minutesUntilSunrise) // soluppgången börjar! float currentVal = (float) ((currentMillis / 1000) - (minutesUntilSunrise * 60)) * inkrement; Serial.print ("Nuvarande värde för soluppgång:"); Serial.println (currentVal); // under ramp upp, skriv nuvärdet av minuter X ljusstyrka ökning om (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.

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, den skriva av dina variabler är mycket viktigt - ett tal är inte alltid bara ett nummer. Till exempel, unsigned long variabler ska 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å liten som 60 000 kan inte lagras som ett vanligt heltal (ett osignerat int skulle ha varit acceptabelt för upp till 68 000). Poängen är, läs upp på dina variabeltyper 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 den minsta mängd ljus utsändes även när en digitalWrite (RÖTT, 0) signalen är utsläppt - jag tror inte att det är maskinvara problem med remsor eftersom de fungerar bra med de officiella kontrollerna. 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.

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!

Utforska mer om: Arduino.