文章目录
源由
一直以来对家里的环境状态比较在意,在很多年以前,就使用万用板 + ESP8266 + 传感器组装了很多台空气检测节点放在家里,用于监控 PM 2.5 浓度、二氧化碳浓度、温度、湿度等环境状态。
配合 ESPEasy 固件 + Domoticz,可以很方便的采集环境状态的数值,从而配置 Domoticz 的脚本来完成一些自动化动作,例如打开新风、打开空气净化器等。
进一步,也可以通过 Domoticz 将采集到的数据保存到 InfluxDB 中,使用 Grafana 图形化的展示这些环境状态的变化趋势。
在知道嘉立创的 PCB 免费打样活动之后,就产生了将这些空气检测节点进行升级的想法。
目标
这次升级,主要是为了改进以前使用洞泂板,ESP8266 等老旧部件碰到的一些问题,主要有以下几点:
- 更美观,原先使用万用板 + 亚克力面板太多飞线,不是很好看,整体空间利用也不充分,并且现在也有 3D 打印机,可以做一个更好看的外壳。
- 更标准,原先每个节点的传感器选型都不太一致,从而导致每块万用板的飞线都不一致,组装存在出错可能,这次通过使用统一的 PCB,将所有传感器模块位置固定,每个节点的传感器都保持一致。
- 更强大,原先使用的 ESP8266 模组,GPIO 数量较少,在传感器数量多的情况下,GPIO 就不够用了,这次更换为更先进的 ESP32,拥有更多 GPIO,性能也更为强大。并且因为 GPIO 数量更多,还可以额外增加一个屏幕,这样即使不借助 Domoticz 的情况下,也可以独立使用,查看当前环境数据。
- 更灵活,原先使用的 ESPEasy 固件,所有的传感器是通过在它的网页配置界面来完成的,并且它的配置保存格式为自定义的二进制格式,很难阅读以及提前配置,这次更换为更灵活的 ESPHome 固件,可以提前在编译时定制好每个节点所使用的传感器型号、参数等。
当然,也可以借助于这个项目,熟悉一下 EDA 操作和 PCB 布线,为以后其他 DIY 或者复刻立创开源平台其他项目打点基础。
设计
作为一个环境检测节点,我希望它能像一个比较正常的数据设备放在家居环境中,整体参考了市面上已有的各种检测设备,采用了立方体造型。
以及为了可以即时查看数据的需求,在正面添加一个 1.54 寸的屏幕,这样可以在不打开手机的情况下了解到当前环境数据。
另外,还希望这个设备可以查看环境数据历史,因此还需要添加额外的按钮,用来切换各种数据屏幕,这里采用了电容触摸按钮,这样在 3D 打印外壳以及组装时不需要额外设计按钮部分。
当然,作为一个超简单 DIY,这次就全部采用传感器模块以及 ESP32 开发板,这样就不用焊接各种贴片元件了,最大程序简化焊接程序,整个个组装过程中,最难的部分可能就是 PM 2.5 传感器的 1.25mm 8P 直针座了,但是借助于助焊剂,也基本上是很低难度了。
除了 PM 2.5 传感器的 1.25mm 8P 直针座,其他所有传感器和模块都使用 2.54mm 排针座,这样不管是安装还是焊接都很简单。
元件选型
为了满足各种常见数据的采集,以及复用已经购买过的元器件,这次 DIY 的传感器选型如下:
图片 | 类型 | 型号 | 价格(元) | 说明 |
---|---|---|---|---|
![]() |
温湿度 | BME280 或 SHT31 | 22 | 其中 BME280 还额外支持压强检测,同时支持这两种传感器主要是因为它们的引脚顺序相同,可以替换使用。 |
![]() |
颗粒物浓度 | 攀藤 PMS5003 | 70 | 支持 PM 1.0、PM 2.5、PM 10 三种颗粒物浓度检测,以及 PMS5003ST,额外增加了甲醛浓度检测。另外 PMS7003 虽然同样可以使用,但是因为需要额外转接板,不能直接使用 1.25mm 8P 连接线,因此并不推荐。 |
![]() |
二氧化碳浓度 | MH-Z19B | 120 | 可以检测 400-5000 ppm 范围的二氧化碳浓度,当然也可以采用 SenseAir S8 传感器,它们的引脚位置和定义都完全一致。 |
![]() |
光照强度 | BH1750 | 4 | 如果使用光敏电阻还需要额外换算,还是直接采用传感器更简单直接。 |
![]() |
触摸按钮 | TTP223 | 0.3 | 这个模块触摸感应距离大,可以隔着外壳完成触摸操作,用来切换信息页。 |
![]() |
单片机 | NodeMCU-32S | 22 | 直接选用常见的 NodeMCU-32S 开发板,价格便宜,还可以直接给传感器提供 3.3V 供电。 |
![]() |
屏幕 | 1.54 LCD | 20 | 1.54 寸 SPI 接口 IPS 屏幕:分辨率 240x240,主控 ST7789V。 |
![]() |
屏幕 | 1.54 E-ink | 30 | 1.54 寸 SPI 接口 E-ink 屏幕:单色屏,只支持黑白,分辨率 200x200。 |
注:表格中的价格为淘宝上大致价格,随卖家不同价格也会不太相同。
不算上 PCB、3D 打印外壳和 M2 螺丝的话,一个检测节点的成本大概是 260 左右。
备选一个电子墨水屏是因为之前购买了几块 1.54 寸的墨水屏,刚好可以尝试放在不需要背光的场合,以及传感器的刷新率一般不需要很高,电子墨水屏可以满足需求。
当然这里选择 ESP32 而没有选择 ESP32-S2 或者 ESP32-S3 等,它不具备 PSRAM,因此在驱动 LCD 屏幕的时候,没办法直接使用 DMA 传输数据,在刷新率上会有一些欠缺,不过同样由于传感器数据刷新频率并不会太高,这个缺陷也是可以接受的。
功能
作为一个环境数据检测节点,需要具备数据上报能力,同时需要可以通过屏幕直观查看当前环境数据,因此它需要具备以下功能:
- 概览页面,可以直观查看各种环境数据的当前数值,例如当前温度、湿度、PM 2.5 以及二氧化碳浓度。
- 各项数据的历史趋势数据,通过记录过去 12 小时的数据并通过图表展示环境数据的变化趋势。
- 特定传感器的详情数据,例如攀藤 PMS5003 可以同时检测 PM 1.0、PM 2.5、PM 10 浓度,在概览页面无法展示完全,就可以在详情页面展示出来。
- 设备信息界面,可以展示当前设备的名称、Wi-Fi 连接情况、运行时间等基础信息。
- 数据上报能力,我需要将所有环境数据采集并存储到 InfluxDB 中,这需要固件能将数据上报到 Domoticz 中,由 Domoticz 存储到 InfluxDB。
- 批量部署能力,因为会有多个节点,而在重新编写能力之后,需要能批量将所有节点的固件进行批量更新。
当然在现在已经有很多 IoT 的开源固件,要实现这些功能,并不需要自己从头实现,而满足我这些需求,又具备比较高灵活性的开源项目,就是 ESPHome 了。
ESPHome
ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configuration files and control them remotely through Home Automation systems.
ESPHome 是一个配置化生成 ESP32/ESP8266 固件的系统,因此它天然具备了提前配置且本地编辑配置的优势,可以在传感器确定的情况下,直接将所有传感器配置好,直接生成对应的固件,并且它还可以直接编写 Lambda 代码,对于无法直接使用配置来生成的功能,可以直接编写代码来完成。
ESPHome 的 Lambda 代码其实就是 C++ 中的 Lambda 函数,在最终编译阶段会直接整合到项目中一起进行编译,因此只要了解了最终生成代码的逻辑结构,就可以将这个 Lambda 写的很灵活,不受制于它自身提供的示例中所提供的格式。
例如像加入对 Domoticz 的支持,就是使用了 Lambda + MQTT Publish 的能力来完成,
另外就像上面说的,ESPHome 的 Lambda 实际就是 C++ 代码,因此可以通过一些奇怪的操作,来完成特定情况下的代码复用,例如在传感器详细数据页面,都需要绘制当前数值和一个历史数据趋势图,这个时候可以通过 globals
来实现一个可复用的绘图函数,然后在显示组件的 Lambda 代码中直接去调用:
除此之外,ESPHome 还支持 !include
这样的扩展指令,这样就可以将各种配置文件模块化分布,通过指令最终组合起来,在整体结构上可以更清晰,并且通过 !include
还可以实现在编译期指定传感器可替换型号的互相替换,这对批量部署来说又省了一部分工作量。
批量部署
ESPHome 支持通过网络进行 OTA 更新固件,但是如果每次配置文件有更新时,通过 ESPHome 自带的命令行去进行 OTA 更新操作的话,还是一个比较麻烦的事情,毕竟在家里总共也有 5 个节点,而且每个节点的传感器配置还会稍微有一些区别,因此我写了一个脚本,通过配置配置节点设备配置 CSV,来自动编译对应的固件并进行 OTA 更新操作。
并且通过这样一个设备配置表格,也能很清楚的知道目前这些节点所使用的传感器型号是什么,这样在后续传感器失效的情况下,也很容易去购买对应的替代型号。
组装
为了方便拆装,PCB 和外壳以及背板,都使用了 M2*5 的自攻螺丝进行安装。
开源
可以在 GitHub 项目中找到相关的 ESPHome 配置文件、3D 打印外壳模型和 PCB 制造文件。
GitHub:AirCube
焊接和组装时建议参考 PCB 文件,可以在 立创开源平台 AirCube 查看源文件。
其他
在智能家居中,其他一些例如数据可视化展示、智能联动等玩法,也可以参考我以前分享的文章 玩玩智能家居系列。
Thanks for the article and all your hard work. I will source the parts soon (if you provide referral links, I will use those instead).
Thank you again!
It’s okay to use your own links for the parts. I bought them on Taobao, which usually doesn’t ship to countries outside of China.