使用ESP32-C6实现温度警报
你将构建一个小型气候传感器,用于向你的PNeX服务器报告室内温度和湿度,并在温度过高时向你的手机发送通知。无需云账户,也无需物联网订阅:数据留在本地。
在过程中,你将使用PNeX的三个功能:
- 自定义固件IDE:通过浏览器编写电路板代码,PNeX自动编译并为你添加Wi-Fi、加密功能以及空中升级支持;
- 使用Starlark语言编写函数,Starlark是一种基于Python语法的沙盒化语言;
- 通过流程读取传感器数据、运行函数并发送警报。
1:安装PNeX服务器
PNeX可在Raspberry Pi 4或5(64位Raspberry Pi OS Lite)或任何搭载Docker的Linux系统上运行。在Pi上打开终端(ssh pi@pnex.local),并执行以下命令:
检查:确认你在浏览器中已登录PNeX。
2:连接传感器
将ESP32-C6-Zero插入面包板中央位置。AM2301传感器有三根引线:
•红色(VCC):3V3引脚(或5V,传感器可接受两种电压)
•黑色(GND):地线引脚
•黄色(DATA):GP0引脚
在黄色线路的柱子和3V3之间加一个10 kΩ电阻。这能确保两次读取之间数据线保持高电平。
仔细数一下引脚。USB接口侧面的引脚顺序为:5V、GND、3V3、GP0。GP0是第四个引脚,不是第三个。
大多数Zero开发板出厂时的引脚头未焊接。请务必焊接好,否则引脚将无法接触面包板。该开发板仍可通过USB供电,因此在尝试读取传感器之前,一切看起来都正常。
3:创建固件项目
打开Edges → 自定义固件 → 新建项目。命名为“气候传感器”,选择芯片家族ESP32-C6,然后创建。
编辑器会打开一个初始示例代码。PNeX所需的所有功能(Wi-Fi、与服务器的加密连接、空中升级)都位于PNeX库中。你的文件仅包含你的逻辑代码。
4:添加传感器库
点击“+ Lib”并选择DHT传感器库。AM2301属于与DHT21相同的传感器系列。该库会显示为一个芯片,位于src/main.cpp旁边。
只能使用此列表中的库。它们的版本被固定,因此每次编译结果都相同。
5:粘贴代码,保存并验证
将编辑器中的全部内容替换为以下草图:
点击“保存并验证”。服务器将为ESP32-C6编译代码(首次构建需要几分钟)。
注意代码中缺少的内容:没有Wi-Fi密码、没有服务器地址、没有密钥。PNeX会在为您的板子构建固件时自动注入这些信息。
检查:状态栏会显示“Revision r2 编译完成”。
6:注册板子
打开 Edges → Devices / Agents → Register。为该板子命名,例如 climate-1。此名称将在 PNeX 的所有地方用于识别设备,包括流媒体服务。
7:选择型号和固件
选择通用 ESP32-C6(Waveshare C6-Zero)。在固件选项下,选择 Climate sensor 而不是通用的 PNeX 固件。
8:Wi-Fi 网络
选择您的 Wi-Fi 网络,或点击 + 添加一个:SSID 和密码。使用 2.4 GHz 网络:ESP 板子无法识别 5 GHz 网络。
您添加的 Wi-Fi 网络将保存在 Edges → Referentials 中,并在下次使用其他板子时再次提供。密码仅用于编译固件。
9:PNeX 服务器地址
该板子需要您 PNeX 服务器的地址。如果 PNeX 服务器为空,请点击其旁边的 +:该字段会预填入您当前使用的地址。点击“添加”。在局域网中检测 PNeX 服务器,若不确定可自动为您找到服务器。
使用 pnex.local 安装时,板子将连接到 Pi 的 IP 地址(例如 192.168.1.20):ESP 板无法解析 .local 域名。如果您使用真实域名安装了 PNeX,则此字段已固定,无需选择。
10:创建并构建
检查摘要,然后点击“创建并构建”。PNeX 将为该板子编译固件:包括您的代码、Wi-Fi 地址和密钥。
检查:在设备列表中,固件列会变为“成功”。
11:通过浏览器进行闪存
使用USB数据线将板子连接到电脑。在设备列表中,点击“Flash”,然后再次点击“Flash”,选择板子的端口。它会显示为一个USB串行或“USB JTAG/串行调试单元”设备。
使用Chrome、Edge或其他Chromium浏览器:闪存功能使用Web Serial。如果未显示端口,请按住BOOT按钮,按下并松开RESET,再松开BOOT,然后重试。
您只能通过USB进行一次闪存。后续版本的代码可通过空中更新(Update over the air)安装。
检查:几秒钟后,设备会在列表中变为“Active”。
12:查看读数
打开可视化 → 快速图表。选择温度指标,传感器气候-1,点击添加,然后对湿度重复相同操作。
每10秒会出现一个新的数据点。向传感器吹气:湿度值会在几次读数内迅速变化。
检查:两条曲线都随房间环境变化而移动。
13:编写函数(Python语法)
打开自动化 → 函数 → 新建函数,命名为Climate – comfort check,选择Starlark并创建该函数。
Starlark是一种小型语言,采用Python语法:def、if、字典、#注释。它运行在沙箱环境中,仅能执行计算操作:无文件、无网络。粘贴以下代码:
@input 和 @output 行并非普通注释。每个 @input 都会成为流程中函数节点的输入,每个 @output 都会成为输出。handle 会为每个输出返回一个值,且名称相同。
点击保存。
14:测试功能
点击“运行测试”,输入 31.4 作为温度,然后点击“运行”。
检查结果:输出应为 too_hot = true,celsius = "31.4",fahrenheit = "88.5"。
将 THRESHOLD_C 修改为您认为重要的温度值,例如温室、服务器机柜或婴儿房的温度,然后保存。
15:将手机添加为通道
在手机上安装 ntfy 应用程序,并订阅一个名称较难猜测的主题:以 pnex-climate- 开头,后跟您自己设置的几个随机字母和数字。任何知道该主题名称的人都可以读取它,因此切勿重复使用教程中的名称。
在 PNeX 中,打开“自动化”→“通知”→“新建通道”→选择 ntfy: server https://ntfy.sh,即相同的主题,然后创建。使用该通道的“测试”按钮:您的手机上会弹出一条测试消息。
电子邮件、Telegram、Slack 或 Discord 的操作方式相同。参见“通过电子邮件或手机接收提醒”。
16:编写消息内容
打开“模板”选项卡,然后选择“新建模板”:
•名称:气候——太热
•主题:[climate-1] 太热
•身体:
声明两个变量 celsius 和 fahrenheit(添加变量),为它们设置示例值,然后点击“预览”。
17:发送测试消息
在模板底部,选择“向频道发送测试”选项,模板将使用示例值并立即发送。选择你的 ntfy 频道,然后点击“测试”:消息会弹出到你的手机上。接着点击“保存更改”。
18:在流程中读取传感器数据
打开 Automation → 流程 → 新建流程,并将其命名为“气候——过热提醒”。
a. 选择画布上已有的 Inject 节点,并将间隔时间设置为 300 秒:该流程每 5 分钟运行一次。
b. 添加一个 Device (read) 节点,选择 climate-1 并勾选温度(公制)。将新鲜度窗口设置为 120 秒,这样断电的传感器永远不会因旧数据触发警报。
19:添加函数和通知
c. 添加一个 Function 节点,选择“气候——舒适度检查”。
d. 添加一个 Notification 节点,输入你的 ntfy 频道(如果希望,也可在应用内添加),并选择模板“气候——过热”。
20:连接并部署
拖动线路:
•注入 → 设备(读取)
•设备(读取)· 温度 → 功能 · 温度
•功能 · 过热 → 通知 · 触发器
•功能 · 摄氏度 → 通知 · 摄氏度
•功能 · 华氏度 → 通知 · 华氏度
只有当触发器为真时,才会发送通知。点击“保存更改”,然后“部署”。
检查:流程状态显示“已部署”。
21:测试警报
你无需等待热浪来袭:
将函数中的 THRESHOLD_C 设置为当前温度以下的值,保存后,在流程的“功能”节点中选择新版本,再次部署;
或者将传感器在手中保持一分钟。
下次运行时(最多5分钟内),你的手机会震动。
检查:通知“房间内温度为……°C(……°F)”会出现在你的手机上。
22:查看交付日志
每条消息都会在“自动化 → 通知 → 事件”(或通道行中的“日志”)中列出:日期、通道、状态(已发送、失败、被阻止(反垃圾邮件))以及发送该消息的流程。点击某一行可查看发送失败的详细错误信息。
23:在你的手机上
ntfy 应用(或你主题的 ntfy 网页)会显示使用模板渲染后的警报内容。
只要温度过高,每5分钟就会收到一条消息。调整注入间隔以减少消息数量。
本文编译自hackster.io





