Advertentie
Mensen zijn van nature geprogrammeerd om wakker te worden met de zonsopgang; helaas wordt het moderne leven gedicteerd door een willekeurige klok, die ons vaak dwingt om wakker te worden als er geen natuurlijk licht is. Vandaag maken we een zonsopgangswekker, die je zachtjes en langzaam wakker zal maken zonder toevlucht te nemen tot een aanstootgevende, geluidmakende machine.
Als het maken van een zonsopgangswekker iets te veel voor je is, bekijk dan deze iPhone en Android-apps Gebruik deze apps om beter te slapen [Android en iOS]Na een hectische dag kun je het beste een goede nachtrust krijgen. Er verschijnen altijd nieuwe onderzoeken die bewijzen hoe belangrijk slaap echt is voor een persoon, en verbeteren ... Lees verder die detecteren wanneer u het beste gewekt kunt worden door lichaamsbewegingen Kan een app u echt helpen om beter te slapen?Ik ben altijd een beetje een slaapexperimentant geweest, omdat ik een groot deel van mijn leven een nauwgezet droomdagboek bijhield en zoveel mogelijk studeerde over slapen in het proces. Er zijn een... Lees verder
, zodat je niet wordt weggetrokken van die geweldige droom, maar in plaats daarvan helder en fris wakker wordt - ze werken echt.Projectoverzicht
Het grootste deel van het project is een ledstrip van ongeveer 5 meter rond het bed. We zullen deze van stroom voorzien met een externe 12 volt-voeding, geschakeld met behulp van sommige MOSFET N-transistors. De opstelling voor dit onderdeel is identiek aan de dynamisch verlichtingssysteem Bouw uw eigen dynamische omgevingsverlichting voor een mediacentrumAls u veel films op uw pc of mediacenter bekijkt, weet ik zeker dat u voor het belichtingsdilemma staat; schakel je alle lichten volledig uit? Houd je ze op volle toeren? Of... Lees verder Ik heb eerder gebouwd.
Timing zal een probleem zijn - aangezien dit een prototype is, zal ik de Arduino instellen om af te tellen vanaf het moment dat hij wordt gereset. In theorie zouden we slechts een seconde of twee per dag moeten verliezen, maar idealiter zouden we een "realtime klok" -chip opnemen om dit betrouwbaarder te doen. Het zonsopgangalarm start 30 minuten voor de wektijd en verhoogt langzaam het uitgangsniveau tot het 100% helder is - dit zou voldoende moeten zijn om ons wakker te maken, hoewel het een goed idee is om je gewone wekker te blijven gebruiken totdat je lichaam eraan gewend is het.
Ik neem ook een nachtlampje op in dit project, dat beweging detecteert en een discreet laag niveau activeert licht onder het bed met een time-out van 3 minuten, gescheiden van de LED-lampjes, omdat deze zowel mijn vrouw als ik zouden doen ontwaken omhoog. De verlichting onder het bed zal een commerciële netvoeding zijn, dus ik zal een relais in een stopcontact hacken om dat in en uit te schakelen. Als u zich onder geen enkele omstandigheid prettig voelt bij het werken met 110-240 V wisselstroom (en dat is in het algemeen een goede regel om te hebben), sluit dan een 433 MHz draadloze zender aan met schakelbare stopcontacten, zoals beschreven op de Raspberry Pi Arduino domotica-project Home Automation Guide Met Raspberry Pi en ArduinoDe markt voor domotica wordt overspoeld met dure consumentensystemen, onderling onverenigbaar en kostbaar om te installeren. Als je een Raspberry Pi en een Arduino hebt, kun je in principe hetzelfde bereiken met ... Lees verder .
Onderdelenlijst en schema
- Arduino
- Set RGB LED strip verlichting
- 12 volt voeding
- 3 x MOSFET N-transistors (ik gebruik type STP16NF06FP)
- Relais en stopcontact, of draadloos gestuurde stopcontacten en geschikte zender
- Nachtlampje naar keuze (gewone netvoeding met stekker is prima)
- PIR-bewegingssensor (HC-SR501) of een SC-04-sonar (niet zo effectief)
- Licht sensor
- Projectcode - maar lees verder om er zeker van te zijn dat u begrijpt hoe u alles kunt aanpassen.
Hier is het volledige schema.
Een relais bedraden
Opmerking: Sla dit gedeelte over als u de RGB-lampen ook als nachtlampje wilt gebruiken - dit is speciaal voor het inschakelen van een afzonderlijk licht op netvoeding.
Om de netspanning te schakelen, moet uw relais een nominale spanning hebben - 110V of 240V AC afhankelijk van waar je woont - en meer dan de totale stroomsterkte die je gaat wisselen. Degene die ik heb gebruikt uit 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; verbind vervolgens de socket live terminal met de NEE (normaal open). Ik hoef je niet te vertellen dat je dit niet moet doen als het op een stopcontact is aangesloten, anders ga je dood. Als je bang bent om met netvoeding te knoeien, gebruik dan in plaats daarvan draadloze stopcontacten.
De aardings- en neutrale kabels moeten rechtstreeks 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 een normaal stopcontact in uw huis niet kunt aansluiten of een stekker niet opnieuw kunt bedraden, probeer dan geen relais in een relais in te bedden!
Om te testen, bedraad de relaissignaalpin naar 12 en voer dan een eenvoudig knipprogramma uit dat is aangepast om op pin 12 te werken, niet op 13 zoals standaard. Uw stopcontact moet om de paar seconden worden in- en uitgeschakeld. De reden waarom ik pin 13 niet gebruik, is omdat tijdens het uploadproces de ingebouwde LED snel achter elkaar flitst om seriële activiteit aan te geven, waardoor het relais ook zou worden geactiveerd.
De juiste timing krijgen
Timing- en klokfuncties zijn moeilijk zonder toegang tot een netwerkverbinding of toegewijd Realtime klok (deze bevatten hun eigen batterijen om de klok draaiende te houden, zelfs als de belangrijkste Arduino geen stroom heeft). Om de kosten laag te houden, ga ik vals spelen. Ik zal een starttijd hardcoderen voor de Arduino om te beginnen met aftellen; timings zullen daarom relatief zijn ten opzichte van deze starttijd. Elke 24 uur wordt de klok gereset. De onderstaande klokfunctiecode zorgt voor de globale variabelen huidigeMillis en huidige minuten zijn elke dag correct. De Arduino mag niet meer dan een paar seconden per 45 dagen verliezen; Deze hard gecodeerde timing is echter vrij beperkt, omdat een stroomstoring of een onbedoelde reset alles zal verbreken, dus dit is zeker een gebied dat verbeterd kan worden. Als de timing niet synchroon loopt, reset u eenvoudig de Arduino op uw 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 opgedeeld in verschillende functies, zodat het gemakkelijker te lezen en te verwijderen of aan te passen is. De nachtlichtje() functie werkt alleen tussen de uren dat de Arduino werd gereset (ik neem aan dat je dit waarschijnlijk doet op of rond bedtijd, als het donker is), en totdat het zonsopgangsalarm begint. Ik had aanvankelijk geprobeerd 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 goed te kalibreren. Het gebruik van de klok is hoe dan ook logischer. We gebruiken de globale huidige minuten variabele, die elke dag wordt gereset.
De PIR-sensor kan een beetje eigenzinnig zijn als je er nog nooit een hebt gebruikt, hoewel de bedrading niet moeilijk is - je zult merken VCC, GND, en UIT duidelijk gelabeld op de achterkant. Er zijn ook twee variabele weerstanden; de ene met het label RX bepaalt het bereik (tot ongeveer 7 m), en een andere met de 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' vanuit de sensor zal veroorzaken. Het bepaalt echter ook de vertraging tussen actieve toestanden - dus als er 5 seconden verstrijken en er geen beweging is gedetecteerd, zal de sensor gedurende ten minste 5 seconden een laag signaal verzenden, zelfs als er beweging in is periode. Als je de vertraging erg hoog hebt ingesteld op ongeveer 30 seconden, kan het lijken alsof de sensor kapot is.
Als je alleen slaapt en het niet erg vindt om dezelfde RGB-stripverlichting te gebruiken voor zowel het zonsopgangalarm als het nachtlicht, zou je de code gemakkelijk genoeg moeten kunnen aanpassen.
void nightlight () {// Alleen werken tussen de uren van reset -> zonsopgang. if (currentMinutes
Alarm bij zonsopgang
Voor de eenvoud gebruik ik de RGB-kleurwaarde 255,255,0 voor een diepgele zonsopgang - op deze manier zal de toename op beide kleurkanalen hetzelfde zijn. Als je merkt dat het je te vroeg wakker maakt, overweeg dan om te beginnen met dieprood en vervaagt naar geel of wit. De verhoging die ik heb gebruikt in gewoon lineair - je zou kunnen onderzoeken met een meer natuurlijke curve voor helderheidswaarden.
De functie is eenvoudig: het berekent hoeveel het licht met elke seconde moet worden verhoogd, zodat het na 30 minuten op volle sterkte is; vermenigvuldigt vervolgens het aantal seconden dat het momenteel in de zonsopgang is. Als het al op volle sterkte is, blijft het nog 10 minuten aan om er zeker van te zijn dat je op bent (en als je nog steeds niet op bent, zou je waarschijnlijk een back-upalarm moeten hebben).
void sunrisealarm () {// elke seconde gedurende de periode van 30 minuten moet de kleurwaarde verhogen met: float increment = (float) 255 / (30 * 60); // rood 255, groen 255 geeft ons volledige helderheid geel if (currentMinutes> = minutesUntilSunrise) {// zonsopgang begint! float currentVal = (float) ((currentMillis / 1000) - (minutesUntilSunrise * 60)) * increment; Serial.print ("Huidige waarde voor zonsopgang:"); Serial.println (currentVal); // schrijf tijdens het oplopen de huidige waarde van minuten X helderheidstoename if (currentVal <255) {analogWrite (RED, currentVal); analogWrite (GROEN, currentVal); } else if (currentMinutes - minutesUntilSunrise <40) {// als we eenmaal op volle sterkte zijn, moet je de lichten 10 minuten langer aanhouden analWrite (RED, 255); analogWrite (GROEN, 255); } anders {// daarna zetten we ze terug naar off-state analogWrite (RED, 0); analogWrite (GROEN, 0); } } }
Valkuilen en toekomstige upgrades
Ik gebruik dit nu de afgelopen weken en het helpt echt om wakker te worden met een fris gevoel en op een goed moment; het nachtlampje werkt ook heel goed. Het is echter niet perfect, dus hier zijn een paar dingen die werk en lessen nodig hebben tijdens de bouw.
Bij het maken van dit project kwam ik veel problemen tegen bij het omgaan met grote aantallen, dus als u van plan bent de code te wijzigen, 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 nummer. Bijvoorbeeld, lang ongetekend variabelen moeten worden gebruikt om supergrote getallen op te slaan, zoals we te maken hebben met milliseconden, maar zelfs een getal zo klein als 60.000 kan niet worden opgeslagen als een gewoon geheel getal (een niet-ondertekende int zou voor maximaal 68.000 acceptabel zijn geweest). Het punt is, lees over uw variabele typen wanneer je grote getallen gebruikt, en als je vreemde 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, waardoor de kleinste hoeveelheid licht wordt uitgestraald, zelfs wanneer een digitalWrite (ROOD, 0) signaal wordt uitgezonden - ik denk niet dat het een hardwareprobleem is met de strips, omdat ze prima werken met de officiële controllers. Als iemand dit probleem kan oplossen, hieronder afgebeeld, zou ik u zeer dankbaar zijn. Ik heb geprobeerd weerstanden naar beneden te trekken en de uitgangsspanning van de Arduino-pinnen te beperken. Ik moet misschien een eenvoudig stroomschakelcircuit toevoegen om alleen spanning aan de LED-strip te leveren als dat echt nodig is; of het kunnen defecte MOSFET's zijn.
Voor toekomstig werk hoop ik een IR-ontvanger toe te voegen en enkele functies van de originele controller te dupliceren - op de minste mogelijkheid om kleuren te veranderen als licht voor algemeen gebruik, aangezien dit project op dit moment van de strip een speciale nacht maakt licht. Ik kan zelfs een automatische time-outfunctie van 30 minuten toevoegen.
Heeft u dit geprobeerd, verbeteringen aangebracht of andere ideeën opgedaan? Laat het me weten in de comments!
James heeft een BSc in Artificial Intelligence en is CompTIA A + en Network + gecertificeerd. Hij is de hoofdontwikkelaar van MakeUseOf en brengt zijn vrije tijd door met het spelen van VR paintball en bordspellen. Hij bouwt al pc's sinds hij een kind was.