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.")