基于ESP32-C3的高低温报警温度计
需求的来源
需求场景
空调的内机探温头在挂机中,这个与我们身体附近的温度相差太大,基本上空调设定的问题与实际温度相差不少,我们期望屋内休息处可以在设定的温度值的正负1摄氏度内。 尤其是睡着后,室内实际的温度比空调设定温度低了好几摄氏度,这个容易让人着凉,或者影响睡眠。
现有方案的问题
美的美居的问题
用的是美的空调,说是可以和美的美居生态的产品互联。但是查了下,发现其温湿度传感器,居然一直无货, 且只有自己家有一个,还没有第三方的。 因此走美的美居自家闭环控制不可行。
米家的问题
于是期望借助米家来闭环控制或感知温度。
高价(近百元)购入米家空调伴侣,用于控制和获取空调设定的温度。没有问题。
使用多个米家温湿度传感器用来获取多个位置的温湿度。
–> 开始出现问题: 传感器发送/广播(更新)温湿度的时间间隔不定,有的时候长达数十分钟,网关获取后上传到服务器的时间也是不定的!有时候都有快30分钟的延后。
使用米家的智能场景来做控制
–> 米家在延后很久后再下发控制,此时已经很冷了。整体而言,属于不可使用的阶段。
购买了多种米家传感器,发现都有各种各样的问题:
- 秒秒测:1h一次的温度上传记录,太久了,用其自己的App蓝牙获取的话电量耗费巨大。
- 米家温湿度传感器:间隔太久,且精度为1摄氏度
- 青萍等:也是间隔太久
因此整体总结下来是理论上可行,实际上不行。
涂鸦的问题
买了米家的传感器,温度精度高还不错,本身就具有高低温报警功能,但是只有声音报警,这个不好,无法满足要求。 支持手机端推送手机提示来做高低温报警,这个也不错。也可以付费购买电话告警。于是这个在购买后就保留下来了。
但是很快问题出现了:
- 买了几个涂鸦的空调伴侣均无法与我们的美的空调适配上。
- 需要手动关闭告警声音,这个声音会吵醒宝宝。
市场上那么多温度计,为什么要在产生电子垃圾?
因为时间和精力有限,本来也是期望买现有的产品来解决问题。可是购买了几套智能家居后发现问题依然没有解决。
想了想总结了以下需要满足的要求:
- 温度精度最好精确到0.2摄氏度:如果以1摄氏度为单位,那么作为反馈来调节空调的话容易太过滞后,或者过激
- 提供高低温报警:可以设置阈值
- 报警方式最好是震动:因为声音会吵醒宝宝
- 可以在手机端本地或者远程查看温湿度
- 温湿度上报频率可调,或者满足至少10分钟上报一次
- 有历史(最少24小时)温度曲线/记录:用于回看和查询
- 最好可以和空调或者智能开关连控:主要的目的就是为了放置冻着
- 与空调或者智能开关连控的时间不能过长(例如不能超过10分钟): 否则人都冻坏了还没动作
后续再想了想,干脆不要联调/连控,只需要可以震动报警即可。还是没有找到对应的产品。 本想着自己写个App用手机的震动来解决,但是又觉得麻烦。
因此就开始制作电子垃圾了:用ESP32 + 震动马达 + 温湿度传感器 来解决。
实施
非常简单,购买ESP32-C3,震动马达,温湿度传感器(SHT4X)模块,总共不到30块,然后写代码,搭建MQTT服务器,配合朋友告知的IoTManager,完成最终的搭建。
最终效果如下:
可以设定高低温告警阀值,可以设置30分钟内不再告警(手机端或者物理按键),可以查看每10分钟的温度曲线。
其他开发中遇到的问题与Tips
无法烧录的问题:因为串口在minicom中打开被占用
出现的问题如下:
使用命令行烧录也是如此:
提示编译出来的文件过大
修改layout即可,Arduino菜单中选择Huge App(3M App, no OTA)
烧录后不断重启
- Arduino菜单中选择Verbose调试,查看具体出错内容,另外Flash选择DIO而非QIO
- 在Arduio菜单中选中Erase All Flash before flashing
其他项目参考
-
ESPHome: 相当于一个安装好了各种工具/utils的系统,自己可以写类似脚本的方式来使用配置各种功能,也包括硬件的各种驱动,自己只需要写类似DeviceTree的描述符即可,方便快速使用。
-
ESP RainMaker : ESP官方提供的云平台,有APP端,但是我尝试了多次,且使用一样的版本的库依然无法使用,在Provision的时候总是失败,放弃折腾了,而且这个缺少App端和服务端的log查看,不好调查问题。
文档或者代码参考
- ESP IDF中使用Arduino库
- ESP RainMaker的Demo与视频教程, 这个的文字版+笔记
- Luat ESP32-C3 official document site
- IoTManaer Demo 代码:Python代码
- Ardunio Cli的使用
- Ardunio Cli与VSCode
快速获取IDF及其submodule
到IDF的release中下载archive,在某个release对应的Download an archive with submodules included
中下载,这个比较快。