Arduino Nachtlicht- und Sonnenaufgangswarnprojekt
Menschen sind natürlich programmiert, um mit dem Sonnenaufgang aufzuwachen; Leider wird das moderne Leben von einer willkürlichen Uhr diktiert und zwingt uns oft zum Aufwachen, wenn kein natürliches Licht vorhanden ist. Heute stellen wir einen Sonnenaufgangswecker her, der Sie sanft und langsam weckt, ohne auf eine anstößige Geräuschmaschine zurückzugreifen.
Wenn Sie einen Sonnenaufgangswecker machen möchten, sollten Sie sich diese iPhone- und Android-Apps ansehen. Verwenden Sie diese Apps, um besser zu schlafen [Android & iOS]. Verwenden Sie diese Apps, um besser zu schlafen. [Android & iOS] Nach einer Hektik Tag, ist das Beste, was Sie tun können, um einen günstigen Schlaf zu bekommen. Es tauchen immer wieder neue Studien auf, die zeigen, wie wichtig der Schlaf wirklich für eine Person ist und wie sie sich verbessern. Ermitteln Sie, wann Sie am besten durch Körperbewegungen geweckt werden. Kann eine App wirklich helfen, besser zu schlafen? Kann eine App wirklich helfen, besser zu schlafen? Ich war schon immer ein bisschen ein Schlaf-Experimentator. Ich hatte lange Zeit ein akribisches Traumtagebuch geführt und so viel wie möglich über das Schlafen gelernt. Es gibt ein… Weiterlesen, um sicherzustellen, dass Sie nicht von diesem fantastischen Traum abgehalten werden, sondern stattdessen aufwachen und sich hell und erfrischt fühlen - sie arbeiten wirklich.
Projektübersicht
Der Hauptteil des Projekts wird ein rund 5 Meter langes LED-Streifenlicht sein, das um das Bett gelegt wird. Wir versorgen diese mit einer externen 12-Volt-Versorgung, die mit einigen MOSFET-N-Transistoren geschaltet wird. Das Setup für diesen Teil ist identisch mit dem dynamischen Beleuchtungssystem. Erstellen Sie Ihre eigene dynamische Umgebungsbeleuchtung für ein Media Center. Erstellen Sie Ihre eigene dynamische Umgebungsbeleuchtung für ein Media Center. Wenn Sie viele Filme auf Ihrem PC oder Media Center ansehen, bin ich sicher, dass Sie sich dem Beleuchtungsdilemma gestellt haben; Schalten Sie alle Lichter vollständig aus? Halten Sie sie auf Hochtouren? Oder… Weiterlesen Ich habe vorher gebaut.
Das Timing wird ein Problem sein - da dies ein Prototyp ist, werde ich das Arduino so einstellen, dass es abwärts zählt, wann immer es zurückgesetzt wird. Theoretisch sollten wir nur ein oder zwei Sekunden pro Tag verlieren, aber im Idealfall würden wir ein “Echtzeituhr” Chip, um dies zuverlässiger zu machen. Der Sonnenaufgangsalarm wird 30 Minuten vor dem Aufwachen gestartet und erhöht langsam den Ausgangspegel, bis er eine Helligkeit von 100% erreicht hat. Dies sollte ausreichen, um uns aufzuwecken, obwohl es eine gute Idee ist, Ihren regulären Wecker so lange zu verwenden, bis Ihr Körper leer ist etwas gewöhnt sein.
Ich werde auch ein Nachtlicht in dieses Projekt einbauen, das Bewegungen erkennt und ein diskretes schwaches Licht unter dem Bett mit einer Auszeit von 3 Minuten aktiviert, getrennt von den LED-Leuchten, da beide meine Frau und mich aufwachen würden . Die Beleuchtung unter dem Bett wird ein handelsübliches Netzteil sein, also hacke ich ein Relais in eine Steckdose, um das ein- und auszuschalten. Wenn Sie unter keinen Umständen mit 110-240 V Wechselstrom arbeiten möchten (und dies ist in der Regel eine gute Regel), dann können Sie einen 433 MHz Funksender mit Schaltsteckdosen anschließen, wie im Raspberry Pi Arduino Home Automation-Projekt beschrieben Hausautomationshandbuch mit Raspberry Pi und Arduino Hausautomationshandbuch mit Raspberry Pi und Arduino Der Markt für Hausautomation ist mit teuren Verbrauchersystemen überflutet, die nicht miteinander kompatibel sind und deren Installation kostspielig ist. Wenn Sie einen Raspberry Pi und einen Arduino haben, können Sie im Grunde dasselbe bei… Read More .
Teileliste und Schema
- Arduino
- Set RGB-LED-Streifenlichter
- 12 Volt Stromversorgung
- 3 x MOSFET N-Transistoren (ich verwende den Typ STP16NF06FP)
- Relais und Steckdose oder drahtlos gesteuerte Steckdosen und geeigneter Sender
- Ihre Wahl des Nachtlichts (normales Netz mit Stecker ist in Ordnung)
- PIR-Bewegungssensor (HC-SR501) oder ein SC-04-Sonar (nicht so effektiv)
- Lichtsensor
- Projektcode - Lesen Sie jedoch weiter, um zu verstehen, wie Sie alles anpassen können.
Hier ist der komplette Schaltplan.
Verdrahtung eines Relais
Hinweis: Überspringen Sie diesen Abschnitt, wenn Sie die RGB-Lichter auch als Nachtlicht verwenden möchten. Dies ist speziell für das Einschalten eines separaten Netzlichts.
Zum Schalten der Netzspannung muss Ihr Relais für die Spannung ausgelegt sein - 110 V oder 240 V Wechselstrom Je nachdem, wo Sie wohnen - und mehr als die Gesamtstromstärke, die Sie wechseln werden. Die, die ich aus diesem Sensor-Pack verwendet habe (Haftungsausschluss: das ist mein Shop) ist 250VAC / 10A, also sollten wir sicher sein. Relais haben eine com Port, normalerweise in der Mitte, der mit dem stromführenden Kabel verbunden werden sollte, das in den Stecker gelangt; Verbinden Sie dann das Sockel-Live-Terminal mit dem NEIN (normalerweise offen). Ich sollte dir nicht sagen müssen, dies nicht zu tun, während es in eine Steckdose eingesteckt wird oder du stirbst. Wenn Sie Angst davor haben, mit dem Stromnetz zu spielen, verwenden Sie stattdessen drahtlose Steckdosen.
Die Masse- und Neutralleiter sollten direkt in die Steckdose laufen und das Relais nicht berühren. Sie haben möglicherweise keine Erdleitung in den USA. Es liegt in Ihrer Verantwortung, die Farbcodierung von Drähten in Ihrer Umgebung zu kennen - Wenn Sie sonst keine normale Steckdose in Ihrem Haus anschließen oder einen Stecker neu verkabeln könnten, versuchen Sie nicht, ein Relais in einen solchen einzubetten!
Um dies zu testen, verbinden Sie den Relaissignal-Pin mit 12 und führen Sie dann ein einfaches Blink-Programm aus, das so modifiziert ist, dass es an Pin 12 und nicht an 13 arbeitet. Ihre Steckdose sollte sich alle paar Sekunden ein- und ausschalten. Der Grund, warum ich Pin 13 nicht verwende, ist, dass während des Upload-Vorgangs die Onboard-LED in schneller Folge ausgelöst wird, um die serielle Aktivität anzuzeigen, wodurch das Relais ebenfalls aktiviert wird.
Timing richtig machen
Timing- und Uhrfunktionen sind ohne Zugriff auf eine Netzwerkverbindung oder dedizierte Geräte schwierig Echtzeituhr (Dazu gehören ihre eigenen Batterien, damit die Uhr auch dann noch läuft, wenn der Haupt-Arduino keinen Strom hat). Um die Kosten niedrig zu halten, werde ich schummeln. Ich werde eine Startzeit für den Arduino hartcodieren, um mit dem Countdown zu beginnen; Die Timings sind daher relativ zu dieser Startzeit. Alle 24 Stunden wird die Uhr zurückgesetzt. Der untenstehende Uhrfunktionscode stellt die globalen Variablen sicher currentMillis und currentMinutes sind jeden Tag richtig. Das Arduino sollte alle 45 Tage nicht mehr als ein paar Sekunden verlieren. Diese fest codierte Art des Timings ist jedoch insofern begrenzt, als ein Stromausfall oder ein versehentliches Zurücksetzen alles unterbricht. Dies ist 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 leicht verständlich sein.
void clock () if (millis ()> = previousMillis + 86400000) // ein ganzer Tag ist vergangen, setzen Sie die Uhr zurück; previousMillis + = 86400000; currentMillis = Millis () - vorhergehende Millis; // Dadurch bleibt unser currentMillis jeden Tag gleich currentMinutes = (CurrentMillis / 1000) / 60;
Nachtlichtfunktion
Ich habe die Hauptschleifen in verschiedene Funktionen unterteilt, so dass sie einfacher zu lesen, zu entfernen oder anzupassen ist. Das Nachtlicht() Diese Funktion funktioniert nur zwischen den Stunden, in denen der Arduino zurückgesetzt wurde (ich gehe davon aus, dass Sie dies wahrscheinlich vor oder nach dem Schlafengehen tun werden, wenn es dunkel ist) und bis der Sonnenaufgangsalarm beginnt. Ich hatte anfangs versucht, einen vom Licht abhängigen Widerstand zu verwenden, aber er ist nicht sehr empfindlich für blaues Licht (was die Farbe ist, die ich für das Nachtlicht verwende) und schwer zu kalibrieren ist. Die Verwendung der Uhr ist sowieso sinnvoller. Wir werden das Globale nutzen currentMinutes Variable, die jeden Tag zurückgesetzt wird.
Der PIR-Sensor kann ein wenig schrullig sein, wenn Sie noch nie zuvor einen verwendet haben. Die Verkabelung ist jedoch nicht schwierig - Sie werden feststellen VCC, GND, und AUS auf der Rückseite deutlich beschriftet. Es gibt auch zwei variable Widerstände; der mit RX bezeichnete Bereich bestimmt die Reichweite (bis zu etwa 7 m) und ein weiterer mit TX gekennzeichneter TX bestimmt die Verzögerung. Bei der niedrigsten Einstellung (ganz gegen den Uhrzeigersinn) beträgt die Verzögerung 5 Sekunden. Dies bedeutet, dass jede momentane Bewegung mindestens 5 Sekunden auslöst “auf” Zustand vom Sensor. Er bestimmt jedoch auch die Verzögerung zwischen den aktiven Zuständen. Wenn also 5 Sekunden vergangen sind und keine Bewegung erkannt wird, sendet der Sensor mindestens 5 Sekunden lang ein niedriges Signal, selbst wenn sich in dieser Zeit eine Bewegung befindet. Wenn Sie die Verzögerung mit ca. 30 Sekunden sehr hoch eingestellt haben, kann es den Anschein haben, als sei der Sensor defekt.
Wenn Sie alleine schlafen und die gleichen RGB-Streifenlichter sowohl für den Sonnenaufgangsalarm als auch für das Nachtlicht verwenden, sollten Sie den Code leicht genug einstellen können.
void nightlight () // Nur zwischen den Stunden des Reset -> Sonnenaufgangs arbeiten. 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 - auf diese Weise wird das Inkrement auf beiden Farbkanälen gleich sein. Wenn Sie feststellen, dass Sie zu früh aufgeweckt werden, sollten Sie mit einem tiefen Rot beginnen und in Richtung Gelb oder Weiß verblassen. Das Hochfahren habe ich nur linear verwendet - Sie möchten mit einer natürlicheren Kurve nach Helligkeitswerten untersuchen.
Die Funktion ist einfach: Sie ermittelt, wie viel Licht pro Sekunde inkrementiert werden soll. Nach 30 Minuten ist es vollständig hell; multipliziert dann, mit wie vielen Sekunden es gerade im Sonnenaufgang ist. Wenn es bereits bei voller Helligkeit ist, bleibt es weitere 10 Minuten eingeschaltet, um sicherzustellen, dass Sie in Betrieb sind (und wenn Sie immer noch nicht in Betrieb sind, sollten Sie wahrscheinlich einen Backup-Alarm haben)..
void sunrisealarm () // Jede Sekunde während der 30-Minuten-Periode sollte den Farbwert erhöhen um: float inkrement = (float) 255 / (30 * 60); // Rot 255, Grün 255 gibt volle Helligkeit Gelb, wenn (currentMinutes> = MinutenUntilSunrise) // Sonnenaufgang beginnt! float currentVal = (float) ((currentMillis / 1000) - (minutesUntilSunrise * 60)) * Inkrement; Serial.print ("Aktueller Wert für Sonnenaufgang:"); Serial.println (currentVal); // Schreibe während des Hochlaufs den aktuellen Wert von Minuten. X Helligkeitsinkrement 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 Verbesserungen
Ich benutze das jetzt schon seit ein paar Wochen und es hilft wirklich, erfrischt und zu einer anständigen Zeit aufzuwachen. Das Nachtlicht funktioniert auch sehr gut. Es ist jedoch nicht perfekt, also hier ein paar Dinge, die während des Baus Arbeit und Lektionen lernen müssen.
Bei diesem Projekt bin ich auf viele Probleme gestoßen, wenn es um den Umgang mit einer großen Anzahl ging. Wenn Sie also beabsichtigen, den Code zu ändern, denken Sie daran. In C-Sprache ist das Die Eingabe Ihrer Variablen ist sehr wichtig - Eine Nummer ist nicht immer nur eine Nummer. Zum Beispiel, unsigniert lang Variablen sollten verwendet werden, um sehr große Zahlen zu speichern, wie wir es in Millisekunden machen, aber selbst eine Zahl von 60.000 kann nicht als reguläre ganze Zahl gespeichert werden (Ein vorzeichenloses Int wäre für bis zu 68.000 akzeptabel gewesen). Der Punkt ist, lesen Sie sich die Variablentypen durch, wenn Sie große Zahlen verwenden. Wenn Sie seltsame Fehler finden, liegt dies wahrscheinlich daran, dass eine Ihrer Variablen nicht genügend Bits enthält!
Ich habe auch ein Problem mit sehr geringen Helligkeitsspannungslecks gefunden, was dazu führt, dass selbst wenn ein kleinster Lichtanteil emittiert wird digitalWrite (ROT, 0) Signal wird ausgegeben - Ich denke nicht, dass es ein Hardwareproblem mit den Streifen gibt, da sie mit den offiziellen Controllern gut funktionieren. Wenn jemand dieses Problem lösen kann, wäre ich sehr dankbar. Ich habe Pulldown-Widerstände ausprobiert und die Ausgangsspannung der Arduino-Pins begrenzt. Möglicherweise muss ich 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.
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 Möglichkeit, Farben als allgemeines Licht zu ändern, da dieses Projekt den Streifen in eine Nacht verwandelt Licht. Ich kann sogar eine automatische 30-Minuten-Timeout-Funktion hinzufügen.
Haben Sie dies versucht, Verbesserungen vorgenommen oder haben Sie andere Ideen? Lass es mich in den Kommentaren wissen!
Erfahren Sie mehr über: Arduino.