<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開(kāi)發(fā)網(wǎng)

      電子開(kāi)發(fā)網(wǎng)電子設(shè)計(jì) | 電子開(kāi)發(fā)網(wǎng)Rss 2.0 會(huì)員中心 會(huì)員注冊(cè)
      搜索: 您現(xiàn)在的位置: 電子開(kāi)發(fā)網(wǎng) >> 基礎(chǔ)入門(mén) >> Arduino開(kāi)發(fā)學(xué)習(xí) >> 正文

      遠(yuǎn)程控制通訊--基于Arduino + ESP8266控制LED燈

      作者:佚名    文章來(lái)源:來(lái)源網(wǎng)絡(luò)    點(diǎn)擊數(shù):    更新時(shí)間:2021-10-17

      Arduino是許多智能硬件愛(ài)好者的首選,使用簡(jiǎn)單快捷,而ESP8266模塊也是當(dāng)前最為熱門(mén)的WIFI模塊。本項(xiàng)目完成了Arduino使用EDP協(xié)議通過(guò)ESP8266 WIFI模塊接入OneNET服務(wù)器,并通過(guò)在接入設(shè)備中創(chuàng)建的應(yīng)用來(lái)實(shí)現(xiàn)遠(yuǎn)程控制LED燈。

      【1】硬件連接:

      準(zhǔn)備元件:

      Arduino UNO

      ESP8266 WIFI模塊

      USB轉(zhuǎn)TTL連接線

      硬件連線:

      Arduino UNO USB轉(zhuǎn)TTL

      D2-----------------RX

      D3-----------------TX

      GND---------------GND

      Arduino UNO ESP8266

      RX-----------------TX

      TX-----------------RX

      GND---------------GND

      其中USB轉(zhuǎn)TTL連接電腦用于調(diào)試打印輸出,然后Arduino的串口連接ESP8266的串口。

      實(shí)物連接如下如圖所示:

      【2】ESP8266配置和EDP上傳數(shù)據(jù)介紹:

      選用ESP8266串口WIFI模塊,通過(guò)AT指令控制WIFI模塊接入互聯(lián)網(wǎng),依次完成與接入互聯(lián)網(wǎng)、與OneNet服務(wù)器建立TCP連接、傳輸數(shù)據(jù)等操作。

      1)配置WIFI模塊;

      模塊配置接入OneNet,依次發(fā)送如下幾個(gè)命令到WIFI模塊:

      AT+CWMODE=3

      AT+RST

      AT+CIFSR

      AT+CWJAP=“your ssid”,“password”

      2)和OneNet服務(wù)器建立TCP連接,依次發(fā)送命令:

      AT+CIPSTART=“TCP”,“183.230.40.39”,876 //和服務(wù)器建立TCP連接

      AT+CIPMODE=1 //進(jìn)入透明傳輸模式

      AT+CIPSEND //開(kāi)始傳輸

      命令執(zhí)行結(jié)果如下圖所示:

      【3】創(chuàng)建設(shè)備和應(yīng)用:

      添加產(chǎn)品并創(chuàng)建接入設(shè)備,詳細(xì)創(chuàng)建步驟請(qǐng)查看:http://open.iot.10086.cn/doc/art243.html#66。其中數(shù)據(jù)傳輸協(xié)議選擇EDP。

      在設(shè)備中添加應(yīng)用,創(chuàng)建一個(gè)開(kāi)關(guān)控件,在右側(cè)的屬性中選擇對(duì)應(yīng)設(shè)備的switch0數(shù)據(jù)流 ·注意到屬性中有開(kāi)關(guān)開(kāi)值和開(kāi)關(guān)關(guān)值兩個(gè)屬性,分別默認(rèn)為1,0,這里不做修改(因?yàn)榇a中1為開(kāi),非1則為關(guān)) ·修改EDP命令內(nèi)容為switch0:{v}(與代碼對(duì)應(yīng),代碼中會(huì)將冒號(hào)前的部分作為上傳的數(shù)據(jù)流ID,而將冒號(hào)之后的部分作為上傳是數(shù)據(jù)值) 這里的{v}是通配符當(dāng)下發(fā)命令的時(shí)候,他將會(huì)被開(kāi)關(guān)的開(kāi)/關(guān)值取代,稍后我們將看到命令的內(nèi)容。

      編輯完成后點(diǎn)擊保存應(yīng)用。

      【4】軟件代碼:

      其中Arduino開(kāi)發(fā)板的D13作為被控制的LED燈,在程序中添加設(shè)備ID和APIKey。

      /*
      采用外接電源單獨(dú)供電,2 3口作為軟串口接PC機(jī)作為調(diào)試端
      1 0為串口,連接WIFI模塊
      */
      #include
      #include "edp.c"
      #define KEY "XpAhYrqhsZbk9eVqESnMJznDb3A=" //APIkey
      #define ID "4051313" //設(shè)備ID
      //#define PUSH_ID "680788"
      #define PUSH_ID NULL
      // 串口
      #define _baudrate 115200
      #define _rxpin 3
      #define _txpin 2
      #define WIFI_UART Serial
      #define DBG_UART dbgSerial //調(diào)試打印串口
      SoftwareSerial dbgSerial( _rxpin, _txpin ); // 軟串口,調(diào)試打印
      edp_pkt *pkt;
      /*
      * doCmdOk
      * 發(fā)送命令至模塊,從回復(fù)中獲取期待的關(guān)鍵字
      * keyword: 所期待的關(guān)鍵字
      * 成功找到關(guān)鍵字返回true,否則返回false
      */
      bool doCmdOk(String data, char *keyword)
      {
      bool result = false;
      if (data != "") //對(duì)于tcp連接命令,直接等待第二次回復(fù)
      {
      WIFI_UART.println(data); //發(fā)送AT指令
      DBG_UART.print("SEND: ");
      DBG_UART.println(data);
      }
      if (data == "AT") //檢查模塊存在
      delay(2000);
      else
      while (!WIFI_UART.available()); // 等待模塊回復(fù)
      delay(200);
      if (WIFI_UART.find(keyword)) //返回值判斷
      {
      DBG_UART.println("do cmd OK");
      result = true;
      }
      else
      {
      DBG_UART.println("do cmd ERROR");
      result = false;
      }
      while (WIFI_UART.available()) WIFI_UART.read(); //清空串口接收緩存
      delay(500); //指令時(shí)間間隔
      return result;
      }
      void setup()
      {
      char buf[100] = {0};
      int tmp;
      pinMode(13, OUTPUT); //WIFI模塊指示燈
      pinMode(8, OUTPUT); //用于連接EDP控制的發(fā)光二極管
      WIFI_UART.begin( _baudrate );
      DBG_UART.begin( _baudrate );
      WIFI_UART.setTimeout(3000); //設(shè)置find超時(shí)時(shí)間
      delay(3000);
      DBG_UART.println("hello world!");
      delay(2000);
      while (!doCmdOk("AT", "OK"));
      digitalWrite(13, HIGH); // 使Led亮
      while (!doCmdOk("AT+CWMODE=3", "OK")); //工作模式
      while (!doCmdOk("AT+CWJAP="PDCN","1234567890"", "OK"));
      while (!doCmdOk("AT+CIPSTART="TCP","183.230.40.39",876", "CONNECT"));
      while (!doCmdOk("AT+CIPMODE=1", "OK")); //透?jìng)髂J?/DIV>
      while (!doCmdOk("AT+CIPSEND", ">")); //開(kāi)始發(fā)送
      }
      void loop()
      {
      static int edp_connect = 0;
      bool trigger = false;
      edp_pkt rcv_pkt;
      unsigned char pkt_type;
      int i, tmp;
      char num[10];
      /* EDP 連接 */
      if (!edp_connect)
      {
      while (WIFI_UART.available()) WIFI_UART.read(); //清空串口接收緩存
      packetSend(packetConnect(ID, KEY)); //發(fā)送EPD連接包
      while (!WIFI_UART.available()); //等待EDP連接應(yīng)答
      if ((tmp = WIFI_UART.readBytes(rcv_pkt.data, sizeof(rcv_pkt.data))) > 0 )
      {
      rcvDebug(rcv_pkt.data, tmp);
      if (rcv_pkt.data[0] == 0x20 && rcv_pkt.data[2] == 0x00 && rcv_pkt.data[3] == 0x00)
      {
      edp_connect = 1;
      DBG_UART.println("EDP connected.");
      }
      else
      DBG_UART.println("EDP connect error.");
      }
      packetClear(&rcv_pkt);
      }
      while (WIFI_UART.available())
      {
      readEdpPkt(&rcv_pkt);
      if (isEdpPkt(&rcv_pkt))
      {
      pkt_type = rcv_pkt.data[0];
      switch (pkt_type)
      {
      case CMDREQ:
      char edp_command[50];
      char edp_cmd_id[40];
      long id_len, cmd_len, rm_len;
      char datastr[20];
      char val[10];
      memset(edp_command, 0, sizeof(edp_command));
      memset(edp_cmd_id, 0, sizeof(edp_cmd_id));
      edpCommandReqParse(&rcv_pkt, edp_cmd_id, edp_command, &rm_len, &id_len, &cmd_len);
      DBG_UART.print("rm_len: ");
      DBG_UART.println(rm_len, DEC);
      delay(10);
      DBG_UART.print("id_len: ");
      DBG_UART.println(id_len, DEC);
      delay(10);
      DBG_UART.print("cmd_len: ");
      DBG_UART.println(cmd_len, DEC);
      delay(10);
      DBG_UART.print("id: ");
      DBG_UART.println(edp_cmd_id);
      delay(10);
      DBG_UART.print("cmd: ");
      DBG_UART.println(edp_command);
      //數(shù)據(jù)處理與應(yīng)用中EDP命令內(nèi)容對(duì)應(yīng)
      //本例中格式為 datastream:[1/0]
      sscanf(edp_command, "%[^:]:%s", datastr, val);
      if (atoi(val) == 1)
      digitalWrite(13, HIGH); // 使Led亮
      else
      digitalWrite(13, LOW); // 使Led滅
      packetSend(packetDataSaveTrans(NULL, datastr, val)); //將新數(shù)據(jù)值上傳至數(shù)據(jù)流
      break;
      default:
      DBG_UART.print("unknown type: ");
      DBG_UART.println(pkt_type, HEX);
      break;
      }
      }
      //delay(4);
      }
      if (rcv_pkt.len > 0)
      packetClear(&rcv_pkt);
      delay(150);
      }
      /*
      * readEdpPkt
      * 從串口緩存中讀數(shù)據(jù)到接收緩存
      */
      bool readEdpPkt(edp_pkt *p)
      {
      int tmp;
      if ((tmp = WIFI_UART.readBytes(p->data + p->len, sizeof(p->data))) > 0 )
      {
      rcvDebug(p->data + p->len, tmp);
      p->len += tmp;
      }
      return true;
      }
      /*
      * packetSend
      * 將待發(fā)數(shù)據(jù)發(fā)送至串口,并釋放到動(dòng)態(tài)分配的內(nèi)存
      */
      void packetSend(edp_pkt* pkt)
      {
      if (pkt != NULL)
      {
      WIFI_UART.write(pkt->data, pkt->len); //串口發(fā)送
      WIFI_UART.flush();
      free(pkt); //回收內(nèi)存
      }
      }
      void rcvDebug(unsigned char *rcv, int len)
      {
      int i;
      DBG_UART.print("rcv len: ");
      DBG_UART.println(len, DEC);
      for (i = 0; i < len; i++)
      {
      DBG_UART.print(rcv[i], HEX);
      DBG_UART.print(" ");
      }
      DBG_UART.println("");
      }

      【5】功能測(cè)試:

      設(shè)備上電后,可以看到電腦串口打印輸出的內(nèi)容,首先連接OneNET服務(wù)器:

      連接成功后,可以看到設(shè)備在線狀態(tài):

      點(diǎn)擊設(shè)備應(yīng)用中的開(kāi)關(guān)按鈕,發(fā)送開(kāi)關(guān)命令給設(shè)備:

      設(shè)備接收命令后進(jìn)行解析,并在串口打印輸出:

      當(dāng)解析到數(shù)據(jù)流switch0的值為1時(shí)設(shè)備開(kāi)燈,Arduino 開(kāi)發(fā)板的D13被點(diǎn)亮,相反為0時(shí)燈滅。

      Tags:Arduino,遠(yuǎn)程控制通訊  
      責(zé)任編輯:admin
      請(qǐng)文明參與討論,禁止漫罵攻擊,不要惡意評(píng)論、違禁詞語(yǔ)。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個(gè)字
      [ 查看全部 ] 網(wǎng)友評(píng)論
      主站蜘蛛池模板: 亚洲AV日韩综合一区尤物 | 亚洲国产成人久久综合野外| 亚洲熟女综合色一区二区三区| 天堂久久天堂AV色综合| 狠狠色噜狠狠狠狠色综合久| 99久久综合精品五月天| 一本色道久久综合狠狠躁| 色天天综合久久久久综合片| 伊人色综合久久大香| 成人亚洲综合天堂| 色综合a怡红院怡红院首页| 激情综合婷婷丁香五月蜜桃| 亚洲综合在线成人一区| 亚洲综合色自拍一区| 亚洲AV成人潮喷综合网| 亚洲综合色一区二区三区| 久久精品国产亚洲综合色| 99精品国产综合久久久久五月天| 综合一区自拍亚洲综合图区| 亚洲精品第一国产综合亚AV| 亚洲人成综合网站7777香蕉| 色狠狠成人综合色| 久久综合九色综合欧洲| 激情综合一区二区三区| 色老头综合免费视频| 狠狠人妻久久久久久综合| 狠狠综合亚洲综合亚洲色| 综合偷自拍亚洲乱中文字幕| 本道久久综合无码中文字幕| 亚洲av无码兔费综合| 国产99久久亚洲综合精品| 一本大道无香蕉综合在线 | 色婷婷色综合激情国产日韩| 色综合67194| 狠狠综合视频精品播放| 激情综合婷婷丁香五月蜜桃| 亚洲另类激情综合偷自拍图| 色综合久久久久久久久五月| 伊人色综合视频一区二区三区| 亚洲综合小说另类图片动图| 一本久久a久久精品综合香蕉|