作为开源三大硬件之一, Arduino 应用已经非常广泛了,创客们使用Arduino开发了各种智能系统。而OneNET作为国内一流的云服务提供商,为开发者免费提供了云服务接入,而且接入接口是开放的,协议是开源的。那么我们如何把Arduino和OneNET结合起来实现智能系统云控制呢,这中间还需要一个联网模块,ESP8266作为性价比极高的WiFi模块就可以很方便的把两者连接起来。接下来我们就一起了解一下如何通过ESP8266使得Arduino实现云接入。
首先进行硬件连接,Arduino使用了中国版的Arduino MEGA 2560,WiFi模块使用了ESP-01S,ESP-01S的Rx和Tx分别连接到Arduino开发板的Tx1和Rx1,实现串口通讯;Arduino的3.3V和GND连接到ESP-01S,为模块供电。这里需要说明的是,Arduino的IO口是5V电平,ESP-01的IO是3.3V电平,但是ESP01的IO口是能够容忍5V电平的,所以直接把两个模块的RX和TX交叉相连也是没有问题的。
接下来开发板连接 USB 线到PC,在Arduino IDE中选择好开发板型号,串口号,IDE就能够连接到开发板了。
在写代码之前,先下载一个库,这个是用来驱动ESP-01的AT指令集库。
https://github.com/i te ad/ITEADLIB_Arduino_WeeESP8266
接下来就可以在Arduino IDE中编写代码了。
启动IDE后保存新建的文件到一个文件夹。
拷贝下载的库文件中的ESP8266.h和ESP8266.cpp到文件夹,之后开始编写代码。
首先引入ESP8266库的头文件:
#include "ESP8266.h"
然后定义一些变量:
#define SSID "Xiao mi _MU"#define PASSWORD "********"#define HOST_NAME "183.230.40.39"#define HOST_PORT (6002)int ti mer_cnt = 0; // 定时器 中断计数int senddata_flag = 0; //定时发送数据 标记 boolean ledStat = 0; //LED灯的状态String comdata = ""; //定义一个comdata 字符 串变量,赋初值为空值unsigned char sendbuff[100]; //发送缓冲区ESP8266 wifi(Serial1,115200); //声明一个wifi对象 在setup函数中初始化网络:
void setup(void){ Serial.begin(9600); //调试串口初始化 Serial.print("setup begin\r\n"); pi nMode(13, OUTPUT); //LED灯初始化 Serial.print("FW Ve rs ion:"); Serial.println(wifi.getVersion().c_str());//获取ESP8266的固件版本 if (wifi.setOp rToS ta TI on()) { //设置ESP8266状态 Serial.print("to sta TI on ok\r\n"); } else { Serial.print("to sta TI on err\r\n"); } if (wifi.joinAP(SSID, PASSWORD)) { //接入WIFI Serial.print("Join AP success\r\n"); Serial.print("IP:"); Serial.println( wifi.getLocalIP().c_str()); } else { Serial.print("Join AP f ai lure\r\n"); } if (wifi.disableMUX()) { Serial.print("single ok\r\n"); } else { Serial.print("single err\r\n"); } //连接到服务器 if (wifi.createTCP(HOST_NAME, HOST_PORT)) { Serial.print("create tcp ok\r\n"); } else { Serial.print("create tcp err\r\n"); } //这里应发送鉴权信息 LoginServer(); wifi.send((const uint8_t*)sendbuff, 60); Serial.print("Login Server OK!\r\n"); //创建定时器 noInterrupts();//禁用所有中断 TCCR1A = 0; TCCR1B = 0; //TCNT1 = TI mer_init; TCCR1B |=(1 << CS12); //256分频 TIMSK1 |=(1 << TOIE1); //启用定时器溢出中断 interrupts();//允许所有中断 Serial.print("setup end\r\n");} 在初始化过程中使用了一个定时器,用来定时1秒钟产生一个中断。
ISR(TIMER1_OVF_vect) //1秒产生一次中断{ timer_cnt++; //中断次数累加 if(timer_cnt > 5) //5秒执行一次 { //digitalWrite(13, !digitalRead(13)); //点亮或者熄灭LED灯 timer_cnt = 0; //中断次数累计结果清空 senddata_flag = 1; //发送数据标记置位 }} 在中断函数中累计5次,也就是间隔5秒设置一次发送数据标记。
在循环函数loop中接收和发送数据。
void loop(void) //主循环中定时发送开发板状态,并接收返回信息和下发指令
{
uint8_t buffer[128] = {0};
comdata = "";
uint32_t len = wifi.recv(buffer, sizeof(buffer), 100);
if (len > 0) {
Serial.print("Received:[");
for(uint32_t i = 0; i < len; i++) {
Serial.print((char)buffer[i]);
if(i>40)
{
comdata+=(char)buffer[i];
}
}
Serial.print("]\r\n");
}
if (len > 40) //大于40个字符,认为是下发指令,
{
//对于下发指令进行处理
if(comdata.indexOf("led:0")!= -1)
{
//熄灭led
ledStat=false;
}else if(comdata.indexOf("led:1")!=-1)
{
//点亮led
ledStat=true;
}else
{
//异常数据丢弃即可
}
}
digitalWrite(13, ledStat);
if(senddata_flag == 1)
{
SendData();
wifi.send((const uint8_t*)sendbuff, 21);
Serial.print("Sended LED state!\r\n");
senddata_flag=0;
}
delay(50);
}
代码完成后编译执行,在串口调试窗口就可以看到开发板的输出日志了。
此时手机可以通过app控制Arduino开发板上的led灯的量灭了。
总结:Arduino的开发板由于封装了底层技术细节,对于应用者来说只需编写很少的代码就能实现功能,非常方便;ESP8266作为性价比非常高的WIFI模块控制起来也很方便;OneNET服务器免费为开发者提供了云接入服务,而且接入协议是开源的,任何人都可以方便的接入。三者结合,就是一套完整的物联网接入解决方案,给开发人员带来了极大的方便。
完整代码可以访问如下地址获取:
https://gitee.com/jamieyy/codes/08jgk3rmys72cltd9haiv30