Arduino Night Light og Sunrise Alarm Project

I dag laver vi et solopgangsvækkeur, som forsigtigt og langsomt vil vække dig uden at ty til en offensiv støjdannende maskine.

I dag laver vi et solopgangsvækkeur, som forsigtigt og langsomt vil vække dig uden at ty til en offensiv støjdannende maskine.
Reklame

Mennesker er naturligt programmeret til at vågne op med solopgangen; desværre er det moderne liv dikteret af et vilkårligt ur, der ofte tvinger os til at vågne op, når der ikke er noget naturligt lys. I dag laver vi et solopgangsvækkeur, som forsigtigt og langsomt vil vække dig uden at ty til en offensiv støjdannende maskine.

Hvis du laver en solopgang vækkeur er lidt for meget for dig, tjek disse iPhone og Android apps Brug disse apps til at hjælpe dig med at sove bedre [Android & IOS] Brug disse apps til at hjælpe dig med at sove bedre [Android & IOS] Efter en hektisk dag, det bedste du kan gøre er at få en gavnlig mængde søvn. Der er altid nye undersøgelser, der viser, hvor vigtigt søvn virkelig er for en person, der forbedrer ... Læs mere, der opdager, hvornår det er bedst at vække dig ved kropsbevægelser Kan en app virkelig hjælpe dig med at sove bedre? Kan en app virkelig hjælpe dig med at sove bedre? Jeg har altid været lidt af en søvneksperimenter, idet jeg for meget af mit liv har holdt en omhyggelig drømdagbog og studeret så meget som jeg kunne om at sove i processen. Der er en ... Læs mere, så du ikke bliver trukket væk fra den fantastiske drøm, men i stedet vågner du lyst og forfrisket - de gør virkelig arbejde.

Projektoversigt

Hoveddelen af ​​projektet vil være omkring 5 meter LED strip lys liggende omkring sengen. Vi styrer disse med en ekstern 12 volt forsyning, skiftet ved hjælp af nogle MOSFET N transistorer. Opsætningen til denne del vil være identisk med det dynamiske belysningssystem. Byg din egen dynamiske omgivende belysning til et mediecenter. Byg din egen dynamiske omgivende belysning til et mediecenter. Hvis du ser mange film på din pc eller mediecenter, er jeg sikker på at du har konfronteret lysproblemet; slukker du helt for alle lys? Holder du dem på fuld blast? Eller ... Læs mere Jeg bygget før.

Timing er et problem - da dette er en prototype, indstiller jeg Arduino til at regne ned fra, når den er nulstillet. I teorien skal vi kun miste et sekund eller to hver dag, men ideelt set vil vi inkludere en "real time clock" chip for at gøre det mere pålideligt. Solopgangslarmet starter 30 minutter før vågetid og øger langsomt udgangsniveauet, indtil det er 100% lysstyrke. Dette bør være nok til at vågne os op, selv om det er en god idé at holde ved med dit regelmæssige vækkeur, indtil din krop er vant til det.

Jeg vil også inkorporere et natlys i dette projekt, som registrerer bevægelse og aktiverer et diskret lavt niveau lys under sengen med en 3 minutters timeout, adskilt til LED-lysene, da det ville få både min kone og jeg til at vågne op . Underbelysningen vil være en kommerciel netværksenhed, så jeg hakker et relæ i en stikkontakt for at tænde og slukke for det. Hvis du ikke er komfortabel med at arbejde med 110-240v AC-strømforsyning under alle omstændigheder (og det er generelt en god regel at have), skal du tilslutte en 433 MHz trådløs sender med kontaktstik, som beskrevet på Raspberry Pi Arduino-hjemmeautomatiseringsprojektet Home Automation Guide Med Hindbær Pi og Arduino Home Automation Guide Med Hindbær Pi og Arduino Hjemmautomatiseringsmarkedet oversvømmes med dyre forbruger systemer, inkompatible med hinanden og kostbart at installere. Hvis du har en Raspberry Pi og en Arduino, kan du stort set opnå det samme ved ... Læs mere.

Dele Liste og skematisk

  • Arduino
  • Sæt med RGB LED strip lys
  • 12 volt strømforsyning
  • 3 x MOSFET N transistorer (jeg bruger type STP16NF06FP)
  • Relæ og stikkontakt, eller trådløse styrede stikkontakter og passende transmitter
  • Dit valg af natlys (almindelig stikkontakt med stik er fint)
  • PIR bevægelsesføler (HC-SR501) eller en SC-04 sonar (ikke så effektiv)
  • Lyssensor
  • Projektkode - men læs videre for at sikre dig, at du forstår, hvordan du tilpasser alt.

Her er den komplette skematiske.

solopgang-alarm-kredsløb

Tilslutning af et relæ

Bemærk : Spring over dette afsnit, hvis du også vil bruge RGB-lysene som natlys - det er specielt for at tænde for et separat strømforsyningslys.

For at tænde strømmen skal dit relæ vurderes til spænding - 110V eller 240V AC afhængigt af hvor du bor - og mere end den totale strømstyrke, du vil skifte. Den, jeg har brugt fra denne sensorpakke (ansvarsfraskrivelse: det er min butik) er 250VAC / 10A, så vi skal være sikre. Relæer har en com- port, normalt i midten, som skal forbindes med det levende ledning, der kommer ind i stikket; Tilslut derefter stikket til stikkontakten til NO (normalt åben). Jeg skulle ikke nødt til at fortælle dig, at du ikke gør det her, det er tilsluttet et stikkontakt, eller du skal dø. Hvis du er bange for at snyde med lysnettet, skal du bruge trådløse stikkontakter i stedet.

relæ-ledninger

Jord- og neutrale kabler skal gå direkte til stikkontakten og vil ikke berøre relæet. Du må ikke have en jordlinje i USA. Det er dit ansvar at kende farvekoderingen af ​​ledninger i dit lokalområde - hvis du ikke ellers kan tilslutte en almindelig stikkontakt i dit hjem eller genoprette en stikkontakt, så prøv ikke at integrere et relæ i en!

For at teste, drej relæsignalstiften til 12, og kør derefter et enkelt blinkprogram, der er modificeret til at arbejde på pin 12, ikke 13 som standard. Din stikkontakt skal tændes og slukkes hvert par sekunder. Grunden til, at jeg ikke bruger pin 13, er, at i løbet af uploadprocessen brænder den indbyggede LED hurtigt efter hinanden for at indikere seriel aktivitet, hvilket vil medføre, at relæet også aktiveres.

Få timing til højre

Timing og urfunktioner er vanskelige uden adgang til en netværksforbindelse eller dedikeret Realtime Clock (disse omfatter deres egne batterier for at holde uret til at gå, selvom hoved Arduino ikke har strøm). For at holde omkostningerne lave skal jeg snyde. Jeg vil være hardcoding en starttid for Arduino at starte det nedtælling; Tidspunkter vil derfor være i forhold til denne starttid. Hver 24 timer vil uret blive nulstillet. Klokkefunktionskoden nedenfor sikrer, at de globale variabler currentMillis og currentMinutes er korrekte hver dag. Arduino bør ikke tabe mere end et par sekunder hver 45 dage; Imidlertid er denne hårdkodede stil af timing ret begrænset, fordi en strømafbrydelse eller utilsigtet nulstilling vil bryde alt, så dette er bestemt et område, der kunne forbedres. Hvis timing ikke er synkroniseret, skal du bare nulstille Arduino på dit indstillede starttidspunkt.

Koden skal være let at 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; } 

Natlysfunktion

Jeg har adskilt hovedsløjferne til forskellige funktioner, så det er lettere at læse og fjerne eller justere. NightLight () -funktionen virker kun mellem de timer, hvor Arduino blev nulstillet (jeg antager, at du sandsynligvis vil gøre dette ved eller omkring sengetid, når det er mørkt), og indtil solopgangslarmet skal begynde. Jeg havde oprindeligt forsøgt at bruge en lysafhængig modstand, men de er ikke særlig følsomme over for blåt lys (som tilfældigvis er den farve, jeg bruger til natlyset) og svært at kalibrere til højre. Brug af uret er dog mere fornuftigt. Vi bruger den globale currentMinutes- variabel, som bliver nulstillet hver dag.

PIR-sensoren kan være lidt quirky, hvis du aldrig har brugt en før, men ledningen er ikke svært - du finder VCC, GND og OUT tydeligt mærket på bagsiden. Der er også to variable modstande dig; den ene mærket RX bestemmer området (op til ca. 7m), og en anden mærket TX bestemmer forsinkelsen. Forsinkelsen er 5 sekunder ved den laveste indstilling (helt mod uret), og betyder, at enhver øjeblikkelig bevægelse vil udløse mindst 5 sekunder "on" tilstand fra sensoren. Det bestemmer dog også forsinkelsen mellem aktive tilstande - så hvis der går 5 sekunder og ingen bevægelse registreres, sender sensoren et lavt signal i mindst 5 sekunder, selvom der er bevægelse i den periode. Hvis du har forsinkelsen sat rigtig høj på omkring 30 sekunder, kan det virke som om sensoren er brudt.

pir-sensor

Hvis du sover alene og ikke har noget imod at bruge de samme RGB strip lys til både solopgang alarm og natlys, bør du kunne justere koden nemt 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); } } 

Solopgang alarm

For nemheds skyld bruger jeg RGB-farveværdien 255, 255, 0 til en dyb gul solopgang - på denne måde vil inkrementet på begge farvekanaler være det samme. Hvis du finder det vågner dig for tidligt, overvej at starte med en dyb rød og falme mod gul eller hvid. Den rampe jeg har brugt i lige lineær - du vil måske undersøge med en mere naturlig kurve for lysstyrkeværdier.

Funktionen er enkel - det regner ud, hvor meget lyset skal øges med hvert sekund, så det er ved fuld lysstyrke efter en 30 minutters periode; så multipliceres det med mange sekunder, det er i øjeblikket ind i solopgangen. Hvis den allerede er i fuld lysstyrke, forbliver den i yderligere 10 minutter for at sikre, at du er op (og hvis du stadig ikke er op, skal du sikkert have en backup alarm på plads).

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

Faldgruber og fremtidige opgraderinger

Jeg har brugt dette i de sidste par uger nu, og det hjælper virkelig at vågne op for at føle sig mere forfrisket og på en anstændig tid; natlyset fungerer også rigtig godt. Det er dog ikke perfekt, så her er et par ting, der kræver arbejde og erfaringer under konstruktion.

solopgang-alarm

Mens jeg lavede dette projekt, stødte jeg på mange problemer med at håndtere store tal, så hvis du planlægger at ændre koden, vær så opmærksom på det. I C-sprog er indtastningen af ​​dine variabler meget vigtigt - et tal er ikke altid bare et tal. For eksempel skal usignerede lange variabler bruges til at gemme super store tal som vi beskæftiger os med, når vi taler om millisekunder, men selv et tal så lille som 60.000 kan ikke gemmes som et ordinært heltal (et usigneret int ville have været acceptabelt for op til 68.000 ) . Pointen er, læst op på dine variabeltyper, når du bruger store tal, og hvis du finder ulige fejl, er det sandsynligvis fordi en af ​​dine variabler ikke har nok bits!

Jeg har også fundet et problem med meget lavt lysstyrke spændingslækage - hvilket fører til den mindste mængde lys, der udsendes, selv når et digitalWrite (RED, 0) signal udsendes - jeg tror ikke, det er hardware problem med strimlerne siden de arbejder fint med de officielle controllere. Hvis nogen kan løse dette problem, som vist nedenfor, ville jeg være mest taknemmelig. Jeg har forsøgt at trække ned modstande og begrænse udgangsspændingen fra Arduino-stifterne. Jeg må muligvis tilføje et simpelt strømafbryderkredsløb for kun at levere spænding til LED-strimlen, når det er nødvendigt. eller det kan være defekte MOSFET'er.

lys-lækage

For fremtidigt arbejde håber jeg at tilføje i en IR-modtager og kopiere nogle af funktionerne i den originale controller - i det mindste muligheden for at ændre farver som et almindeligt brugslampe, da dette projekt nu forvandler strimlen til en dedikeret nat lys. Jeg kan endda tilføje en automatisk 30 minutters timeout-funktion.

Har du prøvet dette, foretaget forbedringer eller har andre ideer? Lad mig vide i kommentarerne!

In this article