Python problem - plotta data i realtid.

Permalänk

Python problem - plotta data i realtid.

Jag håller med ett projekt på en univ. kurs där vi skall öva på att läsa in data från en sensor och sedan presentera värdena grafiskt. I mitt fall använder jag en sensor, kallad BME680, för att mäta temperatur, lufttryck och luftfuktighet. Har skrivit en kod i Python för inläsning av 100 värden. Den ser ut så här:

import serial, atexit import time import numpy as np def cleanup(): ser.close() f.close() atexit.register(cleanup) query1 = "T0?" query2 = "P0?" query3 = "H0?" ser = serial.Serial("COM3",9600,timeout=1) # min kontakt med Arduino nano time.sleep(3) # ser.flush() # repeating part start filnamn = input("Enter filnamn:") f = open(filnamn, 'w') # t0 = time.time() # starting time # for i in range(0, 10): i = 1 while i < 100: i += 1 # writting to serial ser.write(query1.encode()) time.sleep(0.5) #read from serial - temperature reply = ser.readline() reply=reply.decode('UTF-8') print(reply) temperatures = float(reply[2:]) # writting to serial ser.write(query2.encode()) time.sleep(0.5) #read from serial - air pressure reply = ser.readline() reply=reply.decode('UTF-8') print(reply) pressures = float(reply[2:]) # writting to serial ser.write(query3.encode()) time.sleep(0.5) #read from serial - humidity reply = ser.readline() reply=reply.decode('UTF-8') print(reply) humidity = float(reply[2:]) f.write(time.strftime("%c")) f.write(" ") f.write(str(temperatures)) f.write(" ") f.write(str(pressures)) f.write(" ") f.write(str(humidity)) f.write('\n') print(i) f.write('\n') time.sleep(.1)

Hur fungerar det om man vill plotta data i realtid? Skall plotkommandona ligga inuti eller utanför while-loopen??...

[code] [/code] infoga /Vzano, Mod
Permalänk
Medlem

Ska det visas i realtid så skulle jag köra i loopen.

Typ läsa in värden i en array som jag sedan använder för att visa datan grafiskt.

Visa signatur

I5 9600k@stock / Cooler Master Evo 212 / Gigabyte Z390 Gaming X / Corsair Vengeance LPX 16GB DDR4 3000MHz / MSI RTX2070 Gaming Z / EVGA 550 BQ / Asus VG27BQ 27" 165Hz

Ryzen 5 5600x@stock / Asus Rog Strix X570-E Gaming / Corsair Vengeance RGB Pro 16GB 3600MHz CL18 / MSI RTX3070 Suprim X / BeQuiet Pure Power 11 600W / Asus VG278Q 27" 144Hz

Permalänk
Skrivet av CubaCola:

Ska det visas i realtid så skulle jag köra i loopen.

Typ läsa in värden i en array som jag sedan använder för att visa datan grafiskt.

Ok. Jag modifierade mitt script enligt följande:

import serial, atexit
import time
import numpy as np
import matplotlib.pyplot as plt

def cleanup():
ser.close()
f.close()
atexit.register(cleanup)

query1 = "T0?"
query2 = "P0?"
query3 = "H0?"
ser = serial.Serial("COM3",9600,timeout=1) # min kontakt med Arduino
time.sleep(3)
# ser.flush()
# repeating part start

filnamn = input("Enter filnamn:")
f = open(filnamn, 'w')
# t0 = time.time() # starting time

T = []
p = []
fukt = []
tid = []

# for i in range(0, 10):
i = 1
while i < 100:
i += 1
tid = i

# writting to serial
ser.write(query1.encode())
time.sleep(0.5)

#read from serial - temperature
reply = ser.readline()
reply=reply.decode('UTF-8')
print(reply)
T = float(reply[2:])

# writting to serial
ser.write(query2.encode())
time.sleep(0.5)

#read from serial - air pressure
reply = ser.readline()
reply=reply.decode('UTF-8')
print(reply)
p = float(reply[2:])

# writting to serial
ser.write(query3.encode())
time.sleep(0.5)

#read from serial - humidity
reply = ser.readline()
reply=reply.decode('UTF-8')
print(reply)
fukt = float(reply[2:])

plt.plot(tid, T, 'xr')
plt.xlabel('tid')
plt.ylabel('temperatur')
plt.tight_layout()
plt.grid()

f.write(time.strftime("%c"))
f.write(" ")
f.write(str(T))
f.write(" ")
f.write(str(p))
f.write(" ")
f.write(str(fukt))
f.write('\n')
print(i)
f.write('\n')
time.sleep(.1)

Det går att köra scriptet i Python men det genererar ingen plot som jag hade önskat?? Testar i detta fall endast med temperaturen. Kanske jag har använt fel funktion i matplotlib biblioteket (?).

Permalänk
Medlem

måste du inte även ha plt.show() med för att visa ploten?
var länge sedan jag använde python och matlibplot dock.

Visa signatur

I5 9600k@stock / Cooler Master Evo 212 / Gigabyte Z390 Gaming X / Corsair Vengeance LPX 16GB DDR4 3000MHz / MSI RTX2070 Gaming Z / EVGA 550 BQ / Asus VG27BQ 27" 165Hz

Ryzen 5 5600x@stock / Asus Rog Strix X570-E Gaming / Corsair Vengeance RGB Pro 16GB 3600MHz CL18 / MSI RTX3070 Suprim X / BeQuiet Pure Power 11 600W / Asus VG278Q 27" 144Hz

Permalänk
Skrivet av CubaCola:

måste du inte även ha plt.show() med för att visa ploten?
var länge sedan jag använde python och matlibplot dock.

Ja, det är korrekt. Men eftersom jag vill plotta mina temperaturdata i realtid så lade jag in kommandot plt.pause i mitt Python-script. Fick tips om detta av min kurslärare.

import serial, atexit
import time
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime, timedelta

ser = serial.Serial("COM3",9600,timeout=1) # min kontakt med Arduino

def cleanup():
ser.close()
f.close()
atexit.register(cleanup)

query1 = "T0?"
query2 = "P0?"
query3 = "H0?"
# ser = serial.Serial("COM3",9600,timeout=1) # min kontakt med Arduino
time.sleep(3)
# ser.flush()
# repeating part start

filnamn = input("Enter filnamn:")
#f = open(filnamn, 'w')
# t0 = time.time() # starting time

dt = input("Enter time resolution in seconds:")

T = []
p = []
fukt = []
tid = []

# for i in range(0, 10):
i = 0
t_old = datetime.now()
while 1:
t_new = datetime.now() # tar den aktuella tiden
my_delta_time = t_new-t_old # hur mkt tid har passerat sedan sista datatagning
if (timedelta( seconds=int(dt) ) < my_delta_time) | (i == 0) : # kolla om det har gått den valda perioden sedan förra mätningen
t_old = datetime.now() # nollställer min stop watch efter varje datainsamling
i += 1
tid = (i-1)*int(dt)
f = open(filnamn, 'a')

# writting to serial
ser.write(query1.encode())
time.sleep(0.5)

#read from serial - temperature
reply = ser.readline()
reply=reply.decode('UTF-8')
print(reply)
T = float(reply[2:])

# writting to serial
ser.write(query2.encode())
time.sleep(0.5)

#read from serial - air pressure
reply = ser.readline()
reply=reply.decode('UTF-8')
print(reply)
p = float(reply[2:])

# writting to serial
ser.write(query3.encode())
time.sleep(0.5)

#read from serial - humidity
reply = ser.readline()
reply=reply.decode('UTF-8')
print(reply)
fukt = float(reply[2:])

plt.plot(tid, T, 'xr')
plt.xlabel('tid')
plt.ylabel('temperatur')
plt.tight_layout()
plt.grid()
plt.pause(0.01)
#plt.show()

f.write(time.strftime("%c"))
f.write(" ")
f.write(str(T))
f.write(" ")
f.write(str(p))
f.write(" ")
f.write(str(fukt))
#f.write('\n')
print(i)
f.write('\n')
time.sleep(.1)

f.close()
#t_old = datetime.now()