关于使用Python设置温湿度阈值过滤异常数据并插入MySQL的技术问询
解决方案:过滤异常温湿度数据并修复代码问题
首先,你提到的那行判断语句不仅需要修改,还需要扩展逻辑——原语句存在语法错误(temp is not缺少None),而且仅检查是否为None完全不足以过滤你遇到的异常值。我们需要添加数值范围验证,同时处理串口数据可能的格式问题。
核心问题分析
- 语法错误:
if temp is not and hum is not None:应该修正为if temp is not None and hum is not None: - 数据类型问题:从串口读取的
temp和hum是字符串类型,无法直接进行数值比较,需要先转换为浮点数/整数 - 缺少异常值过滤:设备重启时的异常数据(湿度>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
相关产品推荐
相关产品推荐

