Einen Augenblick Geduld...

Das Python-Script hat bei mir mit seinen Programmzeilen und den Tests im Alltag die längste Zeit benötigt.
Es wird im home-Verzeichnis eingebunden und in der crontab-Datei automatisch gestartet. Das ist wichtig, damit nach einem Reboot des Systems die ''Ultraschallmodulroutine'' automatisch gestartet wird. Andernfalls müsste das Python-Script immer händig gestartet werden nach einem Neustart des Spiegels.
Ich habe das Script für das Ultraschallmodul ultra3.py genannt und es im Verzeichnis home/pi des Raspi's abgelegt.
Nicht vergessen beim Nachbauen: die Tab-Stops (Einrückungen im Quelltext) in Python sind wichtig. Andernfalls funktioniert das Script nicht!
Bearbeitet wird es mit dem vorangesetzten Befehl sudo nano auf der Konsole.
#Bibliotheken einbinden
import RPi.GPIO as GPIO
import time
import os
#GPIO Modus (BOARD / BCM)
GPIO.setmode(GPIO.BCM)
#GPIO Pins zuweisen
GPIO_TRIGGER = 17
GPIO_ECHO = 27
#Richtung der GPIO-Pins festlegen (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
time.sleep (30)
print ("Monitor zunaechst wieder ausschalten")
os.system("echo 'Schalte HDMI aus' | /opt/vc/bin/tvservice -o")
time.sleep (5)
def distanz():
# setze Trigger auf HIGH
GPIO.output(GPIO_TRIGGER, True)
# setze Trigger nach 0.01ms auf LOW
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
StartZeit = time.time()
StopZeit = time.time()
# speichere Startzeit
while GPIO.input(GPIO_ECHO) == 0:
StartZeit = time.time()
# speichere Ankunftszeit
while GPIO.input(GPIO_ECHO) == 1:
StopZeit = time.time()
# Zeit Differenz zwischen Start und Ankunft
TimeElapsed = StopZeit - StartZeit
# mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren
# und durch 2 teilen, da hin und zurueck
distanz = (TimeElapsed * 34300) / 2
return distanz
if __name__ == '__main__':
try:
while True:
abstand = distanz()
print ("Gemessene Entfernung = %.1f cm" % abstand)
if abstand <= 53:
# print ("Monitor einschalten")
os.system("echo 'Schalte HDMI an' | /opt/vc/bin/tvservice -p")
time.sleep(100)
# print ("Monitor ausschalten")
os.system("echo 'Schalte HDMI aus' | /opt/vc/bin/tvservice -o")
time.sleep (1.5)
# Beim Abbruch durch STRG+C resetten
except KeyboardInterrupt:
print("Messung manuell unterbrochen...")
GPIO.cleanup()Wie bereits erwähnt muss das o.g. Script im crontab gestartet werden (oder für Tests händig von der Konsole aus).
Die beiden Einträge in dieser Datei und der Startbefehl des Scripts werden im nächsten Kapitel kurz erklärt.
Was macht das Script?
Es schaltet den HDMI-Port des Raspi's mit Hilfe der GPIO-Pins 17 und 27 aus, bzw. ein. Mit dem Start wird der Monitor zunächst 30 sek. eingeschaltet. Die Zeit kann man nutzen um die Initialisierung der geladenen Module bei einem Start des Systems auf dem Spiegel zu beobachten. Anschließend wird der HDMI-Port für 5 sek. ausgeschaltet und reinitialisiert.
Die 5 Sekunden zu verkürzen wäre übrigens kontraproduktiv, da nach dem Ausschaltvorgang der typische blaue Bildschirm nach Abschaltung des HDMI-Ports angezeigt wird. Diese Anzeige kommt vom Monitor selbst und kann nicht beinflusst werden. Sie wird ca. 5 sek lang angezeigt. Mich stört das nur ein bisschen - ganz abschalten kann man das aber nicht.
Danach ist das System wieder bereit und reagiert auf Bewegungen bis zu 53 cm vor dem Ultraschallmodul. Diesen Abstand habe ich bewusst gewählt, da er den HDMI-Port nur bei kurzer Distanz zum Spiegel einschalten soll. Beim (schnellen) Vorbeigehen vor dem Spiegel sollte dieser möglichst ausgeschaltet bleiben. Das passiert öfter, da er sich im Flur befindet.
In Zeile 1 wird das Script mit dem Start des Systems automatisch gestartet. Außerdem wird mit /dev/null 2>&1 verhindert, dass dieser Vorgang protokolliert wird (auch Zeile 2 wird ebenfalls nicht protokolliert).
Zeile 2 führt um 06:45 Uhr jeden Montag (''1'') einen Neustart (reboot) des Systems durch. Das bewirkt, dass der Spiegel durch den Neustart einmal wöchentlich von Einträgen im Cache befreit wird und somit ein relativ stabiler Dauerbetrieb möglich ist.
@reboot sudo python ultra3.py /dev/null 2>&1
45 6 * * 1 sudo reboot /dev/null 2>&1Um die Eingaben in crontab einfügen zu können lautet der Befehl auf der Konsole: crontab -e . Sie funktionieren erst nach einem Neustart des Systems. Im Internet gibt es weitere Hilfe zu crontab.
Ich hoffe, der Ausflug in die technischen Details meines ''Smart Mirrors'' war hilfreich!