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