Aus Raspberry Pi Geek 06/2020

Küchenwecker mit Doppelalarm im Selbstbau (Seite 2)

Buttons

Für das Einstellen der Alarmzeiten nutzt das Projekt einen Fünfwege-Button (Abbildung 3). Ein Druck schaltet zwischen Setup und Bereitschaft hin und her. Mit links/rechts wechseln Sie die Position in der Reihe der Ziffern, mit oben/unten ändern Sie den Wert. Allerdings hat der Hersteller den im Beispiel genutzten Schalter vor Kurzem aus dem Programm genommen.

Abbildung 3: Ein Fünf-Wege-Schalter von Cytron.

Abbildung 3: Ein Fünf-Wege-Schalter von Cytron.

Es gibt jedoch ähnliche Exemplare – sogar mit zwei zusätzlichen Tastern – bei Ebay für ein paar Euro (Abbildung 4). Suchen Sie dort nach “Navigationsbutton”. Der Cytron-Schalter verfügt an jedem Anschluss über einen Pullup-Widerstand und einen Entprellkondensator. Diese fehlen den Ebay-Produkten oft.

Abbildung 4: Ein alternativer No-Name-Button von Ebay.

Abbildung 4: Ein alternativer No-Name-Button von Ebay.

Da der RasPi konfigurierbare Pullups hat, ist das Fehlen der Widerstände leicht zu verschmerzen. Die Kondensatoren (100 pF) rüsten Sie entweder selbst nach oder entprellen einfach per Software (siehe unten). Der Ebay-Button des Autors war sogar vorgelötet, sodass es möglich war, das Projekt völlig ohne Lötarbeiten auf einem Breadboard aufzubauen.

Der RasPi benötigt für jede Richtung des Navigationsschalters einen eigenen Pin. Die Belegung entnehmen Sie der Tabelle “Pin-Belegung”. Prüfen Sie anschließend, ob alles korrekt verkabelt ist (Listing 3). Der Test wartet der Reihe nach auf das Betätigen der entsprechenden Richtung und gibt dann eine Nachricht aus.

GPIO-Pin

Verkabelt mit

17

C (command / Druck)

18

U (up / hoch)

22

D (down / runter)

27

L (left / links)

23

R (right / rechts)

Listing 3

#!/bin/bash
echo -e "\nReihenfolge: set, up, down, left, right\n\n"
for pin in 17 18 22 27 23; do
  gpio -g mode "$pin" in
  gpio -g mode "$pin" up
  gpio -g wfi "$pin" falling
  echo "GPIO$pin ist jetzt LOW"
done

Dazu nutzt Zeile 6 die Funktion wfi des GPIO-Programms. Das Kürzel steht für wait for interrupt und bedeutet, dass das GPIO-Programm wartet, bis der Pin einen Interrupt auslöst. In vorliegenden Fall interessiert dabei nur der Übergang von High nach Low (also falling, daneben gibt es noch rising und both).

Neben dem Fünf-Wege-Button kommt im Projekt noch ein normaler Button für Start und Stopp des Weckers zum Einsatz. Hier bietet sich ein großer, gut bedienbarer Taster an. Im Projekt ist der Button mit GPIO5 verbunden; Sie testen ihn wie oben beschrieben. Für diesen Schalter stellt der RasPi den Pullup bereit, das Entprellen erfolgt per Software.

Wecker-Software

Wer die Herausforderung sucht, schreibt die Software selbst. Einfacher gestaltet sich das Ganze, wenn Sie das Programm aus dem Github-Repository [1] des Autors beziehen. Falls noch nicht geschehen, installieren Sie dazu das Paket git und richten danach die Software mit den Befehlen aus den ersten drei Zeilen von Listing 4 ein.

Listing 4

$ git clone https://github.com/bablokb/doubleclock.git
$ cd doubleclock
$ sudo tools/install
[...]
$ sudo systemctl disable doubleclock.service
$ doubleclock.py
[...]
$ sudo systemctl enable doubleclock.service
$ sudo systemctl start doubleclock.service

Den eigentlichen Programmcode finden Sie anschließend in der Datei /usr/local/sbin/doubleclock.py. Das Installationsprogramm richtet einen Systemd-Service ein, der den Wecker beim Booten startet.

Für erste Tests bietet es sich aber an, den Service gleich wieder zu deaktivieren und das Programm per Hand zu starten (Listing 4, Zeilen 5 und 6). Der manuelle Aufruf hat den Vorteil, dass Sie eventuelle Programmfehler auf dem Bildschirm sehen. Im Idealfall füllen sich die beiden Display-Segmente jetzt mit Nullen. Sie beenden das Programm jederzeit mit der Tastenkombination [Strg]+[C].

Die Struktur des Programms ist einfach: Der Haupt-Thread aktualisiert zweimal pro Sekunde die Displays. Asynchron dazu gibt es Methoden, die auf Steuerbefehle reagieren. Die Methode do_left() verarbeitet etwa das Drücken des Fünf-Wege-Schalters nach links.

Läuft der Wecker, zählt ein weiterer Thread die verbleibende Zeit nach unten. Klingelt der Wecker, kümmert sich ein dritter Thread um den Buzzer und entlockt ihm rhythmische Töne. Das alles klappt dank Python mit vergleichsweise wenigen Zeilen Code (circa 200 Zeilen plus Kommentare).

Anpassungen

Je nach verfügbarer Hardware stehen ein paar Anpassungen am Programm an. Listing 5 zeigt einen Ausschnitt aus der Schalterkonfiguration. Bei den Variablen, deren Namen mit PIN_ beginnen, handelt es sich um Konstanten, die das Programm weiter oben mit den entsprechenden GPIO-Nummern belegt.

Listing 5

[...]
64 GPIO.setup(PIN_PUSH,     GPIO.IN)
65 GPIO.setup(PIN_UP,       GPIO.IN)
66 GPIO.setup(PIN_DOWN,     GPIO.IN)
67 GPIO.setup(PIN_LEFT,     GPIO.IN)
68 GPIO.setup(PIN_RIGHT,    GPIO.IN)
69 GPIO.setup(PIN_SLIDER_L, GPIO.IN,  pull_up_down=GPIO.PUD_UP)
70 GPIO.setup(PIN_START,    GPIO.IN,  pull_up_down=GPIO.PUD_UP)
71 GPIO.setup(PIN_BUZZER,   GPIO.OUT, initial=1-PIN_BUZZER_ON)
72
73 GPIO.add_event_detect(PIN_PUSH,     GPIO.FALLING, self.on_push)
74 GPIO.add_event_detect(PIN_UP,       GPIO.FALLING, self.on_up)
75 GPIO.add_event_detect(PIN_DOWN,     GPIO.FALLING, self.on_down)
76 GPIO.add_event_detect(PIN_LEFT,     GPIO.FALLING, self.on_left)
77 GPIO.add_event_detect(PIN_RIGHT,    GPIO.FALLING, self.on_right)
78 GPIO.add_event_detect(PIN_SLIDER_L, GPIO.BOTH,    self.on_slider)
79 GPIO.add_event_detect(PIN_START,    GPIO.FALLING, self.on_start, 200)
[...]
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben