Title: M1.1.3 Python-Programm zum Auslesen des Temperatursensors
Course: LF07 - Cyber-physische Systeme ergänzen - FI/ITSE - Raspberry Pi > Section: LS7.1: Messdatenerfassungssysteme funktional zusammenführen

In diesem Abschnitt wird zunächst beschrieben, welche Möglichkeiten der Programmierung in Python für den Pi bestehen. Anschließend wird beschrieben, wie das Auslesen der Temperatur mit Hilfe von Python funktioniert.

 Es gibt mindestens drei Möglichkeiten, ein Python-Programm für den Raspberry Pi zu schreiben:

1. Direkte Programmierung auf dem Pi (z.B. wenn Maus, Monitor und Tastatur angeschlossen ist)
2. Arbeiten auf dem Pi über ein Terminalprogramm
3. Programmierung auf einem PC/Laptop und anschließendem Transfer der Datei auf den Pi

Möglichkeit 1 – Direkte Programmierung auf dem Pi

Python mit der Thonny Python IDE auf Raspberry PI OS

Abbildung 3: Start der Thonny Python IDE unter Raspberry Pi OS

Die IDE ist schlicht gehalten. Bevor ein Programm ausgeführt werden kann, muss es abgespeichert werden. Es empfiehlt sich, die Python-typische Endung .py zu nutzen. Nachfolgend ist ein “Hello World” Beispiel gezeigt:

Die Ausgabe des Programms wird im unteren Programmfenster “Shell” gezeigt.

Visual Studio Code

Visual Studio Code kann man ab Pi 3B direkt installieren (ARMv6 wird nicht unterstützt). Es wird dort auch eine Remote Development Environment zur Verfügung gestellt.

https://code.visualstudio.com/docs/setup/raspberry-pi

Möglichkeit 2 - Arbeiten auf dem Pi über ein Terminalprogramm

Das wohl bekannteste ist

- Putty: http://www.putty.org/

Sehr komfortabel, weil es zusätzliche Tools in grafischer Umgebung zur Verfügung stellt ist

- MobaXTerm: http://mobaxterm.mobatek.net/download.html

Mit MobaXTerm kann man auch sich auf dem Pi befindliche Dateien mit einem einstellbaren Editor auf dem Terminal editieren.

Möglichkeit 3 – Python Quelltext mit einem PC schreiben und das Programm anschließend auf den Raspberry Pi kopieren

Falls sie nicht direkt mit Maus, Monitor und Tastatur oder über VNC den Raspberry Pi steuern, bietet es sich an, den Python Quelltext mit einem PC zu schreiben. Es gibt zahlreiche Editoren, die Syntax-Highlighting für Python unterstützen. In Abbildung 4 wird exemplarisch die Python IDLE Version 3.7.3 mit dem Programm helloPC.py gezeigt.

Abbildung 4: Python IDLE 3.7.3 mit passender Shell unter Windows 10

Das Python-Programm, bzw. das Python-Skript muss nun auf den Raspberry Pi kopiert werden. Dazu gibt es wieder zwei Möglichkeiten.

1. Kommandozeile: Mit dem Befehl scp (kurz für secure copy) kann die Datei direkt auf den Pi kopiert werden, wenn man seine IP-Adresse, den Benutzernamen und das Passwort kennt.

scp .\helloPC.py pi@192.168.0.135:~/.

1. WinSCP: Das kostenlose Programm WinSCP bietet eine Drag&Drop Lösung, mit der die Datei vom Windows Explorer direkt in die gewünschte Position im Dateisystem des Pis kopiert werden kann.

Abbildung 5: Mit WinSCP das Python-Programm auf den Pi kopieren

Ein Python-Programm zum Auslesen des Temperatursensors

Damit das Auslesen mit einem Python-Programm funktioniert, muss vorher der Sensor im Pi richtig angemeldet sein. Dies kann mit dem „cat“-Befehl getestet werden (ID durch die ID des eigenen Sensors ersetzen).

Wenn eine Ausgabe erscheint, dann kann folgendes Python-Programm getestet werden:

# 28-02161f5a48ee müsst ihr durch die eures Sensors ersetzen!

sensor = '/sys/bus/w1/devices/28-0300a279e5e4/w1_slave'

def readTempSensor(sensorName) :

    f = open(sensorName, 'r')

    lines = f.readlines()

    f.close()

    return lines

print(str(readTempSensor(sensor)))

['48 01 55 05 7f a5 a5 66 11 : crc=11 YES\n', '48 01 55 05 7f a5 a5 66 11 t=20500\n']

Das Programm kann nun erweitert werden:

import time, sys

# 28-02161f5a48ee müsst ihr durch die eures Sensors ersetzen!

sensor = '/sys/bus/w1/devices/28-0300a279e5e4/w1_slave'

def readTempSensor(sensorName) :

    # Aus dem Systembus lese ich die Temperatur der DS18B20 aus

    f = open(sensorName, 'r')

    lines = f.readlines()

    f.close()

    return lines

def readTempLines(sensorName) :

    lines = readTempSensor(sensorName)

    # Solange nicht die Daten gelesen werden konnten, bin ich in einer Endlosschleife

    while lines[0].strip()[-3:] != 'YES':

        time.sleep(0.2)

        lines = readTempSensor(sensorName)

    temperaturStr = lines[1].find('t=')

    # Ich überprüfe ob die Temperatur gefunden wurde.

    if temperaturStr != -1 :

        tempData = lines[1][temperaturStr+2:]

        tempCelsius = float(tempData) / 1000.0

        tempKelvin = 273 + float(tempData) / 1000

        tempFahrenheit = float(tempData) / 1000 * 9.0 / 5.0 + 32.0

        # Rückgabe als Array - [0] tempCelsius => Celsius...

        return [tempCelsius, tempKelvin, tempFahrenheit]

try:

    while True :

        # Mit einem Timestamp die Messung in der Console ausgeben.

        print("Temperatur um " + time.strftime('%H:%M:%S') +" drinnen: " + str(readTempLines(sensor)[0]) + " °C")

# Nach 10 Sekunden erfolgt die nächste Messung

        time.sleep(10)

except KeyboardInterrupt:

    # Programm wird beendet wenn CTRL+C gedrückt wird.

    print('Temperaturmessung wird beendet')

except Exception as e:

    print(str(e))

    sys.exit(1)

finally:

    # Das Programm wird hier beendet, ohne Fehler in die Console.

    print('Programm wird beendet.')

    sys.exit(0)

Eine mögliche Ausgabe des Programms sieht wie folgt aus:

Temperatur um 21:11:44 drinnen: 22.812 °C

Temperatur um 21:11:55 drinnen: 22.687 °C

Temperatur um 21:12:07 drinnen: 22.625 °C

^CTemperaturmessung wird beendet

Programm wird beendet.

Aufgaben zu dem Python-Programm

1. Im Quelltext des Python-Programms stehen die Variablennamen tempCelsius, tempKelvin und tempFahrenheit. Geben Sie die Temperatur zusätzlich in den anderen beiden Temperatureinheiten Kelvin und Fahrenheit auf dem Bildschirm aus.

1. Sie werden beauftragt, das Programm so abzuändern, dass die Temperatur nur noch mit einer Nachkommastelle ausgegeben wird. Passen sie den Quelltext an.

1. Wenn die Temperatur unter 20°C sinkt, soll der Text „zu kalt“ und wenn die Temperatur über 25°C steigt, soll der Text „zu warm“ ausgegeben werden. Erweitern Sie das Programm, indem Sie vor dem Befehl „time.sleep(10)“ eine if-Abfrage in den Quelltext einfügen, welche die aktuelle Temperatur mit den beiden Grenzwerten vergleicht und ggf. die geforderte Ausgabe durchführt.