先声明一下,本次DIY并非原创。
硬件方面,参考了一款国外的DIY,他的项目比较完善。有多个信号指示灯和包装外壳等。
我们的DIY只是用ESP8266跟NRF24L01+加强版的模块直接连接,目的是做个简单的网关,对网关功能进行验证。
当然有兴趣的人可以去做完善的版本。
软件上,我们直接用那个国外DIY项目的源代码。
或者在其基础上进行修改。
这款基于ESP8266的网关支持SoftAP模式(热点模式)设置网络连接参数。
这款MQTT-RF无线网关DIY项目在这里:
https://www.openhardware.io/view/349/MySensors-ESP8266-MQTT-gateway
外观图:
他的源代码:
https://github.com/Japio74/MySensorsESP8266MQTTGateway
或者:
https://www.openhardware.io/dl/58bdb24644f656d179dca125
也有人叫它NodeMCU
前面我们研究了怎么用Arduino IDE给它烧程序。
这个模块可以用使用CP2102的或者CH340的,都可以,后者便宜几块钱。
可以在某宝上买到,十几块钱吧。
NRF24L01+ 无线模块 功率加强版 2.4G 无线收发通信模块
在某宝上,大概两三块钱。
当然我们现在是用在家用场合,收发距离不太远。
如果要远距离传输,最好买那种加屏蔽罩并带有外置天线的。
或者,模块带屏蔽罩,自己另加室外天线。
我们使用MySensors官方给出的连接定义,这个连接方式是跟网关源代码的定义相符合的。
参考:https://www.mysensors.org/build/connect_radio#nrf24l01+-&-esp8266
整个的连接共使用7根线,IRQ(中断信号管脚)不需要连接。
NRF24L01+ 的管脚定义:
跟ESP8266的连接定义:
关于硬件连接,这个很简单。
要注意的是NRF24L01+这个模块不可以直接接5V电源,否则会烧掉,而有的项目中,据说这个模块的信号接收会受到干扰,解决方法是在GND跟3V3的电源之间接滤波电容,可以是10uF或者100uF,乃至再接一个高频瓷片电容(电容上标注文字103pF,3代表倍率–10的3次方,10X10^3)。
打开Arduino,工具–>管理库,搜索“MySensors”:
点安装。
这个库是用来控制LED组的库。
在Arduino的库管理器中,搜索“Adafruit_NeoPixel”:
点安装。
这个库在网关源代码的LedControl.cpp中用到。
这个库是用来获取和计算时间日期的库。
在Arduino的库管理器中,搜索“time”:
点安装。
这个库在网关源码的NtpClient.cpp中用到。
下载好源码MySensors-ESP8266-MQTT-gateway.zip
把code文件夹解压出来,并重命名为 “GatewayESP8266MQTTClient”:
双击“GatewayESP8266MQTTClient.ino”这个文件:
稍作修改:
1、把
#define MY_BAUD_RATE 9600
改为:
#define MY_BAUD_RATE 115200
2、把
#define MY_MQTT_PUBLISH_TOPIC_PREFIX "mys-mqtt-out"
改为:
#define MY_MQTT_SUBSCRIBE_TOPIC_PREFIX "domoticz/out/MyMQTT"
3、把
#define MY_MQTT_SUBSCRIBE_TOPIC_PREFIX "mys-mqtt-in"
改为:
#define MY_MQTT_PUBLISH_TOPIC_PREFIX "domoticz/in/MyMQTT"
char MY_ESP8266_SSID[33];
char MY_ESP8266_PASSWORD[64];
在下面加两行代码:
#define MY_WIFI_SSID MY_ESP8266_SSID
#define MY_WIFI_PASSWORD MY_ESP8266_PASSWORD
#define MY_ESP8266_HOSTNAME "MySensors-Mqtt-gateway"
改为:
#define MY_HOSTNAME "mqtt-sensor-gateway"
6、找到大概128行:
#include
在上面加入一行:
#define MY_INDICATION_HANDLER
7、找到 大概146行:
#undef MY_ESP8266_SSID
#undef MY_ESP8266_PASSWORD
Serial.begin(9600);
修改为:
Serial.begin(MY_BAUD_RATE);
9、找到GatewayESP8266MQTTClient\PersistentData.cpp的第40行,
if (!((brokerIp[i] > 0) && (brokerIp[i] < 255)))
把它改成
if (!((brokerIp[i] >= 0) && (brokerIp[i] <= 255)))
修改后的完整源代码下载地址:
GatewayESP8266MQTTClient_2019.02.16.rar
可以看到默认的IP为:192.168.4.1
开启了AP热点和一个简单的web服务器。
用手机连接热点:
可以看到wifi已经搜索到网关热点了,名字为:MySGateway
直接点击,连接进去。
可以看到已经连接:
然后在手机上打开浏览器,在地址栏输入:192.168.4.1,进入设置页面:
点击“configuration”,进入wifi的配置界面:
因为我的已经设置过了,所以会有参数在里面。
如果从来没有设置过的,右边基本上都是空白的,像是这样:
填写那个表格如下:
Item | Value |
---|---|
Mqtt broker ip address | 你的MQTT Broker IP(我的是10.0.0.2) |
Mqtt broker port | 1883 |
Wireless network | 需要连接的wifi |
Wireless pqssword | wifi密码 |
填完之后,点下面那个“Save”保存设置参数。
保存好之后,它会提示说:
“Configuration stored,gateway will now restart,after 5 seconds”
意思是,配置已经保存,网关在5秒之后重启。
重启之后,串口打印出来的信息如下:
可以看到,ESP8266分配到的IP为:192.168.1.101
好了,此时可以在电脑上用浏览器访问到这个地址,可以看到页面内容如下:
好了,到这里,这个简易的网关就DIY完毕了。
下一篇,将要用另一套ESP8266+NRF24L01模块做个客户端,联合domoticz平台做控制实验。