前面几节介绍了Mqtt协议以及用ESP8266模块作为客户端连接Mqtt服务器并实现数据的发布和订阅。这一节我们就正式的开始制作第一个物联网终端,基于Arduino和ESP8266模块。之所以选择了Arduino是因为它的开发比较方便,并且后期直接可以自己用Atmega芯片搭建最小系统来实现终端的产品化。
以下就是基于Arudino和ESP8266的自动数据采集和上传终端,前期为了调试数据的需要,我直接使用了Arduino mega2560,因为它有多个串口可以使用,当然Arduino UNO也完全没问题,但是由于只有一个硬串口,而软串口支持不了115200波特率,所以ESP模块只能接在硬串口上了,这就导致前期用UNO来开发就会很麻烦,每次改程序就要拔掉ESP模块。所以直接用了2560开发就方便多了。
硬件的连接非常的简单,我这里将ESP模块接到了串口1上,所以接线为:
Esp8266 Arduino Mega2560
Vcc ------------- 3V3
CH_PD ------------ 3V3
GND ------------- GND
URXD ------------- TXD1
UTXD ------------- RXD1
我上传的数据为模拟口A0采集到的模拟电压值,你可以接一个Lm35温度传感器上去,不过我这里仅仅为了测试Mqtt数据传输,就不接了,所以每次测量出来的数据都是随机的。
下面主要就是程序了,思路也很简单,就是完全模拟上一节时手动输入AT指令和Mqtt指令,只不过交由程序来自动实现罢了,好了,直接看程序吧,具体细节我也直接写在程序的注释里了。
//注意,本程序需要Arduino mega2560
//下面填入你自己的IP地址
String tcplinkstr = "AT+CIPSTART=\"TCP\",\"10.0.0.252\",1883";
//你的wifi名称
String wifiname = "******";
//wifi密码
String wifipsd = "******";
String wifilinkstr, tempstr,constr = "";
//mqttlink为mqtt连接指令,参考之前的内容
unsigned char mqttlink[27] = {
0x10, 0x19, 0x00, 0x06, 0x4d, 0x51, 0x49, 0x73, 0x64, 0x70, 0x03, 0xc2, 0x01, 0x2c, 0x00, 0x05, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x00, 0x01, 0x72, 0x00, 0x01, 0x72};
//mqttsubscribe为mqtt数据发布指令,同样参考之前的,这里发送的数据为"t:****",采集到数据后替换掉*
unsigned char mqttpublish[13] = {
0x32, 0x0b, 0x00, 0x01, 0x72, 0x00, 0x01, 0x74, 0x3a, 0x2a, 0x2a, 0x2a, 0x2a};
unsigned char mqttheart[2] = {
0xc0, 0x00};
unsigned char mqttdata[4];
int mi = 0, sndi = 0, mode = 0, at = 0, espok = 0, temp,rtn;
long timenow, timebefor = 0, tm;
void setup() {
//连接电脑串口,用于程序编写时观察程序的运行
Serial.begin(9600);
//用于连接esp8266
Serial1.begin(115200);
//用于连接wifi的AT指令
wifilinkstr = "AT+CWJAP=\"";
wifilinkstr += wifiname;
wifilinkstr += "\",\"";
wifilinkstr += wifipsd;
wifilinkstr += "\"";