Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Nächste Überarbeitung | Vorherige Überarbeitung | ||
phtg:bp:ch3:datacollection [2024-05-15 09:05] – angelegt hof | phtg:bp:ch3:datacollection [2024-05-31 07:42] (aktuell) – [Python: Datei Ein- und Ausgabe] hof | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | asdf | + | ## Data Collection |
+ | |||
+ | < | ||
+ | |||
+ | Keine Batterie hält ewig - nun möchten wir wissen, wie lange unsere Batterie Strom liefert, und wieviel Energie wir praktisch nutzen konnten, bis sie leer ist. Aus der Physik wissen wir, dass $Spannung\cdot{}Strom$ die Leistung unserer Batterie (bzw. die Leistungsaufnahme der Leuchte) ergibt. Wenn wir die Leistung über die ganze Lebensdauer unseres Systems aufzeichnen, | ||
+ | |||
+ | ### Ziel | ||
+ | Schreibe Python-Code wie folgt. Falls die nötigen Python-Kenntnisse noch nicht vorhanden sind, folgst du den untenstehenden Tutorials. | ||
+ | |||
+ | * Datei `batterie.csv` im Schreibmodus öffnen. | ||
+ | * Eine Schleife ausführen, die alle zehn Sekunden die Strom- und Spannungswerte ausliest. | ||
+ | * Für jede Lesung wird eine Zeile (en. _record_) in die Datei geschrieben im folgenden Format: | ||
+ | |||
+ | `< | ||
+ | |||
+ | * also zum Beispiel (für eine Messung von $U = 1.37V$ und $I = 300mA$): | ||
+ | |||
+ | `2024-06-13 14: | ||
+ | |||
+ | <nodisp 0> | ||
+ | ++++Lösung| | ||
+ | <code python> | ||
+ | from datetime import datetime | ||
+ | import time | ||
+ | from gdx import gdx | ||
+ | |||
+ | gdx = gdx.gdx() | ||
+ | |||
+ | gdx.open(connection=' | ||
+ | gdx.select_sensors() | ||
+ | gdx.start() | ||
+ | |||
+ | interval = 10 # Miss alle 10s | ||
+ | with open(' | ||
+ | # Kopfzeile der Tabelle schreiben | ||
+ | outfile.write(' | ||
+ | |||
+ | while True: | ||
+ | timestamp = datetime.now() | ||
+ | measurements = gdx.read() | ||
+ | if measurements == None: | ||
+ | break | ||
+ | voltage = measurements[0] | ||
+ | current = measurements[1] | ||
+ | |||
+ | # Wir messen, bis die Spannung unter 0.05V fällt | ||
+ | if voltage < 0.05: | ||
+ | break | ||
+ | |||
+ | line = f' | ||
+ | outfile.write(line) | ||
+ | |||
+ | time.sleep(interval) | ||
+ | |||
+ | gdx.stop() | ||
+ | gdx.close() | ||
+ | </ | ||
+ | ++++ | ||
+ | </ | ||
+ | |||
+ | ### Tutorials | ||
+ | #### Python: Sensoren auslesen | ||
+ | |||
+ | **Einmalig** muss in Python die `godirect` Bibliothek installiert werden ([Anleitung](https:// | ||
+ | <code bash> | ||
+ | pip3 install godirect | ||
+ | </ | ||
+ | |||
+ | Anschliessend hat Python Zugriff auf die verwendeted _godirect_ Sensoren. Der folgende Code liest 5 Messwerte vom via USB angeschlossenen Sensor und gibt sie auf der Konsole aus: | ||
+ | |||
+ | <code python> | ||
+ | from gdx import gdx | ||
+ | gdx = gdx.gdx() | ||
+ | |||
+ | gdx.open(connection=' | ||
+ | gdx.select_sensors() | ||
+ | gdx.start() | ||
+ | |||
+ | for i in range(5): | ||
+ | measurements = gdx.read() | ||
+ | if measurements == None: | ||
+ | break | ||
+ | print(measurements) | ||
+ | |||
+ | gdx.stop() | ||
+ | gdx.close() | ||
+ | </ | ||
+ | |||
+ | ##### Aufgabe | ||
+ | Schliesse deinen Spannungs-Sensor an und führe obigen Code aus. Die gemessene Spannung sollte nahe bei null sein. | ||
+ | #### Python: Datei Ein- und Ausgabe | ||
+ | |||
+ | Wie lesen wir Daten in einer Text-Datei? | ||
+ | |||
+ | <code python> | ||
+ | # Opens a file for writing (and closes it again after the ' | ||
+ | with open(' | ||
+ | for i in range(10): | ||
+ | line = 'Zeile ' + str(i) + ' | ||
+ | outfile.write(line) | ||
+ | </ | ||
+ | |||
+ | Beachte: | ||
+ | * Wenn Dateien gelesen oder geschrieben werden, müssen sie beim Betriebssystem reserviert werden. Mit `with` wird sichergestellt, | ||
+ | * Die Datei (hier ' | ||
+ | * `' | ||
+ | * `str()` verwandelt die Zahl in einen Text. | ||
+ | * `' | ||
+ | |||
+ | ##### Aufgabe | ||
+ | Beschreibe eine Datei mit einigen Zeilen. Es ist ungünstig, mehr als einige zehntausend Zeilen zu schreiben... | ||
+ | |||
+ | |||
+ | #### Python: Schlafen | ||
+ | Wir wollen nur alle zehn Sekunden einen neuen Record schreiben, aber der Computer ist viel schneller. Zwischen den Messungen schlafen wir also: | ||
+ | |||
+ | < | ||
+ | duration = 3 | ||
+ | print(f' | ||
+ | time.sleep(duration) | ||
+ | print(' | ||
+ | </ | ||
+ | |||
+ | ##### | ||
+ | |||
+ | Führe den obigen Code aus. Ändere ihn so ab, dass der Schlaf nur noch $2.5s$ dauert! | ||
+ | |||
+ | #### Python: Zeitstempel formatieren | ||
+ | |||
+ | Zeitstempel können aus der `datetime` Bibliothek geholt werden: | ||
+ | |||
+ | < | ||
+ | |||
+ | print(datetime.now()) | ||
+ | </ | ||
+ | |||
+ | Mit Python f-Strings können mehrere Argumente praktisch in einen String gepackt werden: | ||
+ | |||
+ | < | ||
+ | timestamp = datetime.now() | ||
+ | planet = ' | ||
+ | magnitude = ' | ||
+ | print(f' | ||
+ | </ | ||
+ | |||
+ | ##### | ||
+ | |||
+ | Ändere den Code so ab, dass eine _small_ disturbance auf dem Planet _Coruscant_ rapportiert wird. | ||
+ | |||
+ | (Du weisst nicht, was mit _Alderaan_ oder _Coruscant_ oder der [[https:// | ||
+ | |||
+ | #### CSV-Format | ||
+ | Unsere Log-Datei ist im [[wpde> | ||
+ | |||
+ | Oft werden in der ersten Zeile die Namen der abgespeicherten Werte festgelegt: | ||
+ | |||
+ | <code csv> | ||
+ | Zeitstempel, | ||
+ | 2024-06-13 14: | ||
+ | 2024-06-13 14: | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | ##### Aufgabe | ||
+ | |||
+ | Schreibe Code, der drei Zeilen ähnlich wie oben in eine CSV-Datei schreibt. Verwende f-Strings um die drei Werte auszugeben. |