用NRF24L01+将Arduino读取的传感器数据通过MySensor网关传给Home Assistant。

硬件准备

Parts #
Arduino Pro Mini 1
NRF24L01+ 1
AMS1117-3.3V 1
LM35 1
FT232RL串口模块 1
面包板 1
跳线 若干

接线

Arduino Pro Mini NRF24L01+
9 CE
10 CSN/CS
13 SCK
11 MOSI
12 MISO
2 IRQ

LM35的数据线接Arduino的Pin 3。注意NRF24L01的供电需用AMS1117降为3.3V,否则稳定性会下降,数据线可以5V直连。

IMG_20221104_111147

固件

固件源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
* Modified from: https://github.com/mysensors/MySensorsArduinoExamples/blob/master/examples/DhtTemperatureAndHumiditySensor/DhtTemperatureAndHumiditySensor.ino
* https://blog.mjyai.com/2022/11/04/arduino-mysensors-nrf24l01-home-assistant/
*/

// 启用调试模式
#define MY_DEBUG

// 选择无线模块
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69
//#define MY_RS485

#include <SPI.h>
#include <MySensors.h>

// 设定数据接口
#define DATA_PIN 3

// 若传感器存在数据漂移,设定漂移量
#define SENSOR_TEMP_OFFSET 0

// 设备睡眠时长(毫秒)
static const uint64_t UPDATE_INTERVAL = 60000;

// 设定强制更新间隔,强制更新时间为 UPDATE_INTERVAL*FORCE_UPDATE_N_READS [ms]
static const uint8_t FORCE_UPDATE_N_READS = 10;

#define CHILD_ID_TEMP 0

int val;
float lastTemp;
uint8_t nNoUpdatesTemp;
bool metric = true;

MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);


void presentation()
{
// 发送节点名称和版本到网关
sendSketchInfo("LM35 Temperature", "1.1");

// 注册传感器到网关
present(CHILD_ID_TEMP, S_TEMP);

metric = getControllerConfig().isMetric;
}


void setup()
{

}


void loop()
{
// 获得维度
val = analogRead(DATA_PIN);
float temperature = (val / 1023.0) * 50;

if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {
// 只有数据变动或n次采样后才发送数据
lastTemp = temperature;

// 设定温度偏移量
temperature += SENSOR_TEMP_OFFSET;

if (!metric) {
temperature = (temperature * 9) / 5 + 32;
}
// 重置更新次数
nNoUpdatesTemp = 0;
send(msgTemp.set(temperature, 1));

#ifdef MY_DEBUG
Serial.print("T: ");
Serial.println(temperature);
#endif
} else {
nNoUpdatesTemp++;
}

// 睡眠以节能
sleep(UPDATE_INTERVAL);
}

最后编译上传。若报错stk500_recv(): programmer is not responding则需升级bootloader

串口调试显示如下信息即连接成功。

2022-11-04_11-10

Home Assistant的概览中会自动出现传感器的数据。

2022-11-04_11-10_1

参考资料

Connecting the Radio

DhtTemperatureAndHumiditySensor