Serielle Daten vom Arduino in Python plotten

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Python_Test
User
Beiträge: 9
Registriert: Samstag 10. Februar 2018, 17:50

Hallo Python-Gemeinde,
ich möchte Temperatur und Lufftfeuchte gemessen über Arduino Mega und DHT11 über die Serielle Schnittstelle in Python einlesen und Plotten.
Hierzu hab ich auf youtube ein ganz gutes tutorial gefunden:
https://www.youtube.com/watch?v=zH0MGNJbenc

Allerdings arbeite ich in Python 3 über jupyter Notebook (ich hatte in der shell das modul "serial" nicht importiert bekommen).
Anscheinend scheint sich Python an dem split zu stören, wo ich die kommagetrennten Werte von Termeratur und Luftfeuchte aufspalten will, denn es kommt folgende Fehlermeldung:

Using matplotlib backend: Qt5Agg

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-30-5478ef3ba408> in <module>()
19 pass
20 arduinoString=arduinoData.readline()
---> 21 dataArray=arduinoString.split(',')
22 temp=float(dataArray[1])
23 P=float(dataArray[0])

TypeError: a bytes-like object is required, not 'str'


Hier der Code auf dem Arduino-Mega:

Code: Alles auswählen

#include "DHT.h" //DHT Bibliothek laden
#define DHTPIN 2 //Der Sensor wird an PIN 2 angeschlossen    
#define DHTTYPE DHT11    // Es handelt sich um den DHT11 Sensor
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit „dth“ angesprochen

void setup() {
  Serial.begin(9600); //Serielle Verbindung starten
  dht.begin(); //DHT11 Sensor starten
}

void loop() {
  delay(2000); //Zwei Sekunden Vorlaufzeit bis zur Messung (der Sensor ist etwas träge)
  float humidity = dht.readHumidity(); //die Luftfeuchtigkeit auslesen und unter „Luftfeutchtigkeit“ speichern
   float TempC = dht.readTemperature();//die Temperatur auslesen und unter „Temperatur“ speichern
   //Serial.print("Luftfeuchtigkeit: "); //Im seriellen Monitor den Text und 
  Serial.print(TempC); //die Dazugehörigen Werte anzeigen für Luftfeuchtigkeit
  //Serial.println(" %");
  //Serial.print("Temperatur: ");
  Serial.print(" , ");
  Serial.println(humidity); 
  //Serial.println(" Grad Celsius");
Hier der Python Code:

Code: Alles auswählen

import serial
import numpy
import matplotlib.pyplot as plt
from drawnow import*
%matplotlib auto

tempF=[]
humidity=[]

arduinoData=serial.Serial('COM5',9600)
plt.ion()

def makeFig():
    plt.plot(tempF,'ro-')
    plt.show
    
while True:
    while(arduinoData.inWaiting()==0):
        pass
    arduinoString=arduinoData.readline()
    dataArray=arduinoString.split(',')
    temp=float(dataArray[1])
    H=float(dataArray[0])
    tempF.append(temp)
    humidity.append(H)
    drawnow(makeFig)
    plt.pause(.000001)
Mir ist nicht ganz klar, wieso die seriellen Daten nicht richtig gesplittet werden können. Wieso erwartet Python eine "byte-like object" und keinen string?
Ich bin für alle Tipps dankbar.

Viele Grüße,
Matthias
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

`readline` liefert Bytes, die auch mit einem Bytestring gesplittet werden müssen.

Code: Alles auswählen

dataArray=arduinoString.split(b',')
In Python werden Variablen klein_mit_unterstrich geschrieben; `makeFig` (eigentlich `make_fig`) sollte tempF nicht aus dem nichts, sondern als Argument bekommen. plt.show sollte auch aufgerufen werden. Keine Abkürzungen benutzen, was soll denn das F bei tempF heißen?
while ist keine Funktion, die Klammern also überflüssig.
Antworten