Rotronic HC2A-S温湿度探头通过Python读取
代码如下:
import tkinter as tk
from tkinter import ttk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import serial
from serial.tools.list_ports import comports
from datetime import datetime
import pandas as pd
import os
# 获取系统中可用的串口列表
ports = [comport.device for comport in comports()]
# 创建 GUI 窗口
root = tk.Tk()
root.title("温湿度监控")
# 添加串口选择部件
port_label = tk.Label(root, text="选择串口:")
port_label.grid(row=0, column=0, padx=10, pady=5)
ports_combobox = ttk.Combobox(root, values=ports, state="readonly")
ports_combobox.grid(row=0, column=1, padx=10, pady=5)
# 添加连接按钮
def connect_serial():
global ser
try:
chosen_port = ports_combobox.get()
if chosen_port:
ser = serial.Serial(chosen_port, baudrate=19200, timeout=1)
if ser.isOpen():
print('串口打开成功!')
connect_button.config(state="disabled")
update_values()
else:
print('无法打开串口!')
except Exception as e:
print(f"打开串口时出错:{e}")
connect_button = ttk.Button(root, text="连接", command=connect_serial)
connect_button.grid(row=0, column=2, padx=10, pady=5)
# 添加暂停按钮
def toggle_pause():
global paused
paused = not paused
if paused:
pause_button.config(text="继续")
else:
pause_button.config(text="暂停")
pause_button = ttk.Button(root, text="暂停", command=toggle_pause)
pause_button.grid(row=0, column=3, padx=10, pady=5)
# 添加温湿度值显示部件
humidity_label = tk.Label(root, text="湿度: ")
humidity_label.grid(row=1, column=0, padx=10, pady=5)
temperature_label = tk.Label(root, text="温度: ")
temperature_label.grid(row=2, column=0, padx=10, pady=5)
# 创建湿度趋势图
fig_humidity, ax_humidity = plt.subplots()
line_humidity, = ax_humidity.plot([], [], 'b', label='Humidity')
ax_humidity.set_ylim(0, 100)
ax_humidity.set_xlim(0, 10)
ax_humidity.set_ylabel('湿度(%)')
ax_humidity.set_xlabel('时间')
ax_humidity.set_title('湿度趋势图')
ax_humidity.legend()
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为中文宋体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
canvas_humidity = FigureCanvasTkAgg(fig_humidity, master=root)
canvas_humidity.draw()
canvas_humidity.get_tk_widget().grid(row=3, columnspan=3, padx=10, pady=5)
# 初始化湿度趋势图数据
xdata_humidity = []
ydata_humidity = []
# 是否暂停标志
paused = False
# 保存数据到 Excel
def save_data_to_excel():
# 获取当前日期和时间
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
# 生成带有时间戳的文件名
file_name = f"humidity_data_{timestamp}.xlsx"
# 将数据保存为 Excel 文件
data = {"时间": xdata_humidity, "湿度": ydata_humidity}
df = pd.DataFrame(data)
df.to_excel(os.path.join("data", file_name), index=False)
print(f"数据已保存到 'data/{file_name}'")
# 更新温湿度值和趋势线图
def update_values():
try:
if ser and ser.isOpen() and not paused:
# 发送读取数据的命令
command = "{F00RDD}\r"
ser.write(command.encode())
# 接收数据
response = ser.readline()
decoded_response = response.decode('latin1', errors='ignore')
# 解析数据并显示
data_parts = decoded_response.split(';')
if len(data_parts) >= 6:
humidity = float(data_parts[1].strip()) # 湿度值
temperature = float(data_parts[5].strip()) # 温度值
humidity_label.config(text=f"湿度: {humidity:.2f}%")
temperature_label.config(text=f"温度: {temperature:.2f}°C")
# 更新湿度趋势图
update_humidity_plot(humidity)
except Exception as e:
print(f"更新数据时出错:{e}")
root.after(3000, update_values)
# 更新湿度趋势图
def update_humidity_plot(humidity):
global xdata_humidity, ydata_humidity
xdata_humidity.append(datetime.now().strftime('%H:%M:%S'))
ydata_humidity.append(humidity)
line_humidity.set_data(xdata_humidity[-500:], ydata_humidity[-500:])
min_humidity = min(ydata_humidity)
max_humidity = max(ydata_humidity)
range_humidity = max_humidity - min_humidity
# 根据湿度识别的精度进行调整
accuracy = 0.2
if range_humidity > 0:
min_y = min_humidity - accuracy
max_y = max_humidity + accuracy
else:
min_y = humidity - 1
max_y = humidity + 1
ax_humidity.set_ylim(min_y, max_y)
# 检查xdata_humidity中的值是否都相同,如果是,则设置一个合适的范围
if all(value == xdata_humidity[0] for value in xdata_humidity):
ax_humidity.set_xlim('00:00:00', '00:00:01') # 举例,根据需要设置合适的时间范围
else:
ax_humidity.set_xlim(min(xdata_humidity), max(xdata_humidity))
canvas_humidity.draw()
# 在窗口关闭时保存数据
def on_closing():
save_data_to_excel()
root.destroy()
# 绑定窗口关闭事件
root.protocol("WM_DELETE_WINDOW", on_closing)
# 运行 GUI
root.mainloop()
可以实现UI显示温湿度值,绘制出湿度的趋势图,趋势图保留最新的500个数据,所有的测试值保存到同级目录data文件下Excel表格里,运行效果如下所示: