Sie nutzen einen veralteten Browser. Für eine schnellere und sichere Verbindung aktualisieren Sie den Browser kostenfrei.


Einen Augenblick Geduld...

  • Techn. Development

  • Kontakt
    Weitere Tutorials

    Python-Script für den ''Smart Mirror''

    • Projekt ''Smart Mirror'' - Python-Script
    • 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.



       

       

      1. Das Python-Script ultra3.py

      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.



       

       

      2. Die Datei crontab für automatisierte Vorgänge

      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>&1

      Um 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!

       


      P.S.
      Bitte beachtet immer, dass ich nicht haftbar für Schäden jeglicher Art bin, wenn bei euch die Versuche fehlschlagen, im Besonderen bei Verwendung des o.g. Scriptes oder bei Missverständnissen in der Erklärung.

      Deswegen bitte auch immer bei Modifikationen an der Hardware diese nur im ausgeschalteten Zustand durchführen!
      Immer darauf achten, dass sich die GPIO-Pins nicht berühren, bzw. kurzgeschlossen werden (nicht gegen Masse!).

      Auch wenn der Raspi zu den ''Bastelcomputern'' gehört die ein bisschen was ''abkönnen'', so ist es letztendlich doch ''nur'' ein elektronisches Bauteil mit entsprechender Mikroelektronik, welches bei fahrlässigem Umgang kaputt gehen kann...