Dieses Projekt entstand an Halloween. Ein Calliope sollte als künstliche Kerze den Halloween-Kürbis beleuchten. Als Zusatzfunktion sollte ein Alarm ausgelöst werden, wenn der Kürbis bewegt wird. Zwar stellte sich letzten Endes die Funkreichweite des Calliope Mini für meinen Anwendungsfall als zu gering heraus, dennoch ist es ein schönes Projekt geworden, das mir Spaß gemacht hat.
Calliope 1
- Simulation einer Kernzenbeleuchtung mittels RGB-Led
- Zyklische Benachrichtigung an Calliope 2 als "Lebenszeichen"
- Erkennung von Erschütterung oder Bewegung mittels Beschleunigungssensor
- Optischer Alarm mittels RGB-Led (abwechselnd rot-blaues Blinken)
- Akustischer Alarm mittels Piezo-Lautsprecher (Melodie: Trauermarsch)
- Auslösung eines Alarms auf Calliope 2 über Funk (Bluetooth Low Energy)
- Deaktivierung des Alarms über Funksignal
Calliope 2
- Anzeige des Funk-Überwachungsstatus auf dem Led-Matrix-Bildschirm
- Anzeige des Alarmstatus mittels RGB-Led (grün, gelb oder rot/blau blinkend)
- Akustischer Alarm mittels Piezo-Lautsprecher
- Deaktivierung des Alarms auf Calliope 1 und 2 bei Betätigung des A-Tasters
Für die Programmierung habe ich "MakeCode for calliope mini", Version 3.0.33, im Firefox-Browser verwendet: https://makecode.calliope.cc.
Programm für Calliope 1Calliope 1 - Initialisierung
Beim Start des Calliope 1 wird u.a. die aktuell gemessene Beschleunigung, also die Erdbeschleunigung, als Referenzwert abgespeichert. Zudem werden auch die Funkgruppe und die Sendeleistung eingestellt.
Calliope 1 - Hauptprogramm
Das Hauptprogramm sendet bei jedem Durchlauf ein Lebenszeichen (Name watchdog mit dem Wert 1) über Funk. Dies wird auf Calliope 2 für die Erkennung von Funkabbrüchen verwendet.
Des Weiteren wird die aktuell gemessene Beschleunigung mit dem gespeicherten Referenzwert verglichen. Im Fall einer deutlichen Abweichung wird ein Alarm ausgelöst. Sofern der Alarm nicht bereits aktiv ist, wird die Variable alarm auf den Wert wahr gesetzt und ein Alarm-Ereignis erzeugt. Die zugehörige Reaktion auf das ausgelöste Ereignis wird weiter unten beschrieben. Zudem erfolgt bei jeder erkannten Erschütterung eine Benachrichtigung über Funk (Name beschl, Wert 1).
Im Fall eines aktiven Alarms wird die RGB-Led abwechselnd für jeweils 100 ms auf rot oder blau gesetzt. Ist kein Alarm aktiv, führt der Calliope seine Normalfunktion aus. Hier ist dies ein zufälliges Flackern der RGB-Led, das eine Kerze simulieren soll.
Calliope 1 - Reaktionen auf Ereignisse und Nachrichten
Als Reaktion auf das Alarm-Ereignis spielt der Calliope eine Melodie ab und wiederholt diese, solange der Alarm aktiv ist.
Empfängt der Calliope 1 über Funk das Name-Wert-Paar alarmRes und 1, schaltet er den Alarm aus und speichert den aktuell gemessenen Beschleunigungswert ab. Letzteres soll wiederholte Fehlalarme verhindern, die durch eine dauerhafte Veränderung des Messwerts hervorgerufen werden (z.B. Sensor-Drift).
Calliope 2 - Initialisierung
Calliope 2 initialisiert beim Start einige Variablen sowie den Funk analog zu Calliope 1. Die Variable watchdogZeit speichert den Zeitpunkt, an dem zuletzt ein Lebenszeichen von Calliope 1 empfangen wurde. Die Variable warnung wird auf wahr gesetzt, wenn der letzte Zeitpunkt unbekannt ist oder eine definierte Zeitspanne (z. B. 1 Sekunde) überschritten hat. Die Variable alarm signalisiert einen aktiven Alarm. Hingegen signalisiert alarmMute für einige Zeit, dass der Alarm vom Benutzer per Taster deaktiviert wurde. Dies soll verhindern, dass der unmittelbar erneut aktiviert wird (Entprellung).
Calliope 2 - Hauptprogramm
Das Hauptprogramm von Calliope 2 prüft, ob die Zeitdauer seit dem letzten Lebenszeichen von Calliope 1 innerhalb der Toleranzgrenze (1000 Millisekunden) liegt. Ist dies der Fall, wird auf der Led-Matrix ein Antennensymbol dargestellt und die Variable warnung auf den Wert falsch gesetzt. Mittels dieser Variable wird das Blinken der RGB-Led beeinflusst.
Liegt das letzte Lebenszeichen von Calliope 1 länger zurück, wird ein X auf dem Display angezeigt und warnung auf wahr gesetzt.
Calliope 2 - Reaktion auf Nachrichten von Calliope 1
Jedes Mal, wenn Calliope 2 eine Nachricht watchdog und 1 empfängt, speichert er den aktuellen Zeitpunkt in der Variablen watchdogZeit.
Die Nachricht beschl und 1 aktiviert den Alarm auf Calliope 2. Ein neues Alarm-Ereignis wird nur dann ausgelöst, wenn kein Alarm aktiv ist und der Alarm nicht kürzlich vom Benutzer deaktiviert wurde (alarmMute).
Die Reaktion auf das Alarm-Ereignis besteht darin, dass Caliope 2 fortwährend eine Tonfolge abspielt bis der Alarm deaktiviert wird:
Calliope 2 - Statusanzeige mit der RGB-Led
Die Ansteuerung der RGB-Led erfolgt in einem Hintergrundprogramm, das fortwährend ausgeführt wird. Je nach Zustand der Variablen alarm sowie warnung wird ein schnelles rot-blaues Blinken (Alarm), ein gelbes Blinken (Warnung) oder ein langsames grünes Blinken (kein Alarm, keine Warnung) angezeigt.
Calliope 2 - Ausschalten des Alarms per Taster
Wenn Taster A am Calliope 2 betätigt wird und ein Alarm aktiv ist, wird eine entsprechende Nachricht an Calliope 1 gesendet. Um die Deaktivierung robuster zu gestalten, erfolgt dies mehrfach. Zudem wird während der Deaktivierung alarmMute auf wahr gesetzt, um eine erneute Aktivierung während dieses Vorgangs zu verhindern.
An mehreren Stellen meines Programms werden Name-Wert-Paare gesendet oder empfangen. Es ist wichtig, dass die verwendeten Namen aus höchstens 8 Zeichen bestehen. Ignoriert man dies, so wie ich zunächst, funktionieren auf der Emfpängerseite die Abfragen auf name nicht. Zum Beispiel wird die Abfrage name="beschleunigung" aufgrund der überschrittenen Zeichenanzahl niemals wahr, was beim Programmierer zu Verwunderung bis hin zur Verzweiflung führen kann.
Im Nachhinein betrachtet würde ich einige Details des Programms ein wenig anders gestalten oder zumindest andere Designs und Möglichkeiten von MakeCode ausprobieren. Vielleicht finde ich demnächst tatsächlich einmal die Zeit, um eine überarbeite Version zu posten. Für meine Zwecke funktioniert das Programm bereits zufriedenstellend und hoffe, dass der eine oder andere damit etwas anfangen kann.





Comments