Countdown-Wecker mit dem STM32 für Schlafzeit-Experimente
Ich bin kein Mensch, der immer zur selben Zeit ins Bett geht und bei dem ein Wecker, der immer zur selben Zeit in der Früh klingelt Sinn machen würden.Außerdem ist es bei mir so, dass ich unausgeschlafen kaum zu gebrauchen bin. Habe ich zu wenig Schlaf abbekommen, dann bin ich den ganzen folgenden Tag müde und mein Gehirn scheint auf Sparflamme zu laufen. Komplizierte Algorithmen auszutüfteln oder kreativ zu sein fällt dann sehr schwer.
Momentan steht bei mir der Wecker auf 10:00 Uhr morgens, was in den meisten Fälle passt.
Aber nach einem sportlicheren Tag bin ich auch schon mal um 22:00 Uhr müde und geh ins Bett und schlafe dann zu lange. Denn oft meint der innere Schweinehund, dass ein zusätzliches Mützchen Schlaf nicht schlecht wäre und ich drehe mich nochmal um. Oft braucht der Körper die zusätzliche Erholung, aber oft kommt dabei auch raus, dass ich dabei zu lange schlafe und dann kaputter bin, als wäre ich 2 Stunden vorher aufgestanden.
Auf der anderen Seite hocke ich manchmal bis tief in die Nacht vor einem Problem am Computer, dass ich unbedingt noch lösen will. Und da kann es auch schon mal 2:00 oder 3:00 Uhr in der Früh werden. Dann um 10:00 Uhr geweckt zu werden, kann dann zu wenig Schlaf bedeuten.
Und mich dann todmüde mit dem Wecker auseinanderzusetzen und ihn jedesmal auf eine andere Zeit am Morgen einzustellen, dazu habe ich keine Lust.
Ich habe mich darum gefragt, was denn meine persönliche optimale Schlafzeit sei und wie ich es einrichte, möglichst ausgeruht aufzuwachen und nicht zu überschlafen. So könnte man doch sicher Gevatter Tod ein Schnippchen und die eine oder Stunde Lebenszeit extra herausschlagen...
In der Wikipedia findet man unter Schlafforschung das folgende Diagramm über einen typischen Schlafverlauf:
Daraus ergibt sich, dass die Phasen, die nah am Wachsein sind, nach 4 und nach 7 bis 8 Stunden nach dem Einschlafen sind. Dass 4 Stunden Schlaf im Notfall auch mal ausreichen und besser sind als 5 oder 6, dass deckt sich mit meinen eigenen Erfahrungen - obwohl, da war ich noch ein wenig jünger. Heute sehe ich zu, dass ich auch meinen Schlaf bekomme.
Nach 7 bis 8 Stunden Schlaf hat man die wichtige REM-Phase um Stunde 6 mitbekommen und sollte eigentlich fit genug sein, um aufzustehen. Allerdings kann man sich auch in dieser Zeitperiode noch in einem tieferen Schlafstadium befinen, aus dem man nicht brutal durch einen laut schrillenden Wecker herausgerissen werden sollte. Besser ist wohl eine sanftere Art Wecken, die einen langsam an die Oberfläche des Wachseins führt, also ein langsames Auftauchen, metaphorisch gesprochen.
Sonst noch irgendwelche Wünsche?
... könnte man jetzt fragen. Und das würde wahrscheinlich auch der Verkäufer im Uhrengeschäft fragen, denn so einen Wecker gibt es wohl nicht.Aber ich beantworten die Frage für mich trotzdem mit ja, denn ich nehme mir einen Mikrocontroller und programmiere den ganz nach meinen Wünschen:
- natürlich soll der Wecker die Zeit anzeigen
- und im Dunkeln ablesbar sein, ein 8-fach-7-Segmentanzeige sollte ausreichend
- bei der Anzeige soll bitte die Helligkeit einstellbar sein
- eine Stoppuhr, die ich starten kann, um meine Schlafenszeit zu messen, wäre nicht schlecht
- es soll einen einstellbaren Countdown (etwa 8 Stunden) geben, der herunterzählt ...
- ... und mich dann sanft weckt:
- erstmal das Licht am Bett einschalten
- dann kurze, leise Töne von sich geben
- die ganz langsam lauter werden
- ... bis ich schließlich wach bin und den Wecker stummschalte
- Schlummer-Taste will ich nicht, davon wache ich immer nur müder auf als ohne
- Sollte mein innerer Schweinehund nach dem stummschalten doch siegen und ich schlafe wieder ein
- soll ein Alarm zu eine fest einstellbaren Zeit ertönen, der darf dann auch etwas lauter und nerviger sein
- ein paar Melodien zur Auswahl wären aber trotzdem nicht schlecht
- der Countdown soll per Knopfdruck starten
- oder auch, wenn das Licht im Zimmer eine gewisse Schwelle unterschreitet, sprich es finster ist (Smartphone, Licht, Notebook: alles aus)
- ein extra Knopf am Gehäuse, um ferngesteuert das Licht auszuschalten, wäre auch nicht schlecht
- Datum und Zeit sollen an der Uhr natürlich einstellbar sein. Leider gibt es ja immer noch die unsäglich nutzlose Sommerzeit.
- der Rest, wie Alarm an/aus soll natürlich auch einstellbar sein.
- die Einstellung und die Zeit sollen auch erhalten bleiben, falls mal der Strom ausfällt
- das ganze muss von den Programmgröße natürlich noch in den Speicher des Mikrocontrollers passen
STM32 als Plattform
Als sehr gut geeignete Plattform stellt sich mal wieder das Blue Pill Board mit STM32 heraus:- es ist klein und passt auf jeden Fall in das Weckergehäuse
- es ist stromsparend und kann mit einem günstigen USB-Ladegerät betrieben werden
- es bringt schon eine recht genaue Echtzeituhr mit
- es hat genug Programmspeicher (nämlich 128 KB) und Varaiblenspeicher (20 KB)
- es ist günstig
Der Sketch verwendet 64568 Bytes (49%) des Programmspeicherplatzes. Das Maximum sind 131072 Bytes.
Globale Variablen verwenden 5008 Bytes (24%) des dynamischen Speichers, 15472 Bytes für lokale Variablen verbleiben. Das Maximum sind 20480 Bytes.
Ein größerer Teil des STM32-Flash von 128 KB meiner Bluepills (offiziell sind es ja nur 64 KB) sind ja bereits durch den STMduino-Bootloader verbraucht. Mit der 64 KB wäre der Speicher bereits zu knapp.Der STM32 hat praktischerweise schon eine Echtzeituhr an Board, die auch noch kalibriert werden kann, um ganz genau zu gehen. Und die batteriegepufferten Backup-Register des STM32 sorgen dafür, dass die Einstellungen auch bei einem Stromausfall erhalten bleiben.
Ein Arduino hätte hier schon lange erschöpft alle Viere von sich gestreckt. Denn der hat nur 32 KB Programmspeicher und lächerliche 2 KB Variablenspeicher (mit ATmega 328P).
Die Bluepill bietet hier das beste Preis-/Leistungsverhältnis. Natürlich können ESP 8266 / ESP 32 oder ein Raspberry Pi Zero noch mehr, aber die sind auch wesentlich teurer.
sonstige Hardware
Außer der Bluepill kommen in meinem Countdown-Wecker noch zum Einsatz:- 3V Batteriepack zur Pufferung an VBat
- 8-fach-7-Segment-Display zur Anzeige der Uhrzeit
- 433 MHz-Sender-Modul zum Senden von Befehle an Funksteckdosen zum Einschalten des Schlafzimmerlichtes
- Lautsprecher zur Ausgabe der Alarm-Melodien
- Soundmodul aus Glückwünschkarte, das ebenfalls als Alarm-Melodie abgespielt werden kann (schön laut)
- ein Fotowiderstand zur Lichtstärkemessung mit Spannungsteilungswiderstand von 100 KOhm
- 6 Taster zur/für:
- Ein/Ausschalten des Schlafzimmerlichts (sendet 433 MHz-Signale an Funksteckdose)
- Mode: Wahl des Anzeigemodus
- Set: Einstellungswahl
- Set +: Einstellungswert erhöhen
- Set .: Einstellungswert verringern
- Sleep: wird gedrückt beim Einschlafen bzw. schaltet Alarm aus
Funktionen des Countdown-Weckers
Anzeigemodi, wählbar durch den Mode-Knopf:- Datum/Zeit, etwa: 09.06.20.10. für 9. Juni, 20 Uhr 10 Minuten
- Wochentag/Zeit mit Sekunden, etwa: SU.20.10.30 für Sonntag (Sunday), 20 Uhr 10 Minuten und 30 Sekunden
- volles Datum, etwa: 09.06.2019 für 9. Juni 2019
- Stoppuhr, etwa SW.00.00.00 für Stoppwatch, Stunden, Minuten und Sekunden. Set- oder Sleep stellt die Stoppuhr auf 0 und startet sie. Set+ nimmt eine Zwischenzeit und zeigt diese an, bei erneutem Set+ läuft die Stoppuhr weiter. Die Stoppuhr dient hauptsächlich dazu, seine Schlafdauer zu messen (wird beim Einschlafen gestartet und beim Aufwachen wird der Wert notiert)
- BRIGHT. 0 ... 15, Helligkeit der Uhranzeige
- HOUR... 0 ... 24, Einstellen der Stunde der Uhrzeit
- MINUTE. 0 ... 59, Einstellen der Minuten
- SECOND. 0, wird bei Set+ / Set- auf Null gesetzt
- DAY.... 1 ... 31, Einstellen des Tages
- MONTH.. 1 ... 12, Einstellen des Monats
- YEAR... 2000 - X, Einstellen des Jahres
- ALARM.H. 0 ... 24, Einstellen der Stunde der Alarmzeit
- ALARM.M. 0 ... 55, Einstellen der Minute der Alarmzeit in 5 Minuten-Schritten (Set+/- lang drücken für einzelne Minuten)
- A.MLD. [Name] (Alarm Melody): Auswahl einer Alarm-Melodie nach Name. Die Sleep Taste spielt die Melodie vor / stoppt sie wieder.
- ALARM. on/off Alarm-Funktion / Wecker ein bzw. ausschalten
- CNTDW.H. 0...23, (Countdown Hours): Einstellen der Stunden für Countdown
- CNTDW.M. 0 ... 55, Einstellen der Minuten des Countdown in 5 Minuten-Schritten (Set+/- lang drücken für einzelne Minuten)
- CNTDW. on/off Countdown-Funktion / Wecker ein bzw. ausschalten
- LGHT. 0 ... 4096, (Light). Ausgabe des aktuellen Sensorwertes des Fotowiderstandes (höher = heller). Durch den hohen Spannungsteilungswiderstand ist er im unteren, dunklen Bereich (0 ... 100) besonders empfindlich. Licht bei Nacht ausschalten und Wert als Schwellwert notieren.
- CD.LT. (Countdownlight), fällt der Lichtwert unter diese Schwelle, wird also das Licht ausgeschaltet, dann startet der Countdown, sofern aktiviert. Der Countdown ird mit Sleep gestoppt. War es schon vorher im Schlafzimmer finster, läuft der Countdown evtl. schon und kann durch Sleep neu scharf gestellt werden.
- LT.SNS on/off (Light Sensor): auf off stellen, falls der Countdown nicht mit dem Lichtwert und nur per Sleep-Taste gestartet werden kann.
- LT.SWT on/off (Light Switch): auf on stellen, wenn morgens zum Wecken das Licht angeschaltet werden soll.
Ablauf einer Weckvorganges
- Wecker einmalig konfigurieren
- Uhrzeit per Einstellungen oder über serielle Schnittstelle senden (Format, YYYYMMDD-hhmmss, z. B. 20190609-203602)
- Countdown auf 8 Stunden stellen und einschalten
- Lichtsensor einschalten
- Alarm auf 10:00 Uhr stellen und einschalten
- Lichtschalter einschalten
- Beim Zubettgehen "Alexa, Gute Nacht" sagen
- schaltet Fernseher und Wohnzimmerlicht aus
- schaltet Licht im Schlafzimmer an
- ins Bett gehen und Sleep-Taste drücken, um Countdowntimer zu stoppen und auf Null zu stellen
- wenn genug gelesen und kurz vorm Einschlafen: Buch weglegen und Lichtschalt-Knopf am Wecker betätigen
- schaltet Schlafzimmerlicht aus
- startet Countdown-Timer
- Wacht man vor dem Countdown auf, die übrige Zeit auf dem Display ablesen und ggf. Countdownzeit korrigieren
- 8 Stunden später ist der Countdowntimer abgelaufen und
- das Licht wird eingeschaltet
- ein langsam ansteigendes Wecksignal wird über einen längeren Zeitraum abgespielt zum sanften Wecken
- ablesen auf dem Display, wieviele Extra-Minuten man geschlafen hat und ggf. Countdownzeit korrigieren
- Abschalten des Countdown-Weckers durch Sleep-Taste
- um 10:00 geht Alarm los
- abschalten des Alarms durch Sleep-Taste
- wenn das Countdown-Wecken gut funktioniert, den Alarm generell abstellen
Nachtrag 2019-06-13
Auch das Gehäuse ist inzwischen fertig designed und ausgedruckt. So sieht der feritge Wecker jetzt aus:Die komplette Anleitung dazu ist hier zu finden.