Arduino Night Light en Sunrise Alarm Project

Arduino Night Light en Sunrise Alarm Project / DIY

Mensen zijn van nature geprogrammeerd om wakker te worden met de zonsopgang; helaas wordt het moderne leven bepaald door een willekeurige klok, die ons vaak dwingt om wakker te worden als er geen daglicht is. Vandaag zullen we een wekker voor zonsopkomst maken, die je langzaam en langzaam wakker zal maken zonder gebruik te maken van een aanstootgevend lawaai makende machine.

Als het maken van een wekker bij zonsopgang iets teveel van je is, bekijk dan deze iPhone- en Android-apps Gebruik deze apps om je te helpen beter te slapen [Android en iOS] Gebruik deze apps om je beter te laten slapen [Android en iOS] Na een hectische dag dag, het beste wat je kunt doen is een goede hoeveelheid slaap krijgen. Er verschijnen altijd nieuwe onderzoeken die bewijzen hoe belangrijk slaap echt voor een persoon is, en die ... Lees meer die detecteren wanneer je het best wakker wordt door lichaamsbewegingen Kan een app je echt helpen beter te slapen? Kan een app u echt helpen om beter te slapen? Ik ben altijd een beetje een slaapexperiment geweest en heb een groot deel van mijn leven een nauwgezet droomdagboek bijgehouden en zo veel als ik kon gestudeerd over slapen tijdens het proces. Er is een ... Lees Meer, ervoor zorgend dat je niet wordt weggetrokken van die geweldige droom, maar in plaats daarvan word je wakker met een helder en verfrist gevoel - ze doen echt werk.

Project overzicht

Het grootste deel van het project zal ongeveer 5 meter LED-striplicht rondom het bed zijn. We zullen deze voeden met een externe 12-volt voeding, geschakeld met behulp van enkele MOSFET N-transistors. De opstelling voor dit onderdeel is identiek aan het dynamische verlichtingssysteem. Bouw uw eigen dynamische omgevingsverlichting voor een mediacentrum Bouw uw eigen dynamische omgevingsverlichting voor een mediacentrum Als u veel films op uw pc of mediacenter bekijkt, ben ik zeker dat je voor het verlichtingsdilemma staat; schakel je alle lichten helemaal uit? Houd je ze voluit? Of ... Lees meer Ik heb eerder gebouwd.

Timing is een probleem - aangezien dit een prototype is, stel ik de Arduino in op aftellen vanaf het moment dat deze wordt gereset. In theorie zouden we elke dag maar een paar of twee verliezen, maar in het ideale geval zouden we een “real-time klok” chip om dit betrouwbaarder te doen. Het zonsopgangalarm begint 30 minuten voor het opstaan ​​en verhoogt het uitvoerniveau langzaam tot het 100% helder is - dit zou genoeg moeten zijn om ons wakker te maken, hoewel het een goed idee is om je normale wekker te gebruiken tot je lichaam is er aan gewend.

Ik neem ook een nachtlampje op in dit project, dat beweging detecteert en een discrete laag niveau licht onder het bed activeert met een time-out van 3 minuten, los van de LED-lampjes, omdat zowel mijn vrouw als ik wakker worden . De verlichting onder het bed zal een commerciële voedingseenheid zijn, dus ik hak een relais in een stopcontact om dat aan en uit te zetten. Als u niet vertrouwd bent met het werken met 110-240v wisselstroomnetvoeding (en dat is over het algemeen een goede regel om te hebben), sluit dan een 433 MHz draadloze zender aan met schakeldozen, zoals uiteengezet in het Raspberry Pi Arduino domoticaproject Home Automation Guide met Raspberry Pi en Arduino Home Automation Guide met Raspberry Pi en Arduino De domotica markt wordt overspoeld met dure consumentensystemen, incompatibel met elkaar en kostbaar om te installeren. Als je een Raspberry Pi en een Arduino hebt, kun je in principe hetzelfde bereiken op ... Lees meer .

Onderdelenlijst en Schema

  • Arduino
  • Reeks RGB LEIDENE strooklichten
  • 12 volt voeding
  • 3 x MOSFET N-transistoren (ik gebruik type STP16NF06FP)
  • Relais- en stopcontact, of draadloos gestuurde contactdozen en geschikte zender
  • Uw keuze voor nachtlicht (normaal netsnoer met stekker is prima)
  • PIR-bewegingssensor (HC-SR501) of een SC-04-sonar (niet zo effectief)
  • Licht sensor
  • Projectcode - maar lees verder om te weten hoe je alles kunt aanpassen.

Hier is het volledige schema.

Bedrading van een relais

Notitie: Sla dit gedeelte over als u de RGB-lampjes ook als nachtlampje wilt gebruiken - dit is specifiek bedoeld voor het inschakelen van een afzonderlijk lichtnet.

Voor het schakelen van de netspanning moet uw relais op spanning worden beoordeeld - 110V of 240V AC afhankelijk van waar je woont - en meer dan de totale stroomsterkte die je gaat gebruiken. Degene die ik heb gebruikt van dit sensorpakket (disclaimer: dat is mijn winkel) is 250VAC / 10A, dus we moeten veilig zijn. Relais hebben een com poort, meestal in het midden, die moet worden aangesloten op de stroomdraad die in de stekker komt; sluit vervolgens de socketsleuf aan op de NEE (normaal open). Ik zou je niet moeten zeggen dat je dit niet moet doen als hij op een stopcontact is aangesloten, anders sterf je. Als je bang bent om te storen met netvoeding, gebruik dan in plaats daarvan draadloze geschakelde stopcontacten.

De aarde en neutrale kabels moeten recht naar de aansluiting gaan en het relais niet raken. Mogelijk hebt u geen aardingslijn in de VS.. Het is uw verantwoordelijkheid om de kleurcodering van draden in uw omgeving te kennen - als je op een andere manier geen stopcontact in huis kunt aansluiten of een stekker opnieuw kunt aansluiten, probeer dan niet een relais in één te integreren!

Om te testen, bedraad de relaissignaalpin tot 12 en voer vervolgens een eenvoudig knipperend programma uit dat is aangepast om te werken op pin 12, niet 13 zoals standaard. Uw socket moet om de paar seconden worden in- en uitgeschakeld. De reden waarom ik pin 13 niet gebruik, is omdat tijdens het uploadproces de LED aan boord snel achter elkaar flitst om seriële activiteit aan te geven, waardoor het relais ook zou activeren.

Timing goed krijgen

Timing- en klokfuncties zijn moeilijk zonder toegang tot een netwerkverbinding of dedicated Realtime Clock (deze bevatten hun eigen batterijen om de klok in stand te houden, zelfs als de hoofd Arduino geen stroom heeft). Om de kosten laag te houden, ga ik vals spelen. Ik zal een starttijd programmeren voor de Arduino om te beginnen met aftellen; timings zullen daarom relatief zijn aan deze starttijd. Elke 24 uur wordt de klok gereset. De onderstaande klokfunctiecode zorgt voor de globale variabelen currentMillis en currentMinutes zijn elke dag correct. De Arduino mag niet meer dan een paar seconden per 45 dagen verliezen; deze hardgecodeerde stijl van timing is echter vrij beperkt omdat een stroomonderbreking of een per ongeluk opnieuw instellen alles zal verbreken, dus dit is zeker een gebied dat kan worden verbeterd. Als de timing niet meer synchroon loopt, reset je de Arduino eenvoudig op de ingestelde starttijd.

De code moet gemakkelijk te begrijpen zijn.

void clock () if (millis ()> = previousMillis + 86400000) // een volledige dag is verstreken, reset de klok; vorigeMillis + = 86400000;  currentMillis = millis () - previousMillis; // dit houdt onze currentMillis elke dag hetzelfde currentMinutes = (currentMillis / 1000) / 60;  

Nachtlichtfunctie

Ik heb de hoofdlussen gescheiden in afzonderlijke functies, zodat deze gemakkelijker te lezen en te verwijderen of aan te passen is. De nachtlichtje() De functie werkt alleen tussen de uren dat de Arduino werd gereset (ik neem aan dat je dit waarschijnlijk doet op of rond het slapengaan, wanneer het donker is) en totdat het zonsopgangalarm begint. Ik had aanvankelijk geprobeerd om een ​​lichtafhankelijke weerstand te gebruiken, maar ze zijn niet erg gevoelig voor blauw licht (wat toevallig de kleur is die ik gebruik voor het nachtlicht), en moeilijk om goed te kalibreren. Het gebruik van de klok is trouwens logischer. We zullen de global gebruiken currentMinutes variabele, die elke dag wordt gereset.

De PIR-sensor kan een beetje eigenzinnig zijn als je er nog nooit een hebt gebruikt, hoewel het niet moeilijk is om de bedrading op te laden VCC, GND, en UIT duidelijk gelabeld op de achterkant. Er zijn ook twee variabele weerstanden thee; degene met het label RX bepaalt het bereik (tot ongeveer 7m) en een ander met het label TX bepaalt de vertraging. De vertraging is 5 seconden bij de laagste instelling (helemaal tegen de klok in), en betekent dat elke tijdelijke beweging ten minste 5 seconden van “op” staat van de sensor. Het bepaalt echter ook de vertraging tussen actieve toestanden - dus als 5 seconden verstrijken en geen beweging wordt gedetecteerd, stuurt de sensor gedurende minstens 5 seconden een laag signaal, zelfs als er beweging is gedurende die periode. Als de ingestelde vertraging ongeveer 30 seconden erg hoog is, kan het lijken alsof de sensor defect is.

Als u alleen slaapt en het niet erg vindt om dezelfde RGB-strookverlichting te gebruiken voor zowel het zonsopgangalarm als het nachtlampje, moet u de code gemakkelijk genoeg kunnen aanpassen.

void nightlight () // Alleen werken tussen de uren van 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);   

Sunrise Alarm

Voor de eenvoud gebruik ik de RGB-kleurwaarde 255,255,0 voor een diepgele zonsopgang - op deze manier zal de toename van beide kleurkanalen hetzelfde zijn. Als je merkt dat je te vroeg wakker wordt, overweeg dan om te beginnen met een dieprode kleur en vervaag richting geel of wit. De oploop die ik in lineair gebruik heb gebruikt, wil je wellicht onderzoeken met een natuurlijkere curve voor helderheidswaarden.

De functie is eenvoudig - het bepaalt hoeveel het licht met elke seconde moet worden verhoogd, dus het is op volle helderheid na een periode van 30 minuten; vermenigvuldigt vervolgens dat met zoveel seconden het momenteel in de zonsopgang is. Als het al op volle helderheid is, blijft het nog 10 minuten branden om zeker te zijn dat je in de lucht bent (en als je nog steeds niet op bent, zou je waarschijnlijk een back-up alarm moeten hebben).

void sunrisealarm () // elke seconde gedurende de 30 miniet periode zou de kleurwaarde moeten verhogen met: float increment = (float) 255 / (30 * 60); // rood 255, groen 255 geeft ons de volledige helderheid geel als (currentMinutes> = minutesUntilSunrise) // sunrise begint! float currentVal = (float) ((currentMillis / 1000) - (minutesUntilSunrise * 60)) * toename; Serial.print ("Huidige waarde voor zonsopkomst:"); Serial.println (currentVal); // schrijf tijdens het verhogen van de huidige waarde van de minuten X helderheidsstijging op als (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);    

Valkuilen en toekomstige upgrades

Ik gebruik dit de afgelopen paar weken nu en het helpt echt om je meer fris en op een fatsoenlijk moment wakker te voelen; het nachtlampje werkt ook echt goed. Het is echter niet perfect, dus hier zijn een paar dingen die tijdens de bouw moeten worden opgelost en lessen moeten trekken.

Bij het maken van dit project heb ik veel problemen ondervonden bij het omgaan met grote aantallen, dus als u van plan bent om de code aan te passen, houd hier dan rekening mee. In C-taal, de het typen van uw variabelen is erg belangrijk - een nummer is niet altijd alleen maar een cijfer. Bijvoorbeeld, niet lang ondertekend variabelen moeten worden gebruikt om supergrote getallen op te slaan zoals we behandelen wanneer we het hebben over milliseconden, maar zelfs een getal zo klein als 60.000 kan niet worden opgeslagen als een regulier geheel getal (een niet-ondertekende int zou acceptabel zijn geweest voor maximaal 68.000). Het punt is, lees je variabelentypes bij het gebruik van grote getallen, en als je rare bugs tegenkomt, komt dat waarschijnlijk omdat een van je variabelen niet genoeg bits heeft!

Ik heb ook een probleem gevonden met zeer lage helderheidsspanningslekken, waardoor de kleinste hoeveelheid licht wordt uitgestraald, zelfs als a digitalWrite (RED, 0) er wordt een signaal afgegeven - ik denk niet dat het een hardwareprobleem met de strips is, omdat ze goed werken met de officiële controllers. Als iemand dit probleem kan oplossen, zie hieronder, zou ik het zeer op prijs stellen. Ik heb weerstanden geprobeerd uit te schakelen en de uitgangsspanning van de Arduino-pinnen te beperken. Ik moet misschien een eenvoudig stroomschakelcircuit toevoegen om alleen de LED-strip van spanning te voorzien wanneer dat echt nodig is; of het kunnen defecte MOSFET's zijn.

Voor toekomstig werk hoop ik een IR-ontvanger toe te voegen en een aantal functies van de originele controller te dupliceren - tenminste de mogelijkheid om kleuren te veranderen als een algemeen gebruikslicht, omdat dit project de strip nu in een speciale nacht verandert. licht. Ik kan zelfs een automatische time-outfunctie van 30 minuten toevoegen.

Heb je dit geprobeerd, verbeteringen aangebracht of andere ideeën opgedaan? Laat het me weten in de comments!

Ontdek meer over: Arduino.