Arduino接入OneNET云服务

嵌入式技术

1332人已加入

描述

作为开源三大硬件之一,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交叉相连也是没有问题的。

Arduino


接下来开发板连接USB线到PC,在Arduino IDE中选择好开发板型号,串口号,IDE就能够连接到开发板了。
在写代码之前,先下载一个库,这个是用来驱动ESP-01的AT指令集库。
https://github.com/itead/ITEADLIB_Arduino_WeeESP8266

Arduino


接下来就可以在Arduino IDE中编写代码了。

Arduino


启动IDE后保存新建的文件到一个文件夹。

Arduino


拷贝下载的库文件中的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 "); pinMode(13, OUTPUT); //LED灯初始化 Serial.print("FW Version:"); Serial.println(wifi.getVersion().c_str());//获取ESP8266的固件版本 if (wifi.setOprToStation()) { //设置ESP8266状态 Serial.print("to station ok "); } else { Serial.print("to station err "); } if (wifi.joinAP(SSID, PASSWORD)) { //接入WIFI Serial.print("Join AP success "); Serial.print("IP:"); Serial.println( wifi.getLocalIP().c_str()); } else { Serial.print("Join AP failure "); } if (wifi.disableMUX()) { Serial.print("single ok "); } else { Serial.print("single err "); } //连接到服务器 if (wifi.createTCP(HOST_NAME, HOST_PORT)) { Serial.print("create tcp ok "); } else { Serial.print("create tcp err "); } //这里应发送鉴权信息 LoginServer(); wifi.send((const uint8_t*)sendbuff, 60); Serial.print("Login Server OK! "); //创建定时器 noInterrupts();//禁用所有中断 TCCR1A = 0; TCCR1B = 0; //TCNT1 = timer_init; TCCR1B |=(1 << CS12); //256分频 TIMSK1 |=(1 << TOIE1); //启用定时器溢出中断 interrupts();//允许所有中断 Serial.print("setup end ");} 在初始化过程中使用了一个定时器,用来定时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("] ");
    }
    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! ");
      senddata_flag=0;
   }
   delay(50);
}

Arduino


代码完成后编译执行,在串口调试窗口就可以看到开发板的输出日志了。


此时手机可以通过app控制Arduino开发板上的led灯的量灭了。

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

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分