Rotronic HC2A-S温湿度探头读取

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表格里,运行效果如下所示:

在这里插入图片描述
在这里插入图片描述

相关推荐

  1. ARM I2C温湿实验

    2024-04-22 05:00:04       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 05:00:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 05:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 05:00:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 05:00:04       20 阅读

热门阅读

  1. Stable Diffusion,controlnet扩展

    2024-04-22 05:00:04       14 阅读
  2. C++ 随机数

    2024-04-22 05:00:04       11 阅读
  3. PandasTA 源码解析(十六)

    2024-04-22 05:00:04       14 阅读
  4. 深圳南玻集团(二面)

    2024-04-22 05:00:04       14 阅读
  5. golang rabbitmq客户端连接及重连

    2024-04-22 05:00:04       13 阅读
  6. centos8 安装 jenkins

    2024-04-22 05:00:04       11 阅读