Repozitář pro studenty 3.ročníku zaměření IVE
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

74 lines
2.0 KiB

import serial
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from datetime import datetime
# -- NASTAVENÍ --
PORT = "COM3"
BAUDRATE = "115200"
MAX_POINTS = 50
# Seznamy pro ukládání dat
casy = []
teploty = []
# připojení na Seriovou linku
ser = serial.Serial(PORT, BAUDRATE, timeout=2)
print(f"Připojeno na {PORT}@{BAUDRATE} baud")
#vytvoření grafu
fig, ax = plt.subplots(figsize=(10,4))
fig.suptitle("ESP32 - teplota v realném čase")
#metoda pro dynamické vykreslování grafu
def update(frame):
"""Přečte řáděk ze seriové linky a aktualizuje graf"""
if ser.in_waiting > 0:
try:
line = ser.readline().decode("utf-8").strip()
if not line:
return
#parsování - hledáme "teplota:XX.X"
#formát původní "teplota:XX.X,vlhkost:XX.X"
parts = line.split(",")
teplota = None
for part in parts:
key, value = part.split(":")
if key.strip() == "teplota":
teplota = float(value.strip())
if teplota is None:
return
now = datetime.now().strftime("%H:%M:%S")
casy.append(now)
teploty.append(teplota)
#omezení na MAX_POINTS
if len(casy) > MAX_POINTS:
casy.pop(0)
teploty.pop(0)
#vykreslení
ax.clear()
ax.plot(casy,teploty,"o",markersize=3,label="Teplota")
ax.set_ylabel("Teplota")
ax.set_xlabel("čas")
ax.legend(loc="upper left")
ax.grid(True)
ax.tick_params(axis="x",roation=45)
fig.tight_layout()
print(f"{now} teplota: {teplota}")
except (ValueError,UnicodeDecodeError) as e:
print(f"Chyba: {e}")
#spuštění animace
ani = animation.FuncAnimation(fig,update,interval=500,cache_frame_data=False)
try:
plt.show()
except KeyboardInterrupt:
pass
finally:
ser.close()
print("Odpojeno.")