0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

远程控制通讯--基于Arduino + ESP8266控制LED灯

算法&编程学院 来源:网络整理 2018-02-27 09:10 次阅读

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 //开始传输

命令执行结果如下图所示:

【3】创建设备和应用:

添加产品并创建接入设备,详细创建步骤请查看:http://open.iot.10086.cn/doc/art243.html#66。其中数据传输协议选择EDP。

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

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

【4】软件代码:

其中Arduino开发板的D13作为被控制的LED灯,在程序中添加设备ID和APIKey。

/*
采用外接电源单独供电,2 3口作为软串口接PC机作为调试端
1 0为串口,连接WIFI模块
*/
#include
#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("");
}

【5】功能测试:

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

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

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

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

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


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

    关注

    186

    文章

    6448

    浏览量

    185530
  • ESP8266
    +关注

    关注

    50

    文章

    953

    浏览量

    44307
收藏 人收藏

    评论

    相关推荐

    ESP8266模块想实现手机远程控制

    arduino开发板,ESP8266WiFi模块想实现手机远程控制,哪位大神有这方面的经验资料,帮忙发一份吧,拜求
    发表于 05-08 17:50

    如何使用EDP协议通过ESP8266 WIFI模块接入OneNET服务器来实现远程控制LED

    本项目完成了Arduino使用EDP协议通过ESP8266 WIFI模块接入OneNET服务器,并通过在接入设备中创建的应用来实现远程控制LED
    发表于 06-16 08:29

    如何利用STM32+ESP8266去实现远程控制LED

    如何利用STM32+ESP8266去实现远程控制LED呢?有哪些基本步骤?
    发表于 12-08 07:26

    ESP8266远程控制开关的方法分享

    ESP8266远程控制开关示例超全面详细1 背景描述ESP8266模块是比较标准方便的wifi开发模块,把他当做为单片机,有输入输出引脚和操作指令、内存,就是一个计算机了。引脚收发接口可做串口
    发表于 02-28 14:34

    esp8266控制led51单片机底层程序资料下载

    esp8266控制led51单片机底层程序可以控制led亮灭,亲测可行
    发表于 02-27 15:00 59次下载

    ESP8266制作能通过手机远程控制的智能插座

    ESP8266制作智能插座!手机远程控制,让家电疯狂起来~
    的头像 发表于 06-04 06:26 6604次阅读

    Arduino 编程 ESP8266 12F NodeMCU 实现 PWM 控制呼吸

    Arduino 编程 ESP8266 12F NodeMCU 实现 PWM 控制呼吸
    发表于 11-18 19:21 47次下载
    <b class='flag-5'>Arduino</b> 编程 <b class='flag-5'>ESP8266</b> 12F NodeMCU 实现 PWM <b class='flag-5'>控制</b>呼吸<b class='flag-5'>灯</b>

    esp笔记(2)使用Arduino IDE 开发 esp8266

    LEDEsp8266 V3 开发板V3 开发板的MCU为esp8266,并且板载了USB转串口模块,使得我们可以通过串口打印将数据发送到PC中,GPIO2口还连接了...
    发表于 12-05 14:51 55次下载
    <b class='flag-5'>esp</b>笔记(2)使用<b class='flag-5'>Arduino</b> IDE 开发 <b class='flag-5'>esp8266</b>

    远程控制)App inventor 编写安卓app控制 ESP8266

    App inventor 编写安卓app控制 ESP8266第一 下载ESP8266示例(arduino ide 编程开发)第二 修改demo例程第三 app inventor 开发原
    发表于 12-08 17:06 26次下载
    (<b class='flag-5'>远程控制</b>)App inventor 编写安卓app<b class='flag-5'>控制</b> <b class='flag-5'>ESP8266</b>

    最简单DIY基于ESP8266的智能彩灯②(在网页用按键和滑动条控制RGB

    和滑动条控制RGB)文章目录ESP8266ESP32智能彩灯开发系列文章目录前言一、最简单DIY基于ESP8266的智能彩灯②(在网页用
    发表于 12-29 19:02 7次下载
    最简单DIY基于<b class='flag-5'>ESP8266</b>的智能彩灯②(在网页用按键和滑动条<b class='flag-5'>控制</b>RGB<b class='flag-5'>灯</b>)

    使用ESP8266 wifi DIY控制

    电子发烧友网站提供《使用ESP8266 wifi DIY控制.zip》资料免费下载
    发表于 07-25 09:18 13次下载
    使用<b class='flag-5'>ESP8266</b> wifi DIY<b class='flag-5'>控制</b><b class='flag-5'>灯</b>

    ESP8266 Arduino通讯

    电子发烧友网站提供《ESP8266 Arduino通讯.zip》资料免费下载
    发表于 11-15 09:38 14次下载
    <b class='flag-5'>ESP8266</b> <b class='flag-5'>Arduino</b><b class='flag-5'>通讯</b>

    使用ESP8266(NodeMCU)控制远程电源插座

    电子发烧友网站提供《使用ESP8266(NodeMCU)控制远程电源插座.zip》资料免费下载
    发表于 02-06 10:44 3次下载
    使用<b class='flag-5'>ESP8266</b>(NodeMCU)<b class='flag-5'>控制</b><b class='flag-5'>远程</b>电源插座

    ESP8266 01S继电器控制智能实现

    是GPIO3接继电器控制端,继电器选 择常闭端接线高电平触发,控制LED亮灭。 补充说明:①市面上的LED
    发表于 04-27 11:31 5次下载
    <b class='flag-5'>ESP8266</b> 01S继电器<b class='flag-5'>控制</b>智能<b class='flag-5'>灯</b>实现

    带有Blynk和IR的Arduino ESP8266控制继电器

    电子发烧友网站提供《带有Blynk和IR的Arduino ESP8266控制继电器.zip》资料免费下载
    发表于 06-30 10:31 0次下载
    带有Blynk和IR的<b class='flag-5'>Arduino</b> <b class='flag-5'>ESP8266</b><b class='flag-5'>控制</b>继电器