文章目录
源由
一直以来对家里的环境状态比较在意,在很多年以前,就使用万用板 + 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.
Hello,
Thanks for the article and the work!
I’m having troubles sourcing that particular eink display outside of China(or maybe I am not looking for the correct model). Would you be able to provide an example link from aliexpress/bangood or other provider?
Thank you!
This module is similar to the one I’m using, but the pin order is different, so it cannot be used directly:
https://usa.banggood.com/1_54-Inch-Electronic-Flexible-ink-Screen-Display-Module-Black-and-White-Dual-Color-e-Parper-OLED-p-1756032.html
Or you can use ST7789V drived TFT LCD screen, with pin order GND,VCC,SCL,SDA,RES,DC,CS,BL.
Check the follow image for reference:
https://img.alicdn.com/imgextra/i3/763837891/O1CN016Lkhhv28A85jeREsG_!!763837891.jpg
Thanks !