You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于使用Python设置温湿度阈值过滤异常数据并插入MySQL的技术问询

解决方案:过滤异常温湿度数据并修复代码问题

首先,你提到的那行判断语句不仅需要修改,还需要扩展逻辑——原语句存在语法错误(temp is not缺少None),而且仅检查是否为None完全不足以过滤你遇到的异常值。我们需要添加数值范围验证,同时处理串口数据可能的格式问题。

核心问题分析

  1. 语法错误:if temp is not and hum is not None: 应该修正为 if temp is not None and hum is not None:
  2. 数据类型问题:从串口读取的temp和hum是字符串类型,无法直接进行数值比较,需要先转换为浮点数/整数
  3. 缺少异常值过滤:设备重启时的异常数据(湿度>5000%、温度超100℃)明显超出合理范围,需要添加范围校验逻辑

修改后的完整代码

import serial
import time
import pymysql.cursors

# 连接数据库
connection = pymysql.connect(
    host='localhost',
    user='ubuntu',
    password='testing',
    database='Blabla',
    cursorclass=pymysql.cursors.DictCursor
)

arduino = serial.Serial('/dev/ttyACM0', 9600)
print('Established serial connection to Arduino')

# 定义温湿度的合理范围(可根据你的传感器型号调整)
MIN_TEMP = -40.0  # 常见环境传感器的最低工作温度
MAX_TEMP = 80.0   # 常见环境传感器的最高工作温度
MIN_HUM = 0.0     # 湿度最低为0%
MAX_HUM = 100.0   # 湿度最高为100%,不可能超过这个值

with connection:
    while True:
        arduino_data = arduino.readline()
        decoded_values = str(arduino_data[0:len(arduino_data)].decode("utf-8")).strip()
        list_values = decoded_values.split(' ')
        print(f'Collected readings from Arduino: {list_values}')
        
        temp = None
        hum = None
        
        # 尝试将字符串转换为数值,并处理可能的格式错误
        try:
            if len(list_values) >= 2:
                temp = float(list_values[0])
                hum = float(list_values[1])
        except ValueError:
            print('Invalid data format from sensor')
            time.sleep(60)
            continue
        
        # 验证数据是否有效:非空且在合理范围内
        if temp is not None and hum is not None:
            if MIN_TEMP <= temp <= MAX_TEMP and MIN_HUM <= hum <= MAX_HUM:
                with connection.cursor() as cursor:
                    cursor.execute(
                        "INSERT INTO `SensorTest` (`Temperature`, `Humidity`) VALUES (%s,%s)",
                        (temp, hum)
                    )
                    connection.commit()
                    print(f'Successfully inserted valid data: Temp={temp}℃, Hum={hum}%')
                cursor.close()
            else:
                print(f'Filtered abnormal data: Temp={temp}℃, Hum={hum}% (out of valid range)')
        else:
            print('Failed to read valid sensor data')
        
        time.sleep(60)

关键修改点说明

  • 语法修复:修正了原判断语句的语法错误
  • 数据类型转换:通过float()将字符串转换为数值类型,支持小数读数
  • 异常值过滤:添加了温湿度的合理范围判断,直接过滤掉超出范围的异常数据
  • 格式错误处理:用try-except捕获数据格式错误的情况(比如串口输出乱码),避免脚本崩溃
  • 日志优化:添加了更详细的打印信息,方便排查问题

你可以根据你的传感器实际参数调整MIN_TEMP、MAX_TEMP等范围值——比如如果用的是DHT22,温度范围是-4080℃,湿度是0100%,这个范围就很合适;如果是工业传感器,可以适当调整上限。

内容的提问来源于stack exchange,提问作者Aken Fernando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:29:06