Arduino Nachtlicht und Sonnenaufgang Alarm-Projekt

Heute machen wir einen Sonnenaufgangswecker, der Sie sanft und langsam aufweckt, ohne auf eine offensive Geräuschmaschine zu setzen.

Heute machen wir einen Sonnenaufgangswecker, der Sie sanft und langsam aufweckt, ohne auf eine offensive Geräuschmaschine zu setzen.
Werbung

Menschen sind natürlich darauf programmiert, mit dem Sonnenaufgang aufzuwachen; Leider wird das moderne Leben von einer willkürlichen Uhr bestimmt, die uns oft dazu bringt, aufzuwachen, wenn es kein natürliches Licht gibt. Heute machen wir einen Sonnenaufgangswecker, der Sie sanft und langsam aufweckt, ohne auf eine offensive Geräuschmaschine zu setzen.

Wenn dir ein Sonnenaufgang Wecker etwas zu viel ist, dann schau dir diese iPhone und Android Apps an Mit diesen Apps kannst du besser schlafen [Android & iOS] Verwende diese Apps, um dich besser schlafen zu lassen [Android & iOS] Nach einer Hektik Tag, das Beste, was Sie tun können, ist eine günstige Menge Schlaf zu bekommen. Es gibt immer neue Studien, die beweisen, wie wichtig Schlaf wirklich für eine Person ist, die Verbesserung ... Lesen Sie mehr, die erkennen, wenn Sie am besten durch Körperbewegungen aufwachen Kann eine App Ihnen wirklich helfen, besser zu schlafen? Kann eine App Ihnen wirklich helfen, besser zu schlafen? Ich war schon immer ein bisschen ein Schlafexperimentator, hatte für einen Großteil meines Lebens ein akribisches Traumtagebuch geführt und so viel wie möglich darüber gelernt, in diesem Prozess zu schlafen. Es gibt einen ... Lesen Sie mehr, um sicherzustellen, dass Sie nicht von diesem tollen Traum weggezogen werden, sondern stattdessen, sich hell und erfrischt zu fühlen - sie arbeiten wirklich.

Projektskizze

Der Hauptteil des Projekts wird ein 5 Meter langes LED-Streifenlicht sein, das um das Bett gelegt wird. Wir werden diese mit einer externen 12-Volt-Versorgung versorgen, die mit einigen MOSFET-N-Transistoren geschaltet wird. Das Setup für diesen Teil wird identisch mit dem dynamischen Beleuchtungssystem sein Bauen Sie Ihre eigene dynamische Ambient Beleuchtung für ein Media Center Erstellen Sie Ihre eigene dynamische Ambient Beleuchtung für ein Media Center Wenn Sie eine Menge Filme auf Ihrem PC oder Media Center ansehen, bin ich sicher, dass du dem Beleuchtungsdilemma gegenüberstehst; Schalte du alle Lichter aus? Halten Sie sie auf Hochtouren? Oder ... Read More Ich habe vorher gebaut.

Timing wird ein Problem sein - da dies ein Prototyp ist, setze ich den Arduino so, dass er rückwärts zählen kann, sobald er zurückgesetzt wird. Theoretisch sollten wir nur ein oder zwei Sekunden pro Tag verlieren, aber idealerweise würden wir einen "Echtzeituhr" Chip einbauen, um dies zuverlässiger zu machen. Der Sonnenaufgangsalarm beginnt 30 Minuten vor der Weckzeit und erhöht langsam den Ausgangspegel, bis er 100% hell ist. Dies sollte ausreichen, um uns aufzuwecken, obwohl es eine gute Idee ist, den normalen Wecker solange zu benutzen, bis sich der Körper befindet etwas gewöhnt sein.

Ich werde auch ein Nachtlicht in dieses Projekt integrieren, das Bewegung erkennt und ein diskretes schwaches Licht unter dem Bett mit einer 3-minütigen Auszeit aktiviert, getrennt von den LED-Lichtern, da dies meine Frau und mich zum Aufwachen veranlassen würde . Die Unterbettbeleuchtung wird ein kommerzielles Netzteil sein, also hacke ich ein Relais in eine Steckdose, um es ein- und auszuschalten. Wenn Sie unter keinen Umständen mit 110-240 V Wechselstrom arbeiten möchten (und das ist in der Regel eine gute Regel), dann verdrahten Sie einen 433 MHz-Funksender mit Schaltsteckdosen, wie auf dem Arduino-Hausautomationsprojekt Raspberry Pi beschrieben Home Automation Guide Mit Raspberry Pi und Arduino Home Automation Guide Mit Raspberry Pi und Arduino Der Heimautomatisierungsmarkt ist mit teuren Verbrauchersystemen überschwemmt, die miteinander inkompatibel und teuer zu installieren sind. Wenn Sie einen Raspberry Pi und einen Arduino haben, können Sie im Grunde das Gleiche erreichen bei ... Lesen Sie mehr.

Teileliste und Schema

  • Arduino
  • Set von RGB LED-Lichterketten
  • 12-Volt-Stromversorgung
  • 3 x MOSFET-N-Transistoren (ich verwende den Typ STP16NF06FP)
  • Relais- und Netzsteckdose oder kabellose Steckdosen und geeigneter Sender
  • Ihre Wahl des Nachtlichtes (normale Netzspannung mit Stecker ist in Ordnung)
  • PIR-Bewegungssensor (HC-SR501) oder ein SC-04-Sonar (nicht so effektiv)
  • Lichtsensor
  • Projektcode - aber lesen Sie weiter, um sicherzustellen, dass Sie verstehen, wie Sie alles anpassen können.

Hier ist das komplette Schema.

Sonnenaufgang-Alarm-Schaltung

Verdrahtung eines Relais

Hinweis : Überspringen Sie diesen Abschnitt, wenn Sie die RGB-Lichter auch als Nachtlicht verwenden möchten - dies ist speziell zum Einschalten einer separaten netzbetriebenen Leuchte gedacht.

Zum Schalten der Netzspannung muss Ihr Relais für die Spannung - 110 V oder 240 V AC, je nachdem, wo Sie leben - und mehr als die gesamte Stromstärke, die Sie schalten möchten, ausgelegt sein. Der, den ich von diesem Sensorpack (Disclaimer: das ist mein Geschäft) benutzt habe, ist 250VAC / 10A, also sollten wir in Sicherheit sein. Relais haben einen COM- Port, normalerweise in der Mitte, der mit dem stromführenden Kabel verbunden sein sollte, das in den Stecker kommt; Verbinden Sie dann die Steckdose mit dem NO (normalerweise offen). Ich sollte dir nicht sagen müssen, dass du es nicht tun sollst, wenn es an eine Steckdose angeschlossen ist, oder du wirst sterben. Wenn Sie Angst haben, mit dem Stromnetz zu arbeiten, verwenden Sie stattdessen kabellose Steckdosen.

Relais-Verkabelung

Die Erd- und Neutralleiterkabel sollten direkt zur Steckdose führen und das Relais nicht berühren. Möglicherweise haben Sie in den USA keine Erdleitung. Es liegt in Ihrer Verantwortung, die Farbcodierung der Kabel in Ihrem lokalen Bereich zu kennen - wenn Sie sonst keine normale Steckdose in Ihrem Haus anschließen oder einen Stecker neu verdrahten könnten, versuchen Sie nicht, ein Relais in einen zu integrieren!

Um zu testen, verdrahten Sie den Relais-Signal-Pin auf 12, und führen Sie dann ein einfaches Blink-Programm aus, das so modifiziert wurde, dass es auf Pin 12 funktioniert, nicht auf 13, wie es standardmäßig ist. Ihre Steckdose sollte alle paar Sekunden ein- und ausgeschaltet werden. Der Grund, warum ich Pin 13 nicht benutze, ist, dass während des Uploads die Onboard-LED schnell hintereinander aufleuchtet, um die serielle Aktivität anzuzeigen, was ebenfalls dazu führen würde, dass das Relais aktiviert wird.

Timing richtig machen

Timing- und Uhrfunktionen sind schwierig ohne Zugang zu einer Netzwerkverbindung oder einer dedizierten Echtzeituhr (diese beinhalten ihre eigenen Batterien, um die Uhr in Gang zu halten, selbst wenn der Haupt-Arduino keinen Strom hat). Um die Kosten niedrig zu halten, werde ich betrügen. Ich werde eine Startzeit für den Arduino hartcodieren, um seinen Countdown zu beginnen; Timings werden daher relativ zu dieser Startzeit sein. Alle 24 Stunden wird die Uhr zurückgesetzt. Der unten stehende Funktionscode stellt sicher, dass die globalen Variablen currentMillis und currentMinutes jeden Tag korrekt sind. Der Arduino sollte nicht alle 45 Tage mehr als ein paar Sekunden verlieren; Allerdings ist dieser hartcodierte Timing-Stil ziemlich begrenzt, da ein Stromausfall oder eine versehentliche Rückstellung alles kaputt machen wird, also ist dies sicherlich ein Bereich, der verbessert werden könnte. Wenn das Timing nicht mehr synchron ist, setzen Sie das Arduino einfach zur eingestellten Startzeit zurück.

Der Code sollte einfach zu verstehen sein.

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

Nachtlicht-Funktion

Ich habe die Hauptschleifen in verschiedene Funktionen getrennt, so dass es leichter zu lesen und zu entfernen oder anzupassen ist. Die Funktion nightLight () funktioniert nur in den Stunden, in denen der Arduino zurückgesetzt wurde (ich nehme an, dass Sie dies wahrscheinlich zur oder um die Schlafenszeit tun werden, wenn es dunkel ist) und bis der Sonnenaufgangsalarm ausgelöst wird. Ich hatte anfangs versucht, einen lichtabhängigen Widerstand zu verwenden, aber sie sind nicht sehr empfindlich gegenüber blauem Licht (was zufällig die Farbe ist, die ich für das Nachtlicht verwende) und schwierig zu kalibrieren. Die Verwendung der Uhr macht sowieso mehr Sinn. Wir verwenden die globale Variable currentMinutes, die jeden Tag zurückgesetzt wird.

Der PIR-Sensor kann ein wenig eigenartig sein, wenn Sie noch nie zuvor einen verwendet haben, obwohl die Verkabelung schwierig ist - Sie werden feststellen, dass VCC, GND und OUT auf der Rückseite deutlich gekennzeichnet sind. Es gibt zwei variable Widerstände auch dir; der mit RX gekennzeichnete Bereich bestimmt die Entfernung (bis zu etwa 7 m), und ein anderer markierter TX bestimmt die Verzögerung. Die Verzögerung beträgt 5 Sekunden bei der niedrigsten Einstellung (vollständig gegen den Uhrzeigersinn) und bedeutet, dass jede momentane Bewegung mindestens 5 Sekunden lang vom Sensor "Ein" ausgelöst wird. Es wird jedoch auch die Verzögerung zwischen den aktiven Zuständen bestimmt. Wenn 5 Sekunden verstreichen und keine Bewegung erkannt wird, sendet der Sensor für mindestens 5 Sekunden ein niedriges Signal, auch wenn während dieser Zeit eine Bewegung erfolgt. Wenn Sie die Verzögerung bei etwa 30 Sekunden sehr hoch eingestellt haben, kann es so aussehen, als wäre der Sensor defekt.

Pir-Sensor

Wenn Sie alleine schlafen und es Ihnen nichts ausmacht, die gleichen RGB-Lichter für den Sonnenaufgangs- und das Nachtlicht zu verwenden, sollten Sie den Code leicht genug einstellen können.

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

Sonnenaufgang Alarm

Der Einfachheit halber verwende ich den RGB-Farbwert 255, 255, 0 für einen tiefgelben Sonnenaufgang - so wird die Schrittweite beider Farbkanäle gleich sein. Wenn Sie feststellen, dass es Sie zu früh aufweckt, sollten Sie mit einem tiefen Rot beginnen und in Richtung Gelb oder Weiß verblassen. Die Ramp-Up-Funktion, die ich gerade verwendet habe - Sie sollten vielleicht eine natürlichere Kurve für Helligkeitswerte untersuchen.

Die Funktion ist einfach - es ermittelt, um wie viel das Licht in jeder Sekunde erhöht werden soll, so dass es nach 30 Minuten in voller Helligkeit ist; dann vervielfacht sich das um so viele Sekunden, wie es momentan im Sonnenaufgang ist. Wenn es bereits bei voller Helligkeit ist, bleibt es für weitere 10 Minuten eingeschaltet, um sicherzustellen, dass Sie oben sind (und wenn Sie immer noch nicht oben sind, sollten Sie wahrscheinlich einen Backup-Alarm an Ort und Stelle haben).

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

Fallstricke und zukünftige Upgrades

Ich benutze das jetzt seit ein paar Wochen und es hilft wirklich aufzustehen, sich erfrischt und zu einer anständigen Zeit zu fühlen; das Nachtlicht funktioniert auch sehr gut. Es ist jedoch nicht perfekt, also hier ein paar Dinge, die Arbeit und Lektionen während der Konstruktion gelernt haben.

Sonnenaufgang-Alarm

Bei der Erstellung dieses Projekts stieß ich auf viele Probleme im Umgang mit großen Zahlen. Wenn Sie also den Code ändern möchten, beachten Sie dies bitte. In der Sprache C ist die Eingabe Ihrer Variablen sehr wichtig - eine Zahl ist nicht immer nur eine Zahl. Zum Beispiel sollten unsigned long Variablen verwendet werden, um super große Zahlen zu speichern, wie wir es mit Millisekunden zu tun haben, aber selbst eine Zahl von 60.000 kann nicht als reguläre ganze Zahl gespeichert werden (ein vorzeichenloser int wäre für bis zu 68.000 akzeptabel gewesen) ) . Der Punkt ist, lesen Sie Ihre Variablen-Typen, wenn Sie große Zahlen verwenden, und wenn Sie seltsame Fehler finden, ist es wahrscheinlich, weil eine Ihrer Variablen nicht genug Bits hat!

Ich habe auch ein Problem mit Spannungsverlusten von sehr geringer Helligkeit gefunden - das führt zu der kleinsten Menge an Licht, die emittiert wird, selbst wenn ein DigitalWrite (RED, 0) -Signal ausgestrahlt wird. Ich glaube nicht, dass es ein Hardwareproblem mit den Streifen ist, da sie funktionieren gut mit den offiziellen Controllern. Wenn jemand dieses Problem lösen könnte, wäre ich sehr dankbar. Ich habe Pulldown-Widerstände ausprobiert und die Ausgangsspannung von den Arduino-Pins begrenzt. Ich muss möglicherweise einen einfachen Stromschaltkreis hinzufügen, um die LED-Leiste nur dann mit Spannung zu versorgen, wenn sie tatsächlich benötigt wird. oder es könnten fehlerhafte MOSFETs sein.

kleines Leck

Für die zukünftige Arbeit hoffe ich, einen IR-Empfänger hinzuzufügen und einige der Funktionen des ursprünglichen Controllers zu duplizieren - zumindest die Fähigkeit, Farben als allgemeines Licht zu ändern, da gerade dieses Projekt den Streifen in eine spezielle Nacht verwandelt Licht. Ich kann sogar eine automatische 30-Minuten-Timeout-Funktion hinzufügen.

Hast du das versucht, Verbesserungen vorgenommen oder andere Ideen bekommen? Lass es mich in den Kommentaren wissen!

In this article