Optimierung des BathPi

Ich hatte überlegt, ob ich ganz einfach den Post zu meinem BathPi reloaded bearbeite und die Neuerungen dort rein schreibe, aber dann habe ich mich doch dazu entschlossen, einen komplett neuen Artikel zu schreiben.

Hintergrund war folgender: Den Start meines BathPi realisierte ich bisher über eine Steckdose, die über einen Lichtschalter ein- und ausgeschaltet wurde. Allerdings bedeutet das, dass der Raspberry Pi dann auch erst bootet, wenn die Steckdose über den Lichtschalter eingeschaltet wird. Beim Booten ist der Raspberry Pi ja nicht gerade der schnellste, also dauert es auch mindestens eine halbe Minute, bis Töne aus den Lautsprechern zu vernehmen waren.

Meine nächste Überlegung ging dann dahin, dass ich den Raspberry Pi an eine Steckdose anschließe, die ununterbrochen am Stromnetz hängt und nur die Lautsprecher an die schaltbare Steckdose anschließe.
Das ging soweit auch ganz gut, allerdings hat es den Nachteil, dass das Radio die ganze Zeit läuft, das Display beleuchtet ist und auch das WLAN funkt.

So kam ich auf die Idee, dass es doch möglich sein müsste, zusätzlich zu den Lautsprechern auch einen GPIO-Pin zu beschalten, der dann das Radio ein- oder ausschaltet.
Der Raspberry Pi läuft nun also trotzdem die ganze Zeit, allerdings wird das Radio - und damit das Display ausgeschaltet, wenn auch die Steckdose (mit den angeschlossenen Lautsprechern) ausgeschaltet ist.
Ein Problem ist, dass aus der Steckdose eine Spannung mit 5 V kommt, an den GPIO-Pins allerdings nur 3,3 V anschlossen werden dürfen, da sonst der Raspberry Pi zerstört werden würde. Also brauchte ich noch einen Spannungsteiler. Leider hatte ich damals in der Schaltungselektronik nicht so genau zugehört und musste mir also etwas "fertiges" besorgen.

Der Konverter hat auch direkt einen 3,3 V Ausgang als Lötpunkt. An diesen habe ich noch einen 10 kOhm Widerstand gelötet und danach ein Jumperkabel, das ich dann auf den GPIO-Pin des Raspberry Pi stecken kann.

Dazu dann folgendes Skript:

#!/usr/bin/python
# coding=utf-8

import os
import RPi.GPIO as GPIO
import subprocess
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

lastValue = None
radio = None
status = None

while True:
    gpio = GPIO.input(21)

    if gpio and (lastValue is None or lastValue == 0):
        lastValue = 1
        if status is not None:
            status.terminate()
        radio = subprocess.Popen(['python', '/home/pi/PiRadio/newradio.py'])

    elif not gpio and (lastValue is None or lastValue == 1):
        lastValue = 0
        if radio is not None:
            radio.terminate()
            os.system('mpc stop')
        status = subprocess.Popen(['python', '/home/pi/PiRadio/status.py'])

    time.sleep(1)

GPIO.cleanup()

Ich nutze den GPIO-Pin 40 (BCM 21) als Eingang, GPIO-Pin 39 ist Masse. Hier sieht man schon, dass nur die Modelle A+, B+ oder 2 B in Frage kommen. Das liegt auch daran, dass die "alten" 26 Pins ja bereits von dem Display belegt sind.

Das Skript lauscht nun auf diesem Pin. Ist kein Signal vorhanden (also die Steckdose aus), wird das Skript status.py ausgeführt. Ansonsten wird das Radio gestartet. In beiden Fällen wird der aktuelle Stand in der Variablen lastValue gespeichert, die bei jedem Schleifendurchgang mit abgefragt wird, damit nur Änderungen an dem Pin beachtet werden.

Oben erwähntes Skript status.py zeigt einfach nur die IP-Adresse und etwas Text auf dem nicht beleuchteten Display an. Dieses Skript sowie die anderen verwendeten Skripte liegen in dem von mir angelegten GitHub-Repository.