MicroPython: Logging von Sensor-Daten

Im Produktiv-Einsatz eines Raspberry Pi Pico können während eines laufenden Programms verschiedene Daten anfallen, die nicht nur verarbeitet werden, sondern vielleicht auch für später aufgezeichnet werden sollen. Und während dem Entwickeln und Testen von Programmen auf dem Raspberry Pi Pico wird man immer wieder die Kommandozeile zur Ausgabe von Daten, Zwischenständen, Werten von Berechnungen und Sensoren, verwenden. Einfach auch deshalb, um zu wissen, an welcher Stelle ein Programm steht oder was es getan hat. Doch oft sieht eine Anwendung im Produktiv-Einsatz keine Datenausgabe vor. Und trotzdem braucht man vielleicht später Daten für die Fehleranalyse oder einfach Sensordaten über einen zeitlichen Verlauf. Und die müssen natürlich aufgezeichnet werden.

Für das Daten-Logging und die Datenausgabe sind drei Möglichkeiten denkbar:

  1. Datenausgabe auf der Kommandozeile
  2. Datenausgabe auf einem Display
  3. Datenausgabe in eine Datei schreiben
  4. Datenausgabe auf einer UART-Schnittstelle ausgeben

1. Datenausgabe auf der Kommandozeile

Die einfachste und schnellste Lösung zur Datenausgabe ist der Befehl „print“, der Zeichen, Zeichenfolgen und den Inhalt von Variablen auf der Kommandozeile ausgeben kann.

print() # Leerzeile
print('Text 1')
value = 'Text 2'
print(value)
print('Text 1', value)
print('Text 1 ' + value)

Die Datenausgabe mit „print“ macht natürlich nur dann Sinn, wenn eine Kommandozeile verfügbar ist. Das ist nur der Fall, wenn der Raspberry Pi Pico mit einem Host-Computer über USB verbunden ist, und die Entwicklungsumgebung, wie zum Beispiel die Thonny Python IDE, über eine Kommandozeile verfügt (Menü Ansicht / Kommandozeile).

2. Datenausgabe auf einem Display

Ein mehrzeiliges OLED-Display kann vergleichsweise einfach als Ersatz für die Anzeige der Kommandozeile in der Thonny Python IDE verwendet werden.

3. Datenausgabe in eine Datei schreiben

Eine weitere Form der Datenausgabe ist, die Daten zeilenweise in eine Datei zu schreiben, um diese ggf. später auszulesen.
Mit Hilfe einer Funktion (im Programmcode „writeLog“) kann man das Logging so einfach machen, wie mit einem „print“ auf der Kommandozeile. Denkbar wäre es, den Befehl „print“ zusätzlich in die Funktion „writeLog“ zu schreiben. Dann bleibt man flexibel.

Hinweis: Das Öffnen, Schreiben und Schließen einer Datei braucht Zeit und kann zu Verzögerungen im Programmablauf führen. Bei zeitkritischen Anwendungen sollte das Logging in eine Datei in einem unkritischen Moment erfolgen. Bei dieser Lösung sollte man außerdem berücksichtigen, dass ein Raspberry Pi Pico nicht unendlich viel Speicherkapazität hat. Das heißt, die Logdatei muss irgendwann gelöscht werden. Alternativ könnte man eine Kommunikationsschnittstelle im Programmcode eines Raspberry Pi Pico W vorsehen, um die Daten abrufbar zu machen oder an eine zentrale Stelle senden zu lassen.

import os

def writeLog(valueLog=''):
    #print(valueLog) # optional
    file = open('logfile.txt', 'a')
    file.write(valueLog + "\n")
    file.close()

writeLog() # Leerzeile
writeLog('Text 1')
value = 'Text 2'
writeLog(value)
#writeLog('Text 1', value) # geht nicht
writeLog('Text 1 ' + value)

print()
print('Logfile ausgeben')
file = open('logfile.txt', 'r')
print(file.read())
file.close()

print()
print('Logfile löschen')
os.remove('logfile.txt')

Hinweis: In diesem Programmcode wird die Datei am Ende gelöscht, um den Speicher auf dem Raspberry Pi Pico wieder freizugeben.

Das Öffnen, Schreiben und Schließen einer Datei braucht Zeit und kann zu Verzögerungen im Programmablauf führen. Bei zeitkritischen Anwendungen sollte das Logging in eine Datei erst in einem unkritischen Moment erfolgen. Bei dieser Lösung sollte man außerdem berücksichtigen, dass ein Raspberry Pi Pico nicht unendlich viel Speicherkapazität hat. Das heißt, die Logdatei muss irgendwann gelöscht werden.

4. Datenausgabe auf einer UART-Schnittstelle ausgeben

Der Nachteil von „print“ ist, dass der Pico mit einem Host-Computer verbunden sein muss. Im Produktiv-Betrieb wird das vermutlich nicht der Fall sein.
Eine Alternative ist, eine der UART-Schnittstellen des Picos als Logging-Ausgang zu konfigurieren und die Datenausgabe dorthin umzuleiten. Mit einem anderen UART-fähigen Gerät kann man diese Daten empfangen, ausgeben oder weiterverarbeiten.

Der Raspberry Pi Pico hat zwei UART-Schnittstellen (0 und 1). Der UART 0 kann über die GPIOs 0/1, 12/13 oder 16/17 und der UART 1 über die GPIOs 4/5 oder 8/9 initialisiert werden.

  • Grundlagen UART
  • UART ansteuern und programmieren
from machine import UART, Pin

logUART = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))

def writeLog(valueLog=' '):
    print(valueLog) # optional
    logUART.write(valueLog)

writeLog() # Leerzeile
writeLog('Text 1')
value = 'Text 2'
writeLog(value)
#writeLog('Text 1', value) # geht nicht
writeLog('Text 1 ' + value)

Das Logging in eine Datei kann zusätzlich sinnvoll sein, wenn der Pico während dem Entwickeln an einem Host-Computer zum Auslesen verbunden wird.
Der besondere Charm dieser Lösung ist der universelle Einsatz. Nachteilig ist, dass man ein Gerät braucht, dass eine serielle UART-Schnittstelle aufweist und die Daten empfangen kann.

Externes Logging: Datenausgabe auf einer UART-Schnittstelle

Der Nachteil von „print“ ist, dass der Raspberry Pi Pico mit einem Host-Computer verbunden sein muss, damit eine Datenausgabe erfolgt. Im Produktiv-Betrieb wird das vermutlich nicht der Fall sein.
Eine Alternative ist, eine der UART-Schnittstellen des Picos als Logging-Ausgang zu konfigurieren und die Datenausgabe dorthin umzuleiten. Mit einem anderen Gerät, zum Beispiel Raspberry Pi, kann man diese Daten empfangen, ausgeben, speichern und weiterverarbeiten.

Weitere verwandte Themen:

Elektronik-Sets für das Hardware-nahe Programmieren

Elektronik-Sets für das Hardware-nahe Programmieren

Programmieren mit dem Raspberry Pi Pico
Online-Meeting

Programmieren mit dem Raspberry Pi Pico

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

Frag Elektronik-Kompendium.de