Bachelorarbeit Sensoren anbinden an RPi

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13069
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
ossihmz
User
Beiträge: 12
Registriert: Donnerstag 20. Dezember 2018, 06:44

Tut mir bitte nicht weh. Aber der Code funktioniert jetzt und ich habe als Frischling gerade noch den Überblick.

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

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)
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:

Code: Alles auswählen

TypeError: Mismatch between array dtype ('<U32') and format specifier ('%.18e,%.18e,%.18e,%.18e')
Könntet ihr mir erklären, was Herr Computer mir sagen möchte?

Ich danke euch und wünsche einen schönen Abend.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie sieht denn nun das Array `temp_data_array`? Scheinbar passt es nicht zu 4 Floating-Point-Zahlen.
ossihmz
User
Beiträge: 12
Registriert: Donnerstag 20. Dezember 2018, 06:44

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']]
Das sieht so aus, wenn ich es direkt bei python printe.
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?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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