用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直连。
固件
固件源码如下:
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
|
#define MY_DEBUG
#define MY_RADIO_RF24
#include <SPI.h> #include <MySensors.h>
#define DATA_PIN 3
#define SENSOR_TEMP_OFFSET 0
static const uint64_t UPDATE_INTERVAL = 60000;
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) { 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。
串口调试显示如下信息即连接成功。
Home Assistant的概览中会自动出现传感器的数据。
参考资料
Connecting the Radio
DhtTemperatureAndHumiditySensor