Seite 1 von 1
ser.readline() mit Arduino UNO
Verfasst: Montag 31. Dezember 2018, 15:25
von linuxubuntu
Hallo Zusammen
Von meinem Arduino UNO lese ich von zwei Sensoren die Temperatur über die USB Schnittstelle ein. Die Daten werden im Minutenintervall vom Arduino gesendet und mit einem Python Script ausgelesen. Die Daten werden anschliessend in eine Datenbank geschrieben, was alles soweit funktioniert. Nun möchte ich die Daten von den Sensoren in zwei verschiedene Spalten in der Datenbank schreiben. Konkret sieht das so aus:
s1 liefert die Werte von den beiden Sensoren wie folgt:
b'25.69\r\n'
b'22.00\r\n'
Nun möchte ich diese eine Ausgabe von s1 wie folgt aufteilen:
t1 = 25.69
t2 = 22.00
Kann mir hier jemand weiterhelfen?
Re: ser.readline() mit Arduino UNO
Verfasst: Montag 31. Dezember 2018, 15:32
von __deets__
Wenn das wirklich dein Format ist, dann ist das großer Mist. Denn niemand garantiert dir, das du beim öffnen und lesen der seriellen Schnittstelle nicht genau die erste Zeile verpasst. Und danach konsequent alle Werte genau falsch herum zuordnest.
Es gibt verschiedenen Ansätze das zu lösen, aber der einfachste besteht darin, auf dem arduino die Ausgabe so zu modifizieren, dass du einen Namen des Sensors mit ausgibst. Zb
Wohnzimmer=20.0
Und danach ist dein Problem durch die diversen String-Methoden wie strip und split zu lösen. Die werden alle im Python Tutorial erklärt.
Re: ser.readline() mit Arduino UNO
Verfasst: Montag 31. Dezember 2018, 15:41
von linuxubuntu
Danke für die Rückmeldung. Ist diese Ausgabe besser?
b'leader: 23.06\r\n'
b'returns: 22.31\r\n'
Diese Werte kommen immernoch zusammen beim auslesen mit dem Python script.
Re: ser.readline() mit Arduino UNO
Verfasst: Montag 31. Dezember 2018, 15:51
von __deets__
Besser, ja. Und hast du dir mal split und strip in der Dokumentation angeschaut?
Re: ser.readline() mit Arduino UNO
Verfasst: Montag 31. Dezember 2018, 15:56
von linuxubuntu
Bin ich jetzt gerade dabei. Danke erstmal für den Hinweis.
Re: ser.readline() mit Arduino UNO
Verfasst: Montag 31. Dezember 2018, 16:17
von narpfel
@linuxubuntu: Eventuell ist es auch robuster, die beiden Werte in beispielsweise ein JSON-Objekt zu stecken und jede Zeile in Python mit dem `json`-Modul zu parsen.
Re: ser.readline() mit Arduino UNO
Verfasst: Mittwoch 2. Januar 2019, 14:21
von linuxubuntu
Hallo Zusammen
Ich bringe die beiden Zahlen nicht auseinander, sodass ich diese einzelnn in die Datenbank schreiben kann. Wollte diese in eine Liste schreiben, sodass ich sie dann die einzelnen Listenelemente auslesen kann. Jedoch liefert die Länge der liste die Zahl 13 was mir nicht verständlich ist.
kann mir jemend helfen wie ich die beiden Zahlen einzeln einer variable zuordnen kann aus der List?
Code: Alles auswählen
from datetime import datetime
import psycopg2
import serial
con = psycopg2.connect(user="xxxxx", password="xxxxx", host="xxxxx", port="5432", database="mydb")
ser = serial.Serial('/dev/ttyACM3', 9600)
cur = con.cursor()
while True:
data_from_arduino = ser.readline()
print(data_from_arduino.split())
print(len(data_from_arduino))
Der Code liefert folgende Ausgabe:
[b'24.62', b'20.12']
13
Ich vermute dass ist ein String und müsste in ein float convertiert werden, wie mache ich das in einer Liste?
Re: ser.readline() mit Arduino UNO
Verfasst: Mittwoch 2. Januar 2019, 14:43
von __deets__
So wie du den Code da oben zeigst hast du meine Anregung fuer vernuenftig benannte Werte nicht befolgt. Nochmal: das hat nichts mit Geschmack zu tun. Es ist ein FEHLER, das nicht zu machen.
Da du nur Code und keine Daten zeigst, kann man auch nicht konkreter helfen. Aber so wuerde man das richtig machen:
Code: Alles auswählen
DATA= """foo=1234.4
bar=5234.120
"""
for line in DATA.split("\n"):
name, _, wert = line.strip().partition("=")
print(name, wert)
Re: ser.readline() mit Arduino UNO
Verfasst: Mittwoch 2. Januar 2019, 15:05
von __blackjack__
@linuxubuntu: Du gibst die Länge der vom Arduino empfangenen Bytes aus. Das sind halt 13 Stück. Was sollte da denn sonst für ein Wert kommen?