
刚把吃灰半年的ESP32开发板翻出来,不用接第三方云平台,本地跑个轻量异常检测逻辑,就能做温湿度异常告警,全程不用啃复杂的嵌入式C代码,用Python就能搞定。
前期准备和依赖安装
- 先确认电脑上装了Python3.8及以上版本,打开终端执行命令查看版本:
版本不符合的话直接去Python官网下载对应安装包,安装时记得勾选「Add Python to PATH」选项,不然终端会识别不到python命令。python --version - 给ESP32刷入MicroPython固件,先去MicroPython官网下载对应你开发板型号的固件,再依次执行下面的命令安装刷写工具、擦除原有固件、写入新固件:
pip install esptool esptool.py --port COM3 erase_flash esptool.py --port COM3 --baud 460800 write_flash -z 0x1000 你下载的固件文件名.bin提示:这里的COM3是Windows系统下ESP32对应的串口号,要去设备管理器里确认;Mac/Linux系统下端口一般是/dev/ttyUSB0之类的格式,端口写错的话刷写会直接报错。
- 安装文件传输工具adafruit-ampy,用来把写好的Python脚本传到ESP32开发板上:
pip install adafruit-ampy
核心功能代码编写
我这里用最常见的DHT11温湿度传感器做演示,接线很简单:VCC接3.3V引脚,GND接GND引脚,DATA引脚接GPIO14就行。在本地新建一个main.py文件,写入下面的代码:
from machine import Pin
import dht
import time
from collections import deque
# 初始化温湿度传感器
sensor = dht.DHT11(Pin(14))
# 用滑动窗口存最近20次采样值做异常判断,轻量到能直接在ESP32上跑
temp_history = deque(maxlen=20)
hum_history = deque(maxlen=20)
# 告警阈值,可根据自己的使用场景调整
ALARM_THRESHOLD = 3
while True:
try:
sensor.measure()
current_temp = sensor.temperature()
current_hum = sensor.humidity()
temp_history.append(current_temp)
hum_history.append(current_hum)
# 样本量攒够之后开始做异常检测
if len(temp_history) == 20:
temp_avg = sum(temp_history)/len(temp_history)
# 当前值偏离历史均值超过阈值就触发告警,后面可以自己接蜂鸣器或者消息推送
if abs(current_temp - temp_avg) > ALARM_THRESHOLD:
print(f'温度异常!当前值:{current_temp},历史均值:{temp_avg:.1f}')
time.sleep(2)
except Exception as e:
print('读取传感器出错,正在重试:', e)
time.sleep(1)
小提醒:我这里没上复杂的深度学习模型,毕竟ESP32的内存和算力都有限,用滑动窗口的均值偏移检测足够应付普通家用、小型大棚这类场景,真要跑大模型建议还是接边缘网关,别难为这个几十块的小开发板。
写完代码之后,执行下面的命令把文件传到ESP32上:
ampy --port COM3 put main.py
传完按一下开发板上的复位键,打开串口助手就能看到实时输出的检测结果了,要是接个有源蜂鸣器到GPIO2引脚,在异常判断的分支里加两行拉高电平的代码,就能直接实现本地响铃告警。
几个容易踩的小问题
- DHT11传感器别接5V引脚,我第一次接错直接把传感器烧了,白丢几块钱。
- 刷固件的时候如果一直连不上,先检查是不是数据线有问题,很多便宜的USB线只有供电功能没有数据传输功能。
- 如果觉得告警太灵敏,要么把ALARM_THRESHOLD的数值调大,要么把滑动窗口的长度改长,参数没有固定值,看自己的实际场景慢慢调就行。
整个流程快的话十来分钟就能跑通,不用注册一堆云平台账号,数据全在本地流转也不用担心隐私问题,闲的时候改改参数加点新功能,还挺有意思的。
评论一下?