ser.readline() mit Arduino UNO

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
linuxubuntu
User
Beiträge: 9
Registriert: Freitag 28. Dezember 2018, 11:48

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:

Code: Alles auswählen

    s1 = ser.readline()
    print(s1)
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?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
linuxubuntu
User
Beiträge: 9
Registriert: Freitag 28. Dezember 2018, 11:48

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.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Besser, ja. Und hast du dir mal split und strip in der Dokumentation angeschaut?
linuxubuntu
User
Beiträge: 9
Registriert: Freitag 28. Dezember 2018, 11:48

Bin ich jetzt gerade dabei. Danke erstmal für den Hinweis.
narpfel
User
Beiträge: 644
Registriert: Freitag 20. Oktober 2017, 16:10

@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.
linuxubuntu
User
Beiträge: 9
Registriert: Freitag 28. Dezember 2018, 11:48

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?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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)
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten