Arduino UNO+ESP8266 WIFI+USB转TTL连接线使用EDP协议控制LED灯

2023-05-16

  Arduino是许多智能硬件爱好者的首选,使用简单快捷,而ESP8266模块也是当前最为热门的WIFI模块。本项目完成了Arduino使用EDP协议通过ESP8266 WIFI模块接入OneNET服务器,并通过在接入设备中创建的应用来实现远程控制LED灯。
【1】硬件连接:
准备元件:

  • Arduino UNO
  • ESP8266 WIFI模块
  • USB转TTL连接线


硬件连线:
Arduino UNO     USB转TTL
D2-----------------RX
D3-----------------TX
GND---------------GND

Arduino UNO     ESP8266
RX-----------------TX
TX-----------------RX
GND---------------GND
其中USB转TTL连接电脑用于调试打印输出,然后Arduino的串口连接ESP8266的串口。
实物连接如下如图所示:

       

【2】ESP8266配置和EDP上传数据介绍:
选用ESP8266串口WIFI模块,通过AT指令控制WIFI模块接入互联网,依次完成与接入互联网、与OneNet服务器建立TCP连接、传输数据等操作。

1)配置WIFI模块;
模块配置接入OneNet,依次发送如下几个命令到WIFI模块:
AT+CWMODE=3
AT+RST
AT+CIFSR
AT+CWJAP="your ssid","password"
2)和OneNet服务器建立TCP连接,依次发送命令:
AT+CIPSTART="TCP","183.230.40.39",876  //和服务器建立TCP连接
AT+CIPMODE=1    //进入透明传输模式
AT+CIPSEND  //开始传输
命令执行结果如下图所示:



关于如何使用WIFI方式接入可以详细查看:『OneNET设备云平台』云平台对接服务_智能设备

【3】创建设备和应用:
添加产品并创建接入设备,详细创建步骤请查看:『OneNET设备云平台』云平台对接服务_智能设备。其中数据传输协议选择EDP。
 

在设备中添加应用,创建一个开关控件,在右侧的属性中选择对应设备的switch0数据流 ·注意到属性中有开关开值和开关关值两个属性,分别默认为1,0,这里不做修改(因为代码中1为开,非1则为关) ·修改EDP命令内容为switch0:{v}(与代码对应,代码中会将冒号前的部分作为上传的数据流ID,而将冒号之后的部分作为上传是数据值) 这里的{v}是通配符当下发命令的时候,他将会被开关的开/关值取代,稍后我们将看到命令的内容。





编辑完成后点击保存应用。

【4】软件代码:
其中Arduino开发板的D13作为被控制的LED灯,在程序中添加设备ID和APIKey。

复制
[code]/*

   采用外接电源单独供电,2 3口作为软串口接PC机作为调试端

   1 0为串口,连接WIFI模块

*/
 
#include <SoftwareSerial.h>
 
#include "edp.c"
 
 
 
#define KEY  "XpAhYrqhsZbk9eVqESnMJznDb3A="    //APIkey 
 
#define ID   "4051313"                          //设备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   //调试打印串口
 
 
 
SoftwareSerial dbgSerial( _rxpin, _txpin ); // 软串口,调试打印
 
edp_pkt *pkt;
 
 
 
/*

* doCmdOk

* 发送命令至模块,从回复中获取期待的关键字

* keyword: 所期待的关键字

* 成功找到关键字返回true,否则返回false

*/
 
bool doCmdOk(String data, char *keyword)
 
{
 
  bool result = false;
 
  if (data != "")   //对于tcp连接命令,直接等待第二次回复
 
  {
 
    WIFI_UART.println(data);  //发送AT指令
 
    DBG_UART.print("SEND: ");
 
    DBG_UART.println(data);
 
  }
 
  if (data == "AT")   //检查模块存在
 
    delay(2000);
 
  else
 
    while (!WIFI_UART.available());  // 等待模块回复
 
 
 
  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); //指令时间间隔
 
  return result;
 
}
 
 
 
 
 
void setup()
 
{
 
  char buf[100] = {0};
 
  int tmp;
 
 
 
  pinMode(13, OUTPUT);   //WIFI模块指示灯
 
  pinMode(8, OUTPUT);    //用于连接EDP控制的发光二极管
 
 
 
  WIFI_UART.begin( _baudrate );
 
  DBG_UART.begin( _baudrate );
 
  WIFI_UART.setTimeout(3000);    //设置find超时时间
 
  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"));           //透传模式
 
  while (!doCmdOk("AT+CIPSEND", ">"));              //开始发送
 
}
 
 
 
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));             //发送EPD连接包
 
    while (!WIFI_UART.available());                 //等待EDP连接应答
 
    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);
 
 
 
          //数据处理与应用中EDP命令内容对应
 
          //本例中格式为  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)); //将新数据值上传至数据流
 
          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

* 从串口缓存中读数据到接收缓存

*/
 
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

* 将待发数据发送至串口,并释放到动态分配的内存

*/
 
void packetSend(edp_pkt* pkt)
 
{
 
  if (pkt != NULL)
 
  {
 
    WIFI_UART.write(pkt->data, pkt->len);    //串口发送
 
    WIFI_UART.flush();
 
    free(pkt);              //回收内存
 
  }
 
}
 
 
 
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("");
 
}


[/code]

【5】功能测试:
设备上电后,可以看到电脑串口打印输出的内容,首先连接OneNET服务器:



连接成功后,可以看到设备在线状态:


点击设备应用中的开关按钮,发送开关命令给设备:


设备接收命令后进行解析,并在串口打印输出:


当解析到数据流switch0的值为1时设备开灯,Arduino 开发板的D13被点亮,相反为0时灯灭。

【6】效果演示:
Arduino+ESP8266接入OneNET


---------------------
作者:alin0111
来源:CSDN
原文:https://blog.csdn.net/alin0111/article/details/123488182
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino UNO+ESP8266 WIFI+USB转TTL连接线使用EDP协议控制LED灯 的相关文章

随机推荐

  • 通过mavlink实现自主航线的过程笔记

    首先是mavlink的协议理解和移植过程 xff08 关于移植参考网址 xff1a https www cnblogs com lovechen p 6064802 html 和http www cnblogs com lovechen p
  • 李群,李代数的几何学心得总结

    大家好 xff0c 我是飞鸽 上了研究生后听到师兄讲到李群 李代数 xff0c 一脸的懵逼 xff0c 他说 我面试搞无人机的如果不知道这个肯定不要 于是乎 xff0c 我在图书馆查询了相关书籍 xff0c 可只有一些英文的书籍 xff0c
  • Hex HERE+ RTK GPS用于自创地面站的过程记录

    教研室本着便宜的原则买了一套hex HERE 43 RTK GPS 5000人民币 xff0c 水平定位精度5cm 垂直定位精度也还可以 xff0c 忘了当时测的是多少了 xff08 以前万级的RTK xff0c 定位精度厘米级 xff09
  • u-center配置GPS的使用说明

    承接上篇 HERE 43 RTK GPS用于自创地面站的过程记录 xff0c 本文主要讲解u center如何配置HERE 43 RTK GPS xff08 一般的gps同此方法一样 xff09 基本配置可先查看网址 xff1a http
  • 对云台、IMU、鲁棒性和硬件时间同步的理解

    作者 xff1a 朱金灿 来源 xff1a clever101的专栏 为什么大多数人学不会人工智能编程 xff1f gt gt gt slam是一门集硬件和软件的多科学技术 xff0c 涉及到很多技术术语 概念以及数学公式等等 下面我将结合
  • QT无人机地面站设计与制作随笔总结

    自己不是专职地面站设计 xff0c 这里简单将经验叙述下 xff08 另外把自己一直空缺着的QT分类补一篇文章 xff09 无论是处于地面站学习的过程还是做项目进行重新整体设计 xff0c 对于这种写代码的过程最好先在MindMaster中
  • 矩阵该左乘还是右乘

    首先说明一点 xff0c 矩阵具有几何意义 xff0c 对于这几何意义的具体理解可看B站的 线性代数的本质 的视频讲解 开始展开议题 为理解记忆这个问题 xff0c 可以从方向余弦矩阵开始着手 xff0c 方向余弦矩阵是由三次旋转矩阵顺序乘
  • 《绿皮书》影评

    以一种看经典的心态看这部电影 xff0c 确实这部电影没有让我失望 很经典 xff0c 很深刻 xff0c 可能每个人都有各自的认知 xff0c 各自的感受 而我感受到了主人公如同城市孤独人的孤独感 或许 xff0c 遭受肉体上的折磨和伤害
  • Cannot find module 'body-parser'

    bug Cannot find module 39 body parser 39 原因很明显 xff0c 这个模块是没有的 xff0c 查看node modules目录下 xff0c 确实没有 解决办法 xff1a 重新安装这个模块 xff
  • gitlab安装和使用--让我们的版本管理可视化

    一 安装环境 xff1a centos6 7实验2G xff0c 生产4G安装包下载 xff08 需要翻墙 xff0c 不然下载很慢 xff09 xff1a https packages gitlab com gitlab gitlab c
  • STM32CubeMX基本使用

    视频 https www bilibili com video BV11t41147wc from 61 search amp seid 61 9347368692610984203 前言 在配置好CubeMX之后 xff0c 就是新建工程
  • make 命令

    https www ibm com support knowledgecenter zh ssw aix 71 com ibm aix cmds3 make htm 用途 维护 更新和重新生成程序组 语法 make DVariable d
  • Opencv求轮廓的中心点坐标

    Opencv求轮廓的中心点坐标 思路 xff1a 1 通过findContours找出图片中的轮廓 xff1b 2 minAreaRect找到最小外接矩形 xff1b 3 得到最小外接矩形的中心点坐标作为轮廓的中心坐标 xff1b cv s
  • 路由器二次开发一步一步把工业路由器变成一个高端的可指定出网、节点和链路的路由器,包含详细过程及快捷脚本(四)

    路由器二次开发一步一步把工业路由器变成一个高端的可指定出网 节点和链路的路由器 包含详细过程及快捷脚本 四 如果没有 路由器 可以采用 废旧的电脑 详细环境部署参考第 一 篇文章 这里采用800米的工业路由器j1900进行二次定制开发 可以
  • 路由器二次开发一步一步把工业路由器变成一个高端的可指定出网、节点和链路的路由器,包含详细过程及快捷脚本(五)

    路由器二次开发一步一步把工业路由器变成一个高端的可指定出网 节点和链路的路由器 包含详细过程及快捷脚本 五 如果没有 路由器 可以采用 废旧的电脑 详细环境部署参考第 一 篇文章 这里采用800米的工业路由器j1900进行二次定制开发 可以
  • 应用windows批处理嵌套复制文件夹

    作者 xff1a 朱金灿 来源 xff1a clever101的专栏 为什么大多数人学不会人工智能编程 xff1f gt gt gt 应用windows批处理文件将一个文件夹下的多个子文件夹复制到另一个文件夹下 xff0c 代码如下 xff
  • FreeRTOS代码剖析之4:内存管理Heap_4.c

    FreeRTOS8 0 1内存管理的最后一个堆模型Heap 4 xff0c 貌似是在这一个版本才有的 所以找到的说明几乎没有 代码的开头注释也只是简单地说了一下实现了pvPortMalloc 和vPortFree 两个函数 xff0c 并且
  • 如何在 Ubuntu 上安装 Python 3.8

    Python是一种解释型 面向对象 动态数据类型的高级程序设计语言 Python是世界上使用最广泛的编程语言之一 xff0c 由于其简单易学的语法 xff0c Python是初学者和有经验的开发者的热门选择 xff0c Python是一种相
  • (三)OpenCV中的图像处理之轮廓

    注释 xff1a 本文翻译自OpenCV3 0 0 document gt OpenCV Python Tutorials xff0c 包括对原文档种错误代码的纠正 该章节分为以下四个小节 xff1a 一 Contours xff1a Ge
  • Arduino UNO+ESP8266 WIFI+USB转TTL连接线使用EDP协议控制LED灯

    Arduino是许多智能硬件爱好者的首选 xff0c 使用简单快捷 xff0c 而ESP8266模块也是当前最为热门的WIFI模块 本项目完成了Arduino使用EDP协议通过ESP8266 WIFI模块接入OneNET服务器 xff0c