之前测试ESP32的ADC得出其并不适合收集模拟传感器的数据,而arduino又没有原生的无线传输方式。恰好手头有几个吃灰的NRF24L01+模块,可以用来将那几个arduino进行组网。首先需要一个带WiFi的设备作为网关将采集到的数据传给Home Assistant。

硬件准备

Parts #
合宙ESP32C3-CORE开发板 1
NRF24L01+ 1
面包板 1
跳线 若干

关于这个C3开发板的简介可以看这里,但要注意之前esphome中用的是esp-idf框架,而arduino框架下SPI用不了。MySensors是arduino框架的,所以我顺便解决了这个问题并PR(现已Merged)。

接线

ESP32-C3 NRF24L01+
GPIO05 CE
GPIO04 CSN/CS
GPIO02 SCK
GPIO03 MOSI
GPIO10 MISO
GPIO19 IRQ

IMG_20221103_222433

固件

File > Preferences > Settings > Addtional boards manager URLS 添加以下源:

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

2022-11-03_22-10

BOARDS MANAGEResp32并安装esp32 by Espressif Systems

Tools > Board 选择AirM2M_CORE_ESP32C3。标准版的USB CDC On BootDisabled,而简版则应Enabled

LIBRARY MANAGERMySensors并安装。

由于C3采用RSIC-V架构,并没有Xtensa特有的XTOS_RESTORE_INTLEVEL,需修改MyHwESP32.h,默认位于~/Arduino/libraries/MySensors/hal/architecture/ESP32

1
2
3
4
5
6
7
8
static __inline__ void __psRestore(const uint32_t *__s)
{
#ifdef XTOS_RESTORE_INTLEVEL
XTOS_RESTORE_INTLEVEL(*__s);
#else
SOC_SYSTIMER_INT_LEVEL;
#endif
}

固件用GatewayESP32OTA

需要更改的几处如下:

1
2
3
4
5
6
7
8
9
10
11
#define MY_RADIO_RF24

#define MY_WIFI_SSID "your_ssid"
#define MY_WIFI_PASSWORD "your_password"

#define MY_GATEWAY_MAX_CLIENTS 2 //根据实际客户端数量调整

#define MY_RF24_CE_PIN 5
#define MY_RF24_CS_PIN 4
#define MY_RF24_IRQ_PIN 19
//自定义pin需要在#include <MySensors.h>之前

最后编译上传。串口调试显示如下信息即连接WiFi成功。

2022-11-03_22-04

接入Home Assistant

Home Assistant的安装见这里

MySensors已集成到HA,无需安装。

配置 > 设备与服务 > 添加集成 > 搜索MySensors并安装。

2022-11-03_22-17

选择Configure a TCP gateway > 填入网关的IP、端口和版本 > 提交。

之后连入网关的客户端传输的传感器数据会自动出现在HA中。

参考资料

Connecting the Radio

The MySensors integration