Ich sehe keinen Code, und "etwas nach dem Schema" ist auch eher nicht hilfreich.
Was genau ist dein Code? Wie genau sehen die Daten aus? Was stimmt daran nicht? Denn "verkuerzt" sehe ich jetzt nicht, ausser das natuerlich Zahlen nicht mit irgendwelchen fuehrenden Nullen ausgegeben werden.
Bachelorarbeit Sensoren anbinden an RPi
- __blackjack__
- User
- Beiträge: 13102
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@ossihmz: Was heisst „als Array ausgegeben“? Ein Numpy-Array als Zeichenkette oder `repr()`-Form ausgegeben? Dann sieht das zwar etwas anders aus als das was Du da gezeigt hast, aber sehr wahrscheinlich mit Auslassungspunkten gekürzt, weil diese Darstellung(en) für Menschen gedacht sind, und kein Mensch riesige mehrere Bildschirm füllende Zahlenkolonnen sehen möchte. Um Daten in Textdateien zu speichern gibt es Funktionen im Numpy-Modul. Beispielsweise `savetxt()`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tut mir bitte nicht weh. Aber der Code funktioniert jetzt und ich habe als Frischling gerade noch den Überblick.
Ich habe den uninteressanten Teil am Ende rausgelassen in dem ich die Daten plotte.
np.savetxt klingt nicht schlecht, wenn dieses auch das tut was ich gerne hätte. Leider habe ich die Datei der Dauerschleife schon überschrieben.
Beispielhaft aus den normalen Daten, die bei kürzere Laufzeit entstehen sah es wie folgt aus:
So tauchten die Daten in der Datei auf. Nehmen wir an, dass dataset nr 7 dataset nr 7000 wäre und 3h weiter. Habe ich mal in Klammern gesetzt, wie ich es meine.
Bis zu einer gewissen Anzahl an Daten gibt er also die kompletten Messdaten wieder und ab diesem gewissen Punkt kürzt er das ganze ein bzw stellt nicht die kompletten Daten dar.
Wenn ich nun np.savetxt anwenden will gestalte ich es einfachheitshalber np.savetxt("test", temp_data_array) ohne weitere Attribute.
Hier gibt er mir folgenden Fehler aus:
Könntet ihr mir erklären, was Herr Computer mir sagen möchte?
Ich danke euch und wünsche einen schönen Abend.
Code: Alles auswählen
import os, sys, time
import datetime
import matplotlib as mlp
import matplotlib.pyplot as plt
import numpy as np
def check_sensors():
""" Reading Pathcontent with all available sensor designations 28-xxxx """
sensor_adresses = []
for sensor_name in os.listdir("/sys/bus/w1/devices"):
if sensor_name.split("-")[0] in ("28", "10"):
sensor_adresses.append(sensor_name)
sensor1 = sensor_adresses[0]
sensor2 = sensor_adresses[1]
with open("Datenausgabe DS18B20.txt", "w") as file:
file.write("DS18B20_1 t1: " + str(sensor1) + '\n' + "DS18B20_2 t2: " + str(sensor2) + '\n')
file.write(" t1 " + " t2 " + " Timestamp " + "Dataset No. " + '\n')
file.write(" ")
return sensor_adresses
def check_data_temp(sensor_adresses):
""" Reading Data of w1_slave files for every sensor in sensor_adresses[] """
temperatures = []
for sensor in sensor_adresses:
with open(os.path.join("/sys/bus/w1/devices", sensor, "w1_slave")) as data:
temp = (float(data.read().split('t=')[-1])/1000)
temperatures.append(temp)
#print(temperatures)
return temperatures
temp_data_sets = input("How much Data Sets do you want to read? ",)
def temp_read_loop():
""" Printing data sets as often as choosen by user """
status = 0
output = []
timestemp_start = datetime.datetime.now().time()
while status < int(temp_data_sets):
sensor_adresses = check_sensors()
temperatures = check_data_temp(sensor_adresses)
timestamp = datetime.datetime.now().time()
temperatures.append(str(timestamp))
temperatures.append(str(status+1))
""" Printing first time the sensor adresses """
if status == 0:
print(sensor_adresses)
with open("Datenausgabe DS18B20.txt", "w") as file:
file.write(str(sensor_adresses) + str('\n'))
print(temperatures)
output.append(temperatures)
status += 1
time.sleep(.5)
""" Printing list of all recorded temperatures """
if status == int(temp_data_sets):
print("Finished reading " + temp_data_sets + " data sets")
temp_data_array = np.asarray(output)
with open("Datenausgabe DS18B20.txt", "a") as file:
file.write(str(temp_data_array))
[b] #np.savetxt('test.out', temp_data_array, delimiter=',')[/b]
return temp_data_array
return status
np.savetxt klingt nicht schlecht, wenn dieses auch das tut was ich gerne hätte. Leider habe ich die Datei der Dauerschleife schon überschrieben.
Beispielhaft aus den normalen Daten, die bei kürzere Laufzeit entstehen sah es wie folgt aus:
Code: Alles auswählen
DS18B20_1 t1: 28-0113161bd91d
DS18B20_2 t2: 28-0113167ce9ad
t1 t2 Timestamp Dataset No.
22.812 22.75 20:34:12.796633 1
22.812 22.75 20:34:15.113494 2
22.812 22.75 20:34:17.433110 3
....,
22.875 22.75 20:34:28.473754 7(7000)
22.875 22.75 20:34:31.673569 8(7001)
22.875 22.812 20:34:33.993514 9(7002)
22.875 22.812 20:34:36.312765 10(7003)
Bis zu einer gewissen Anzahl an Daten gibt er also die kompletten Messdaten wieder und ab diesem gewissen Punkt kürzt er das ganze ein bzw stellt nicht die kompletten Daten dar.
Wenn ich nun np.savetxt anwenden will gestalte ich es einfachheitshalber np.savetxt("test", temp_data_array) ohne weitere Attribute.
Hier gibt er mir folgenden Fehler aus:
Code: Alles auswählen
TypeError: Mismatch between array dtype ('<U32') and format specifier ('%.18e,%.18e,%.18e,%.18e')
Ich danke euch und wünsche einen schönen Abend.
Code: Alles auswählen
[['22.75' '22.812' '21:13:11.708028' '1']
['22.812' '22.812' '21:13:14.028028' '2']
['22.75' '22.812' '21:13:16.347991' '3']
['22.75' '22.812' '21:13:18.667895' '4']
['22.812' '22.812' '21:13:21.867902' '5']]
Also passt das Zeitformat nicht?
Also muss ich für Spalte 0,1,3 jeweils %10.5f beispielsweise eintragen? Was genau bedeuten die 10.5 .. das stammt jetzt von
https://docs.scipy.org/doc/numpy-1.15.0 ... vetxt.html
und für den timestamp entweder ein anderes format oder in sekunden bspw umrechnen?
Dein Array enthält ja nur Strings. Weil Du eine Liste mit zwei Floats und zwei Strings erzeugst, was schon ziemlich durcheinander ist. Daten konvertiert man erst bei der Ausgabe in Zeichen. In Deinem Fall macht ein Numpy-Array auch nicht wirklich Sinn, benutze das csv-Modul.
Die while-Schleife sollte eine for-Schleife sein und die beiden if-Abfragen zum ersten und letzten Schleifendurchgang schreibst Du am besten vor und hinter die Schleife. Bei zwei return.s wird das zweite nie erreicht. Die Stringrepräsentation von Listen und Arrays sind nur für Debugzwecke da, nicht um sie in irgendwelche Dateien zu schreiben.
Strings sind kein Ersatz für Kommentare. Das `temp_data_sets` ist total zwischen den Funktionsdefinitionen versteckt, sollte im Hauptprogramm (Funktion main) abgefragt werden und als Parameter an temp_read_loop übergeben werden, dann aber schon als Zahl um sie nicht bei jeder Benutzung in eine Zahl umwandeln zu müssen.
Die while-Schleife sollte eine for-Schleife sein und die beiden if-Abfragen zum ersten und letzten Schleifendurchgang schreibst Du am besten vor und hinter die Schleife. Bei zwei return.s wird das zweite nie erreicht. Die Stringrepräsentation von Listen und Arrays sind nur für Debugzwecke da, nicht um sie in irgendwelche Dateien zu schreiben.
Strings sind kein Ersatz für Kommentare. Das `temp_data_sets` ist total zwischen den Funktionsdefinitionen versteckt, sollte im Hauptprogramm (Funktion main) abgefragt werden und als Parameter an temp_read_loop übergeben werden, dann aber schon als Zahl um sie nicht bei jeder Benutzung in eine Zahl umwandeln zu müssen.