Inhaltsverzeichnis:

Wakeup Light - Gunook
Wakeup Light - Gunook

Video: Wakeup Light - Gunook

Video: Wakeup Light - Gunook
Video: Shop With Me For Kpop Photocards! ✰ Completing Kpop Photocard Collections With Buyee! 2024, November
Anonim
Aufwachlicht
Aufwachlicht

Während ich dieses instructable schreibe, ist es Mitte Winter auf der Nordhalbkugel und das bedeutet kurze Tage und lange Nächte. Ich bin es gewohnt, um 06:00 Uhr aufzustehen und im Sommer scheint bis dahin die Sonne. Im Winter wird es jedoch um 09:00 hell, wenn wir Glück haben, einen Tag zu haben, an dem es nicht bewölkt ist (was … nicht oft vorkommt).

Vor einiger Zeit habe ich von einem „Wecklicht“von Philips gelesen, das in Norwegen verwendet wurde, um einen sonnigen Morgen zu simulieren. Ich habe nie einen gekauft, aber ich dachte immer daran, einen zu machen, weil es mehr Spaß macht, einen selbst zu machen, als ihn nur zu kaufen.

Lieferungen:

Bilderrahmen "Ribba" 50 x 40 cm von IKEA

perforierte Hartfaserplatte aus dem Baumarkt

STM8S103 Entwicklungsboard über Ebay oder andere

DS1307 Echtzeituhr (Mouser, Farnell, Conrad usw.)

32768 Hz Uhrenglas (Mouser, Farnell, Conrad usw.)

3V Lithium-Knopfzelle + Knopfzellenhalter

BUZ11 oder IRLZ34N N-Kanal-MOSFETs (3x)

BC549 (oder jeder andere NPN-Transistor)

so viele weiße, rote, blaue, grüne usw. LEDs wie Sie möchten

einige Widerstände und Kondensatoren (siehe Schema)

Powerbrick, 12V bis 20V, 3A oder mehr (z. B. altes Laptop-Netzteil)

Schritt 1: Das Aufstehen (ein wenig) erleichtern

Das Aufstehen (ein wenig) erleichtern
Das Aufstehen (ein wenig) erleichtern

Die Idee ist, dass es schwierig ist, morgens aus dem Bett zu kommen, wenn es noch dunkel ist. Und wenn Sie in der Nähe oder sogar über dem Polarkreis wohnen, wird es sehr lange dunkel. An Orten wie Tromsö in Norwegen wird es überhaupt nicht hell, da dort die Sonne Mitte November untergeht und Mitte Januar wieder auftaucht.

Philips simulierte also den Sonnenaufgang.

Philips erhöht langsam die Helligkeit einer Lampe, die wahrscheinlich aus mehreren LEDs besteht, aber hinter einem einzigen Diffusor versteckt ist. Ihre Zeit vom Ausschalten bis zur vollen Helligkeit dauert 30 Minuten.

Die Philips Wakeup Lights sind nicht so teuer, haben aber nur eine einzige Farbe und sehen etwas klein aus. Ich glaube, ich kann es besser.

Schritt 2: Mehr Farbe

Mehr Farbe
Mehr Farbe

Mein Wakeup Light verwendet vier Farben: Weiß, Rot, Blau und Grün. Zuerst kommen die weißen LEDs, dann die roten und zuletzt ein paar blaue und grüne LEDs. Meine Idee war, dass ich nicht nur die Helligkeitszunahme, sondern auch die Verschiebung der Morgenlichtfarbe simulieren könnte, indem ich mit etwas Weiß beginne, etwas später Rot hinzufüge und am Ende Blau und Grün mische. Ich bin mir nicht sicher, ob es tatsächlich dem Morgenlicht ähnelt, aber ich mag das farbenfrohe Display, wie es jetzt ist.

Meins ist auch schneller als das Philips Wakeup-Licht, anstatt der 30 Minuten des Philips-Lichts geht meins in weniger als 5 Minuten von 0% auf 100% Helligkeit. Also meine Sonne geht viel schneller auf.

HINWEIS:

Es ist SEHR schwer, Bilder von meinem Wakeup Light zu machen, ich habe es mit mehreren Kameras und Smartphones versucht, aber alle Bilder, die ich gemacht habe, werden der Realität nicht gerecht.

Schritt 3: Sigmoidkurve, Flackern und "Auflösung"

Sigmoidkurve, Flackern und
Sigmoidkurve, Flackern und

Natürlich wollte ich die Aufhellung so glatt wie möglich gestalten. Das menschliche Auge hat eine logarithmische Empfindlichkeit, was bedeutet, dass es bei völliger Dunkelheit empfindlicher ist als bei vollem Tageslicht. Ein sehr kleiner Anstieg der Helligkeit bei niedrigen Pegeln „fühlt“sich genauso an wie ein viel größerer Schritt, wenn das Licht beispielsweise eine Helligkeit von 40% hat. Um dies zu erreichen, habe ich eine spezielle Kurve namens Sigmoid (oder S-Kurve) verwendet. Diese Kurve beginnt als Exponentialkurve, die sich zur Hälfte wieder abflacht. Ich fand, dass es eine sehr schöne Möglichkeit ist, die Intensität zu erhöhen (und zu verringern).

Die Taktfrequenz des Mikrocontrollers (und der Timer) beträgt 16 MHz und ich verwende die maximale Auflösung von TIMER2 (65536), um drei Pulsbreitensignale (PWM) zu erzeugen. Daher kommen Impulse 16000000 / 65536 = 244 Mal pro Sekunde. Das ist weit über der Grenze der Augen, um ein Flimmern zu sehen.

Die LEDs werden also mit einem PWM-Signal gespeist, das mit diesem 16-Bittimer des STM8S103-Mikrocontrollers erzeugt wird. Dieses PWM-Signal kann mindestens eine Impulslänge lang EIN sein und die verbleibenden 65535 Impulslängen ausgeschaltet sein.

Die mit diesem PM-Signal verbundenen LEDs leuchten dann 1/65536-te der Zeit: 0,0015%

Maximal sind sie ON 65536/65536-te der Zeit: 100%.

Schritt 4: Elektronik

Elektronik
Elektronik
Elektronik
Elektronik
Elektronik
Elektronik
Elektronik
Elektronik

Mikrocontroller

Das Gehirn des Wakeup Lights ist ein STM8S103 Mikrocontroller von STMicroelectronics. Ich verwende gerne Teile, die gerade genug Fähigkeiten für einen Job haben. Für eine einfache Aufgabe wie diese ist es nicht notwendig, STM32-Mikrocontroller (meine anderen Favoriten) zu verwenden, aber ein Arduino UNO reichte nicht aus, da ich drei PWM-Signale mit 16-Bit-Auflösung wollte und es keinen Timer mit drei Ausgangskanälen auf einem UNO gibt.

Echtzeituhr

Die Zeit wird von einer DS1307 Echtzeituhr gelesen, die mit einem 32768 Hz Quarz arbeitet und über eine 3V Pufferbatterie verfügt.

Die Einstellung der aktuellen Uhrzeit, des Tages und der Weckzeit erfolgt über zwei Tasten und wird auf einem 16 x 2 LCD-Zeichen-Display angezeigt. Damit mein Schlafzimmer nachts wirklich dunkel bleibt, wird die Hintergrundbeleuchtung des LCD-Displays nur dann eingeschaltet, wenn die LEDs heller als die Hintergrundbeleuchtung sind und Sie Uhrzeit, Tag und Weckzeit einstellen.

Leistung

Der Strom kommt von einem alten Laptop-Netzteil, meins produziert 12V und kann 3A liefern. Wenn Sie eine andere Stromversorgung haben, kann es erforderlich sein, die Widerstände in Reihe mit den LED-Strings einzustellen. (Siehe unten)

LEDs

Die LEDs sind an die 12V-Versorgung angeschlossen, der Rest der Elektronik arbeitet auf 5V mit einem 7805-Linearregler. Im Schaltplan steht, dass ich einen TO220-Regler verwende, der nicht benötigt wird, da der Mikrocontroller, das Display und die Echtzeituhr nur wenige Milliampere verbrauchen. Meine Uhr verwendet eine kleinere TO92-Version des 7805, die 150 mA liefern kann.

Das Schalten der LED-Strings erfolgt mit N-Kanal MOSFETs. Auch hier zeigt der Schaltplan andere Geräte als ich verwendet habe. Ich hatte zufällig genau drei sehr alte BUZ11-MOSFETs anstelle der neueren IRLZ34N-MOSFETs. Sie funktionieren gut

Natürlich können Sie so viele LEDs einsetzen, wie Sie möchten, solange die MOSFETs und das Netzteil den Strom verkraften. Im Schaltplan habe ich nur einen String einer beliebigen Farbe gezeichnet, in Wirklichkeit gibt es mehrere von jeder Farbe parallel zu den anderen Strings dieser Farbe.

Schritt 5: Widerstände (für die LEDs)

Widerstände (für die LEDs)
Widerstände (für die LEDs)

Über die Widerstände in den LED-Strings. Weiße und blaue LEDs haben normalerweise eine Spannung von 2,8 V, wenn sie bei voller Helligkeit sind.

Rote LEDs haben nur 1,8 V, meine grünen LEDs haben bei voller Helligkeit 2 V darüber.

Eine andere Sache ist, dass ihre volle Helligkeit nicht gleich ist. Es brauchte also einige Experimente, um sie (in meinen Augen) gleich hell zu machen. Indem die LEDs bei voller Helligkeit gleich hell sind, sehen sie auch bei niedrigeren Werten gleich hell aus, das Pulsweitensignal schaltet sie immer bei voller Helligkeit ein, aber während längerer und kürzerer Zeiten kümmern sich Ihre Augen um die Mittelwertbildung.

Beginnen Sie mit einer solchen Berechnung. Das Netzteil liefert (in meinem Fall) 12V.

Vier weiße LEDs in Reihe benötigen 4 x 2,8 V = 11,2 V, so dass 0,8 V für den Widerstand übrig bleiben.

Ich hatte festgestellt, dass sie bei 30 mA hell genug waren, also muss der Widerstand sein:

0,8 / 0,03 = 26,6 Ohm. Im Schaltplan sehen Sie, dass ich einen 22-Ohm-Widerstand eingebaut habe, wodurch die LEDs etwas heller werden.

Die blauen LEDs waren bei 30 mA zu hell, aber im Vergleich zu den weißen LEDs bei 15 mA hatten sie bei 15 mA auch etwa 2,8 V über sich, sodass die Berechnung 4 x 2,8 V = 11,2 V betrug, die wiederum 0,8 V übrig ließen

0,8 / 0,015 = 53,3 Ohm, also habe ich einen 47 Ohm Widerstand gewählt.

Meine roten LEDs brauchen auch etwa 15 mA, um genauso hell zu sein wie die anderen, aber sie haben bei diesem Strom nur 1,8 V über ihnen. So konnte ich mehr in Reihe schalten und habe noch etwas „Platz“für den Widerstand.

Sechs rote LEDs gaben mir 6 x 1,8 = 10,8 V, also über dem Widerstand 12 – 10,8 = 1,2 V

1,2 / 0,015 = 80 Ohm, ich habe es zu 68 Ohm gemacht. Genau wie die anderen, ein kleines bisschen heller.

Die grünen LEDs, die ich verwendet habe, sind mit etwa 20 mA genauso hell wie die anderen. Ich brauchte nur ein paar (genau wie die blauen) und entschied mich, vier in Reihe zu stellen. Bei 20 mA haben sie 2, 1 V über sich, was 3 x 2,1 = 8,4 V. ergibt

12 – 8,4 = 3,6 V für den Widerstand. Und 3,6 / 0,02 = 180 Ohm.

Wenn Sie dieses Wecklicht bauen, ist es unwahrscheinlich, dass Sie das gleiche Netzteil haben, Sie müssen die Anzahl der in Reihe geschalteten LEDs und die benötigten Widerstände anpassen.

Ein kleines Beispiel. Angenommen, Sie haben ein Netzteil mit 20 V. Ich würde mich dafür entscheiden, 6 blaue (und weiße) LEDs in Reihe zu schalten, 6 x 3 V = 18 V, also 2 V für den Widerstand. Und sagen wir, Sie mögen die Helligkeit bei 40 mA. Der Widerstand muss dann 2V / 0,04 = 50 Ohm betragen, ein 47 Ohm Widerstand ist in Ordnung.

Ich empfehle, mit normalen (5 mm) LEDs nicht höher als 50 mA zu gehen. Manche können mehr, aber ich bin gerne auf der sicheren Seite.

Schritt 6: Software

Der gesamte Code kann heruntergeladen werden von:

gitlab.com/WilkoL/wakeup_light_stm8s103

Halten Sie den Quellcode offen, neben dem Rest dieses instructable, wenn Sie der Erklärung folgen möchten.

Haupt c

Main.c richtet zuerst die Uhr, Timer und andere Peripheriegeräte ein. Die meisten "Treiber", die ich mit der Standardbibliothek von STMicroelectronics geschrieben habe, und wenn Sie Fragen zu ihnen haben, schreiben Sie sie in einen Kommentar unter der Anleitung.

Eeprom

Ich habe den "text to display"-Code belassen, mit dem ich Texte als Kommentare in das Eeprom des STM8S103 eingefügt habe. Ich war mir nicht sicher, ob ich genügend Flash-Speicher für meinen gesamten Code hatte, also versuchte ich, so viel wie möglich in das Eeprom zu schreiben, um alles Flash für das Programm zu haben. Am Ende erwies sich das als nicht notwendig und ich habe den Text auf Flash verschoben. Aber ich habe es als auskommentierten Text in der main.c-Datei belassen. Es ist schön, es zu haben, wenn ich später etwas Ähnliches machen muss (in einem anderen Projekt)

Das Eeprom wird weiterhin verwendet, jedoch nur zum Speichern der Aufwachzeit.

Einmal pro Sekunde

Nach dem Einrichten der Peripheriegeräte prüft der Code, ob eine Sekunde vergangen ist (über einen Timer).

Speisekarte

Wenn dies der Fall ist, überprüft es, ob eine Taste gedrückt wurde, wenn ja, gelangt es in das Menü, in dem Sie die aktuelle Uhrzeit, den Wochentag und die Weckzeit einstellen können. Denken Sie daran, dass es etwa 5 Minuten dauert, um vom Ausschalten auf die volle Helligkeit zu wechseln, also stellen Sie die Aufwachzeit etwas früher ein.

Die Weckzeit wird im Eeprom gespeichert, damit es auch nach einem Stromausfall „weiß“, wann Sie geweckt werden müssen. Die aktuelle Uhrzeit wird natürlich in der Echtzeituhr gespeichert.

Vergleich aktuelle & Aufwachzeit

Wenn keine Taste gedrückt wurde, überprüft es die aktuelle Uhrzeit und vergleicht diese mit der Weckzeit und dem Wochentag. Ich will nicht, dass es mich am Wochenende weckt:-)

Meistens muss nichts getan werden, also setzt es die Variable „leds“auf OFF, sonst auf ON. Diese Variable wird zusammen mit dem Signal „change_intensity“geprüft, das ebenfalls von einem Timer kommt und 244 Mal pro Sekunde aktiv ist. Wenn die Variable „LEDs“eingeschaltet ist, wird die Intensität 244 Mal pro Sekunde erhöht und wenn sie ausgeschaltet ist, wird sie 244 Mal pro Sekunde verringert. Die Erhöhung erfolgt jedoch in einzelnen Schritten, wobei die Verringerung in 16er-Schritten erfolgt, was bedeutet, dass das Wakeup-Licht, wenn es hoffentlich seine Arbeit getan hat, 16-mal schneller, aber immer noch reibungslos ausgeschaltet wird.

Geschmeidigkeit und OUT OF MEMORY

Die Glätte kommt aus der Sigmoidkurvenberechnung. Die Berechnung ist recht einfach, muss aber wegen der exp()-Funktion in Gleitkommavariablen (doubles) durchgeführt werden, siehe Datei sigmoid.c.

In der Standardsituation unterstützt der Cosmic Compiler/Linker keine Gleitkommavariablen. Das Einschalten ist einfach (sobald Sie es gefunden haben), aber es geht mit einer Erhöhung der Codegröße einher. Diese Zunahme war zu groß, um den Code in Kombination mit der Funktion sprintf() in den Flash-Speicher zu passen. Und diese Funktion wird benötigt, um Zahlen in Text für die Anzeige umzuwandeln.

Itoa()

Um dieses Problem zu beheben, habe ich die Funktion itoa() erstellt. Dies ist eine Integer-to-Ascii-Funktion, die ziemlich häufig vorkommt, aber weder in der STMicroelectronics-Standardbibliothek noch in den Cosmic-Bibliotheken enthalten ist.

Schritt 7: IKEA (was würden wir ohne sie tun)

IKEA (was würden wir ohne sie tun)
IKEA (was würden wir ohne sie tun)
IKEA (was würden wir ohne sie tun)
IKEA (was würden wir ohne sie tun)
IKEA (was würden wir ohne sie tun)
IKEA (was würden wir ohne sie tun)

Das Bild von wurde von IKEA gekauft. Es ist ein Ribba-Rahmen von 50 x 40 cm. Dieser Rahmen ist ziemlich dick und eignet sich hervorragend, um Elektronik dahinter zu verstecken. Anstelle eines Posters oder Bildes habe ich ein Stück perforierte Hartfaserplatte eingelegt. Sie können es im Baumarkt kaufen, wo es manchmal "Bettbrett" genannt wird. Es hat kleine Löcher, die es ideal zum Einsetzen von LEDs machen. Leider waren die Löcher in meinem Board etwas größer als 5 mm, so dass ich Heißkleber verwenden musste, um die LEDs zu "montieren".

Für das 16x2 Display habe ich ein rechteckiges Loch in die Mitte der Hartplatte gebohrt und eingedrückt. Die Platine mit der gesamten Elektronik hängt an diesem Display, es ist an nichts anderem befestigt.

Die perforierte Hartfaserplatte wurde schwarz und aber hinter der Matte spritzlackiert. Ich habe zwei Löcher in den Rahmen für die Knöpfe gebohrt, um die Uhrzeit und das Datum einzustellen, da der Rahmen ziemlich dick ist, musste ich die Löcher auf der Innenseite des Rahmens erweitern, damit die Knöpfe genug herausragen.

Empfohlen: