Annons

Människor är naturligtvis programmerade för att vakna upp med soluppgången; tyvärr dikteras det moderna livet av en godtycklig klocka som ofta tvingar oss att vakna upp 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 kommer att väcka dig utan att ta till en stötande ljudgivande maskin.

Om det är lite för mycket för dig att göra en soluppgång väckarklocka, kolla in dessa iPhone och Android-appar Använd dessa appar för att hjälpa dig att sova bättre [Android & iOS]Efter en hektisk dag är det bästa du kan göra att få en god sömn. Det dyker alltid upp nya studier som bevisar hur viktig sömn verkligen är för en person, förbättrar ... Läs mer som upptäcker när det är bäst att väcka dig av kroppsrörelser Kan en app verkligen hjälpa dig att sova bättre?Jag har alltid varit lite av en sömnexperiment, har under en stor del av mitt liv hållit en noggrann drömdagbok och studerat så mycket jag kunde om att sova under processen. Det är en... Läs mer

, säkerställer att du inte dras ifrån den fantastiska drömmen, utan istället, vakna upp och känns ljus och uppdaterad - de fungerar verkligen.

Projektöversikt

Huvuddelen av projektet kommer att vara cirka 5 meter LED-remsbelysning som ligger runt sängen. Vi kommer att driva dessa med en extern 12 volt-strömförsörjning, växlad med vissa MOSFET N-transistorer. Installationen för denna del kommer att vara identisk med dynamiskt belysningssystem Bygg din egen dynamiska omgivningsbelysning för ett mediecenterOm du tittar på många filmer på din dator eller mediecenter är jag säker på att du har mött belysningens dilemma; stänger du helt av alla lampor? Håller du dem på full spräng? Eller... Läs mer Jag byggde tidigare.

Tidpunkten 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 varje gång den återställs. I teorin bör vi bara förlora en sekund eller två varje dag, men helst skulle vi inkludera ett "realtidsklocka" -chip för att göra detta mer pålitligt. Soluppgångslarmet börjar 30 minuter före väckningstid och ökar långsamt utnivån tills den är 100% ljusstyrka - detta borde räcka för att väcka oss, även om 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 integrera ett nattljus i detta projekt, som upptäcker rörelse och aktiverar en diskret låg nivå ljus under sängen med en 3 minuters time-out, separat till LED-lamporna eftersom de skulle göra att både min fru och jag vaknar upp. Belysningen under sängen kommer att vara en kommersiell nätenhet, så jag kommer att hacka ett relä i ett stickkontakt för att slå på och stänga av det. Om du inte är bekväm att arbeta med 110-240v nätström under några omständigheter (och det är i allmänhet en bra regel att ha), koppla sedan upp en 433 MHz trådlös sändare med kopplingsuttag, som beskrivs på Raspberry Pi Arduino-hemmeautomationsprojekt Hemmautomationsguide med hallon Pi och ArduinoHemmautomationsmarknaden är översvämmad av dyra konsumentsystem, oförenliga med varandra och kostsamma att installera. Om du har en Raspberry Pi och en Arduino kan du i princip uppnå samma sak på ... Läs mer .

Dellista och schematisk

  • Arduino
  • Uppsättning RGB LED-remsbelysning
  • 12 volt strömförsörjning
  • 3 x MOSFET N-transistorer (jag använder typ STP16NF06FP)
  • Relä- och eluttag, eller trådlösa styrda uttag och lämplig sändare
  • Ditt val av nattlampa (vanligt nätström med kontakt är bra)
  • PIR-rörelsessensor (HC-SR501) eller en SC-04-ekolod (inte lika effektiv)
  • Ljussensor
  • Projektkod - men läs vidare för att se till att du förstår hur du anpassar allt.

Här är det kompletta schemat.

soluppgång-larm-krets

Koppla upp ett relä

Notera: Hoppa över det här avsnittet om du också vill använda RGB-lamporna som nattljus - detta är speciellt för att slå på ett separat nätströmsljus.

För omkoppling av nätström måste ditt relä klassificeras för spänning - 110V eller 240V AC beroende på var du bor - och mer än den totala strömstyrkan du byter. Den jag har använt från det här sensorpaketet (friskrivning: det är min butik) är 250VAC / 10A, så vi borde vara säkra. Reläer har en com port, vanligtvis i mitten, som borde anslutas till spänningsledningen som kommer in i kontakten; anslut sedan sockeluttagsterminalen till NEJ (normalt öppet). Jag borde inte behöva säga att du inte ska göra det här när det är anslutet till ett uttag, eller så kommer du att dö. Om du är rädd för att röra med nätspänningen använder du istället trådlösa växlade uttag.

relä-ledningar

Jord- och neutralkablarna ska gå rakt till uttaget och kommer inte att vidröra reläet. Du kanske inte har en jordlinje i USA. Det är ditt ansvar att känna till färgkodning av ledningar i ditt lokala område - Om du inte annars kunde koppla in ett vanligt uttag i ditt hem eller koppla om en kontakt, försök inte bädda in 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. Din uttag ska slås på och stängs med några sekunder. Anledningen till att jag inte använder stift 13 beror på att LED-enheten ombord laddar upp snabbt i följd för att indikera seriell aktivitet, vilket skulle leda till att reläet aktiveras också.

Få rätt tidpunkt

Tid- och klockfunktioner är svåra utan åtkomst till en nätverksanslutning eller dedikerad Riktig tids klocka (dessa inkluderar egna batterier för att hålla klockan igång även när den huvudsakliga Arduino inte har ström). För att hålla kostnaderna låga ska jag fuska. Jag kodar en starttid för Arduino för att börja sin nedräkning; tidsinställningarna kommer därför att vara relativt denna starttid. Varje 24 timmar återställs klockan. Klockfunktionskoden nedan ser till att de globala variablerna currentMillis och currentMinutes har rätt varje dag. Arduino bör inte förlora mer än några sekunder var 45: e dag; emellertid är denna hårdkodade stil av timing ganska begränsad genom att strömavbrott eller oavsiktlig återställning kommer att bryta allt, så detta är verkligen ett område som kan förbättras. Om timingen inte kommer att synkroniseras, återställ helt enkelt Arduino vid din inställda starttid.

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

void klocka () {if (millis ()> = tidigareMillis + 86400000) {// en hel dag har gått, återställ klockan; föregåendeMillis + = 86400000; } currentMillis = millis () - föregåendeMillis; // detta håller vår nuvarandeMillis densamma varje dag currentMinutes = (currentMillis / 1000) / 60; }

Nattljusfunktion

Jag har separerat huvudslingorna i olika funktioner så att det är lättare att läsa och ta bort eller justera. De nattlampa() -funktionen fungerar bara mellan timmarna då Arduino återställdes (jag antar att du antagligen kommer att göra det på eller runt sänggåendet, när det är mörkt), och tills soluppgången kommer att börja. Jag hade inledningsvis försökt att använda ett ljusberoende motstånd, men de är inte särskilt känsliga för blått ljus (vilket råkar vara färgen jag använder för nattljuset) och svårt att kalibrera rätt. Att använda klockan är ändå mer meningsfullt. Vi kommer att använda det globala currentMinutes variabel, som återställs varje dag.

PIR-sensorn kan vara lite udda om du aldrig har använt en förut, även om det inte är svårt att koppla upp den - du hittar VCC, GND, och UT tydligt märkt på baksidan. Det finns också två variabla motstånd; den ena märkta RX bestämmer intervallet (upp till cirka 7 m), 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 varje momentan rörelse kommer att utlösa minst 5 sekunder av "på" tillstånd från sensorn. Men det bestämmer också fördröjningen mellan aktiva tillstånd - så om det går 5 sekunder och ingen rörelse sker detekterat kommer sensorn att sända en låg signal i minst 5 sekunder även om det är rörelse under det period. Om du har riktigt hög fördröjning inställd på cirka 30 sekunder kan det verka som sensorn är trasig.

pir-sensor

Om du sover ensam och inte bryr dig om att använda samma RGB-strecklampor för både soluppgångslarm och nattljus, borde du kunna justera koden tillräckligt enkelt.

void nightlight () {// Arbeta bara mellan återställningstimmarna -> soluppgång. if (currentMinutes 

Sunrise Alarm

För enkelhetens skull kommer jag att använda RGB-färgvärdet 255,255,0 för en djupgul soluppgång - på detta sätt kommer ökningen på båda färgkanalerna att vara densamma. Om du tycker att det väcker dig för tidigt kan du överväga att börja med djupt rött och blekna mot gult eller vitt. Rampen upp har jag använt i bara linjär - du kanske vill undersöka med en mer naturlig kurva för ljusstyrka.

Funktionen är enkel - det räknar ut hur mycket ljuset ska ökas av varje sekund så att det är i full ljusstyrka efter en 30-minutersperiod; sedan multiplicerar det med hur många sekunder det för närvarande är i soluppgången. Om det redan är i full ljusstyrka förblir det på i ytterligare 10 minuter för att se till att du är uppe (och om du fortfarande inte är uppe, bör du antagligen ha ett säkerhetskopieringslarm på plats).

void sunrisealarm () {// varje sekund under 30 minitperioden bör öka färgvärdet med: float inkrement = (float) 255 / (30 * 60); // röd 255, grön 255 ger oss full ljusstyrka gul om (currentMinutes> = minutesUntilSunrise) {// soluppgång börjar! float currentVal = (float) ((currentMillis / 1000) - (minuterUntilSunrise * 60)) * ökning; Serial.print ("Aktuellt värde för soluppgång:"); Serial.println (currentVal); // under rampen upp, skriv det aktuella värdet för minuter X ljusstyrkeökning om (strömVal <255) {analogWrite (RÖD, strömVal); analogWrite (GRÖN, aktuellVal); } annars om (currentMinutes - minutesUntilSunrise <40) {// när vi är i full ljusstyrka, håll lamporna på i 10 minuter längre analogWrite (RED, 255); analogWrite (GREEN, 255); } annars {// efter det kommer vi tillbaka dem till off state analogWrite (RED, 0); analogWrite (GRÖN, 0); } } }

Fallgropar och framtida uppgraderingar

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

soluppgång-larm

När jag gjorde projektet stötte jag på många problem med att hantera stora antal, så om du planerar att ändra koden, tänk på detta. På C-språk, att skriva dina variabler är mycket viktigt - ett nummer är inte alltid bara ett nummer. Till exempel, osignerad länge variabler bör användas för att lagra super stora siffror som vi handlar om när vi talar om millisekunder, men till och med ett antal så små 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 dina variabeltyper när du använder stora siffror och om du hittar udda buggar beror det antagligen på att en av dina variabler inte har tillräckligt med bitar!

Jag har också hittat ett problem med mycket låg ljusstyrka spänningsläckor - vilket leder till att den minsta mängden ljus släpps ut även när en digitalWrite (RED, 0) signal sänds ut - Jag tror inte att det är hårdvaruproblem med remsorna eftersom de fungerar bra med de officiella kontrollerna. Om någon kan lösa detta problem, bilden nedan, skulle jag vara mycket tacksam. Jag har försökt dra ner motstånd och begränsa 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 faktiskt behövs; eller så kan det vara felaktiga MOSFET: er.

ljus-läckage

För framtida arbete hoppas jag kunna lägga till en IR-mottagare och kopiera några av funktionerna i den ursprungliga styrenheten - kl minsta möjligheten att ändra färger som ett allmänt användningsbelysning, eftersom just nu detta projekt förvandlar remsan till en dedikerad natt ljus. Jag kanske till och med lägger till en automatisk timeout-funktion på 30 minuter.

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

James har en kandidatexamen i artificiell intelligens och är CompTIA A + och Network + certifierad. Han är ledande utvecklare av MakeUseOf och tillbringar sin fritid med att spela VR-paintball och brädspel. Han har byggt datorer sedan han var liten.