MicroPython: Daten-Logging

Im Produktiv-Einsatz eines Raspberry Pi Pico können während einem laufenden Programm 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 zur Fehleranalyse Daten, die dazu aufgezeichnet werden müssen.

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

  1. Datenausgabe auf der Kommandozeile
  2. Datenausgabe in eine Datei schreiben
  3. 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 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.

3. 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.

  • Raspberry Pi OS: UART-Schnittstelle lesen

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

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

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren