Pi Pico Micropython Datei in Flash Speicher schreiben

Art Vandelay

Lieutenant
Registriert
Apr. 2020
Beiträge
802
Hallo liebe Cracks,

es gab zuletzt in der Zeitschrift Make einen Artikel, in dem die ausgelesenen Werte eines Temperatur Sensors in eine lokale CSV Datei geschrieben werden. Letzten Endes ist das nicht sehr Praxis nah, wann würde man diese CSV Datei je mal wieder auslesen, aber ich bin auf dem Weg zum Ziel auf ein Problem gestoßen:
Ich möchte auf einem Pi Pico W mittels Micropython in einer Schleife zyklisch in eine lokale Textdatei schreiben, hängt der Pi direkt am Rechner an der Thonny IDE läuft das einwandfrei. Lasse ich das Programm als main.py automatisch beim Start des Pi laden, hören die Schreibvorgänge einfach nach wenigen Durchläufen auf. Um das ganze zu vereinfachen habe ich die ganze Temperatur Messung rausgeworfen und lasse einfach nur einen Zähler in die TXT Datei schreiben. Um die Durchläufe im Blick zu haben, lasse ich die OnBoard LED blinken. Der Fehler passiert dennoch.

Hier mein Programmcode, fällt euch was auf?

Code:
from utime import sleep
from machine import Pin

# Initialisierung von GPIO25 als Ausgang
led_onboard = Pin('LED', Pin.OUT)
led_onboard.off()

print ("Start")
Zaehler=1

DateiName = "ADatei.txt"
datei = open(DateiName,"w")

while Zaehler <= 20:
  # LED einschalten
  led_onboard.on()
 
  Zeile = str(Zaehler)
  Zeile +="\n"
  datei.write(Zeile)
  datei.flush
 
  print(Zaehler)
  sleep(0.1)
  led_onboard.off()
  sleep(5)
  Zaehler+=1

datei.close
print ("Ende")


Aber auch wenn ich alle Print und LED Aktivitäten deaktiviere, brechen die Schreib Vorgänge ab. Auch die Modifikation die Datei im "append" Modus in der Schleife immer wieder neu zu öffnen ändert nichts am Fehler.
Ich hoffe hier auf kluge Denkanstöße und Hinweise und freue mich auf konstruktive Diskussion. :-)
 
Generell würde ich auch nur noch mit Kontext Managern und Dateien arbeiten, das vermeidet viele Probleme:

Python:
with open("data.txt", "w") as file:
    file.write("Something")
Ergänzung ()

Art Vandelay schrieb:
hören die Schreibvorgänge einfach nach wenigen Durchläufen auf
Nach wie vielen denn? Immer nach der gleichen Anzahl?
 
  • Gefällt mir
Reaktionen: Art Vandelay
Danke schon mal.
Habe eure Anmerkungen mal umgesetzt, nun beim ersten Test sah ganz gut aus und es wurden alle 20 Durchläufe in die Datei geschrieben. Mal sehen wie das nun mit der Temperatur Messung aussieht...

Python:
from utime import sleep
from machine import Pin

# Initialisierung von GPIO25 als Ausgang
led_onboard = Pin('LED', Pin.OUT)
led_onboard.off()

print ("Start")

Zaehler=1

DateiName = "ADatei.txt"


#datei = open(DateiName,"a")
#datei = open(DateiName,"w")

while Zaehler <= 20:
  # LED einschalten
  led_onboard.on()
 
 
  Zeile = str(Zaehler)
  Zeile +="\n"
  with open (DateiName,"a") as datei:
    datei.write(Zeile)
    datei.flush()
  datei.close()

  print(Zaehler)
  sleep(0.1)
  led_onboard.off()
  sleep(5)
  Zaehler+=1


print ("Ende")
Ergänzung ()

Bitopium schrieb:
Generell würde ich auch nur noch mit Kontext Managern und Dateien arbeiten, das vermeidet viele Probleme:

Python:
with open("data.txt", "w") as file:
    file.write("Something")
Ergänzung ()


Nach wie vielen denn? Immer nach der gleichen Anzahl?

Das war ganz unterschiedlich, aber meist schon nach 1-3 Durchläufen war Ende. Wobei die LED schon ihre 20 Durchläufe geblinkt hat.
 
Art Vandelay schrieb:
with open (DateiName,"a") as datei: datei.write(Zeile) datei.flush() datei.close()
Wenn du einen Kontextmanager benutzt musst du die Datei nicht schließen. Also das datei.close() noch weg. Sollte so auch gar nicht funktionieren...
 
Jawoll alles klar, das war's gewesen. Es kam keine Fehlermeldung wegen des unnötigen datei.close(), aber hab's jetzt noch gelöscht. Die zyklische Temperatur Aufzeichnung läuft jetzt auch einwandfrei.
Kannst du das zufällig erklären, warum sich der Pico beim selben Programm unterschiedlich verhält wenn er am Laptop oder nur am Strom hängt?
 
Vielleicht liegt es an der externen Stromversorgung, der Pico braucht extrem wenig Strom, da könnte manche abdrehen. Es empfiehlt sich, mit einem Lithium-Ionen Akku, der über USB geladen werden kann, den PICO zu versorgen, aber nicht über 5V, sondern direkt mit 3,8V vom Akku an VSYS.
Siehe Seite 21:
https://datasheets.raspberrypi.com/pico/pico-datasheet.pdf


Li-Ionen Laderegler mit Tiefentladeschutz, sollte hierfür passend sein:
https://www.amazon.de/Aideepen-Stück-Micro-TC4056-Lithium-Akku-Ladeplatine/dp/B09YYGK7T1
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Art Vandelay
Meine Hypothese wäre ja, dass mit USB-Verbindung zum Rechner die print-Statements den Nebeneffekt haben können, dass auch andere File-Buffer geflushed werden. Standalone betrieben wird print vermutlich eine no-op sein.
 
Micropython hat eine interne REPL, die man über das Debug-Interface ausgeben kann, dort müssten die print Ausgaben landen.
 
HITCHER_I schrieb:
Vielleicht liegt es an der externen Stromversorgung, der Pico braucht extrem wenig Strom, da könnte manche abdrehen. Es empfiehlt sich, mit einem Lithium-Ionen Akku, der über USB geladen werden kann, den PICO zu versorgen, ....

Ich hatte den Pico entweder über eine Standard 0815 5V Powerbank versorgt, oder aber auch per USB Kabel am Laptop, was keine Datenübertragung konnte. Identisches Verhalten.
Beim Thema Laderegler und 3,8V steige ich jetzt aus, das ist mir zu hoch.
 
War das ein intelligentes Ladekabel?
Dass Powerbanks sich abschalten bei wenig Stromverbrauch, ist normal.

Versuche es mit anderen Kabeln und USB Netzteilen.
 
Zuletzt bearbeitet:
Zurück
Oben