Serielle Daten vom Arduino in Python plotten
Verfasst: Sonntag 12. August 2018, 17:36
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:
Hier der Python Code:
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
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");
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)
Ich bin für alle Tipps dankbar.
Viele Grüße,
Matthias