Arduino Night Light en Sunrise Alarm Project

Vandaag zullen we een wekker voor zonsopkomst maken, die je langzaam en langzaam wakker zal maken zonder je te richten op een aanstootgevende machine voor het maken van ruis.

Vandaag zullen we een wekker voor zonsopkomst maken, die je langzaam en langzaam wakker zal maken zonder je te richten op een aanstootgevende machine voor het maken van ruis.
Advertentie

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 je te richten op een aanstootgevende machine voor het maken van ruis.

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 tijd dag, het beste wat je kunt doen is een goede hoeveelheid slaap krijgen. Er verschijnen altijd nieuwe onderzoeken die bewijzen hoe belangrijk slaap echt is voor een persoon, 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 het slapen in het proces. Er zijn 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 opnemen 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-transistors (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.

sunrise-alarm circuit

Bedrading van een relais

Opmerking : sla dit gedeelte over als u de RGB-lampen ook als nachtlampje wilt gebruiken - dit is met name bedoeld voor het inschakelen van een ander lichtnet op netvoeding.

Voor het schakelen van de netspanning moet uw relais een spanning van - 110V of 240V AC beoordelen, afhankelijk van waar u woont - en meer dan de totale stroomsterkte die u gaat omschakelen. Degene die ik heb gebruikt in 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 stroomkabel die in de stekker komt; sluit vervolgens de socket-terminal aan op NO (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.

relay-bedrading

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 u anders geen gewone aansluiting in uw huis zou kunnen aansluiten of een stekker opnieuw zou kunnen verbinden, 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 speciale Realtime Clock (deze bevatten hun eigen batterijen om de klok aan de gang te houden, zelfs als de 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 ervoor dat de globale variabelen currentMillis en currentMinutes elke dag correct zijn. 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){ // 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; } 

Nachtlichtfunctie

Ik heb de hoofdlussen gescheiden in verschillende functies, zodat het gemakkelijker te lezen en te verwijderen of aan te passen is. De functie nightLight () werkt alleen tussen de uren dat de Arduino is gereset (ik neem aan dat u 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 globale currentMinutes- variabele gebruiken, 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 - je vindt VCC, GND en OUT duidelijk op de achterkant gelabeld. 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 (volledig tegen de klok in), en betekent dat elke tijdelijke beweging ten minste 5 seconden "aan" -toestand uit de sensor triggert. Het bepaalt echter ook de vertraging tussen actieve toestanden - dus als er 5 seconden verstrijken en er geen beweging wordt gedetecteerd, verzendt de sensor een laag signaal gedurende minstens 5 seconden, 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.

pir-sensor

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(){ // 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); } } 

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 opstaat (en als je nog steeds niet op bent, zou je waarschijnlijk een back-up alarm moeten hebben).

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

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.

sunrise-alarm

Bij het maken van dit project heb ik veel problemen ondervonden bij het omgaan met grote aantallen, dus als u van plan bent de code aan te passen, houd hier dan rekening mee. In de C-taal is het typen van uw variabelen erg belangrijk - een getal is niet altijd alleen maar een cijfer. Ongetekende lange variabelen moeten bijvoorbeeld 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 lekken met een zeer lage helderheidsspanning - wat leidt tot de kleinste hoeveelheid licht die wordt uitgezonden, zelfs wanneer een digitalWrite (RED, 0) -signaal wordt uitgezonden - Ik denk niet dat het een hardwareprobleem is met de strips omdat ze werken prima 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.

licht lekken

Voor toekomstig werk hoopt ik een IR-ontvanger toe te voegen en een aantal functies van de originele controller te dupliceren - in ieder geval de mogelijkheid om kleuren te veranderen als 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 reacties!

In this article