Arduino接入OneNET云服务
发表日期 : 2018/08/26  201 收藏
Angel_YY
向TA提问
1316
总阅读量
7
作品
作为开源三大硬件之一,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交叉相连也是没有问题的。
0001.png
接下来开发板连接USB线到PC,在Arduino IDE中选择好开发板型号,串口号,IDE就能够连接到开发板了。
在写代码之前,先下载一个库,这个是用来驱动ESP-01的AT指令集库。
https://github.com/itead/ITEADLIB_Arduino_WeeESP8266
0002.png
接下来就可以在Arduino IDE中编写代码了。
0004.png
启动IDE后保存新建的文件到一个文件夹。
0005.jpg
拷贝下载的库文件中的ESP8266.h和ESP8266.cpp到文件夹,之后开始编写代码。
首先引入ESP8266库的头文件:
#include "ESP8266.h"

然后定义一些变量:

#define SSID        "Xiaomi_MU"
#define PASSWORD    "********"
#define HOST_NAME   "183.230.40.39"
#define HOST_PORT   (6002)
int timer_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");
    pinMode(13, OUTPUT);    //LED灯初始化
    
    Serial.print("FW Version:");
    Serial.println(wifi.getVersion().c_str());//获取ESP8266的固件版本
      
    if (wifi.setOprToStation()) {       //设置ESP8266状态
        Serial.print("to station  ok\r\n");
    } else {
        Serial.print("to station  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 failure\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  = timer_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);
}
0006.png
代码完成后编译执行,在串口调试窗口就可以看到开发板的输出日志了。
0007.gif
此时手机可以通过app控制Arduino开发板上的led灯的量灭了。

总结:Arduino的开发板由于封装了底层技术细节,对于应用者来说只需编写很少的代码就能实现功能,非常方便;ESP8266作为性价比非常高的WIFI模块控制起来也很方便;OneNET服务器免费为开发者提供了云接入服务,而且接入协议是开源的,任何人都可以方便的接入。三者结合,就是一套完整的物联网接入解决方案,给开发人员带来了极大的方便。

完整代码可以访问如下地址获取:
https://gitee.com/jamieyy/codes/08jgk3rmys72cltd9haiv30

综合应用 arduino OneNET MQTT esp8266
【你的赞赏是对原创作者最大的认可】
打赏
0人已打赏
Angel_YY
向TA提问
1316
总阅读量
7
作品
相关文章推荐
换一批
相关回答
换一批
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
双11活动