ESP8266如何通过手机APP与51esp8266与单片机连接接以达到控制LED?

arduino通过esp8266与服务器通信,如何做到上传数据的同时做到控制?
我现在能做到把温湿度数据在loop循环里每两秒上传到服务器里,也能做到用服务器发送数据控制Led,但是一将二者整合就失败了
已有帐号?
无法登录?
社交帐号登录&&&&51单片机控制esp8266
51单片机控制esp8266
用51单片机控制esp8266,esp8266用的是at固件,
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行3093人阅读
前言:这个题目是我在单片机课程设计《基于ESP8266的物联电梯系统》中用到的,其实本质上就是实现了单片机对esp8266进行初始化,再将手机连上esp8266的WiFi,然后再通过手机端发送指令,esp8266接收到命令传入单片机,单片机再进行相应的操作。esp8266这种小型模块,在物联世界的发展中,有着强大的生命力,我本人比较喜欢它。同时这个也有相应的作品,程序也比较完整,希望能帮到大家。
代码概况:将模块的VCC,GND,TXD,RXD与单片机的VCC,GND,RXD,TXD接好,以为51单片机没有进程和线程的概念,所以就在main函数的while(1)中放入我们要的主程序,而用串口中断的方式来接收esp8266发过来的数据信息,从而实现用esp8266控制单片机。
/***************************************************main.c***************************************************************/
void main()
&& &init();&&&&&&&&& & && //这里是你自己的程序里面自定义的初始化程序
&& &init_esp(); & & //初始化esp8266
&& && while(1)
&& &&&& ES=1;&& &&& &//因为每次处理完接收到的数据都关闭串口中断,所以在主程序循环中加入ES=1开启中断
&& &&& &reach_floor();&& && //这个是我的主程序的名称
//*********************串口中断程序********************************
void ser() interrupt 4
&& &ldat=SBUF;
&& &remote_control(ldat);&&& //esp8266接收数据并且作相应处理
/*********************************************esp8266.h****************************************************************/
#ifndef ESP8266_H
#define ESP8266_H
//#include &AT89X52.H&
#include&reg52.h&
#include &stdio.h&
#include&main.h&
#define uint unsigned int
#define uchar unsigned char
void init_esp();
void remote_control(unsigned char ldat);
extern uint lift_key_5,lift_key_4,lift_key_3,lift_key_2,lift_key_1;&& //因为我做的是电梯系统,所有这里需要接收到对应楼层号码信息,就改变楼层的数值。
/***********************************************esp8266.c***************************************************************/
#include&esp8266.h&
void init_esp()
&& &TH1=0XFD;&&& //串口中断的波特率设为9600,同时记得将esp8266的AT固件代码改为9600的波特率,然后刷入该AT固件。
&& &TH0=0XFD;
&& &TR1=1;
&& &REN=1;&& &&& //使能串口允许接收
&& &SM0=0;&&&&& //工作在串口的工作方式1
&& &SM1=1;
&& &ES=0;&& &&& //串口中断关闭,待初始化后再打开
&& &EA=1;&& &&& //总中断打开
&& &TI = 1;
&& &&& &for (a=0; a&50000; a++);&& &//延时几秒,让模块有时间启动
&& &&& &printf (&AT+CWMODE=3\n&); //设置为softAP和station共存模式
&& &&& &for (a=0; a&30000; a++);&& &
&& &&& &printf (&AT+RST\n&);& //重新启动模块
&& &&& &for (a=0; a&50000; a++);&& &
&& &&& &printf (&AT+CIPMUX=1\n&); //启动多连接
&& &&& &for (a=0; a&20000; a++);
&& &&& &printf (&AT+CIPSERVER=1\n&);//建立server,默认端口为333
&& &&& &&& &&& &&& &&& &&& &&& &&& &
&& &&& &for (a=0; a&20000; a++);
&& &&& &printf (&AT+CIPSTO=50\n&); && &//服务器超时时间设置
&& &&& &for (a=0; a&20000; a++);
&& &&& &RI=0;
&& &&& &ES=1;&& //初始化完成,串行口中断打开
//到了这里,就有一个疑问:ESP8266在接收到AT命令之后都会返回一个OK,为什么这里我没有相应的语句保证ESP8266成功接收到上面的几条命令呢?
//答案是:因为单片机与esp8266通过的直接连接极少的情况才会丢失信息,比较可靠,而且我想速度达到最快。
//执行上述命令,模块进入服务模式,下面单片机就可以接收远程发来的数据
//远程选择电梯楼层程序
//这里楼层的号码用了符号来代替,应为在给esp8266发送命令的过程中,通常需要输入一些数值,而esp8266有时又会返回一些数值,
//在串口接收的过程中,这些接收到的数字会影响我们的程序对楼层的判断,所以要采取特殊的表示楼层的方法。
void remote_control(unsigned char ldat)
&& &&& &&& &switch(ldat)
&& &&& &&& &{
&& &&& &&& &&& &case '!':&&&&&&&&&&&&&&&&&&&& //感叹号表示1楼,当然你也可以用其他表示方式,你也可以先接收到1,然后再进行其他的判断
&& &&& &&& &&& &&& &&&& printf (&AT+CIPSEND=0,33\n&);&&&&&&&&&&&&&& //发送语句的命令
&& &&& &&& &&& &&& &&& &for (a=0; a&10000; a++);
&& &&& &&& &&& &&& &&& &printf (&%c\nplease enter your destination:&,'1');&& //需要发送的语句
&& &&& &&& &&& &&& &&& &lift_key_1=
&& &&& &&& &&& &&& &&& &
&& &&& &&& &&& &case '@':
&& &&& &&& &&& &&& &&&& printf (&AT+CIPSEND=0,33\n&);
&& &&& &&& &&& &&& &&& &for (a=0; a&10000; a++);
&& &&& &&& &&& &&& &&& &printf (&%c\nplease enter your destination:&,'2');
&& &&& &&& &&& &&& &&& &lift_key_2=
&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &
&& &&& &&& &&& &case '#':
&& &&& &&& &&& &&& &&&& printf (&AT+CIPSEND=0,33\n&);
&& &&& &&& &&& &&& &&& &for (a=0; a&10000; a++);
&& &&& &&& &&& &&& &&& &printf (&%c\nplease enter your destination:&,'3');
&& &&& &&& &&& &&& &&& &lift_key_3=
&& &&& &&& &&& &&& &&& &
&& &&& &&& &&& &case '$':
&& &&& &&& &&& &&& &&&& printf (&AT+CIPSEND=0,33\n&);
&& &&& &&& &&& &&& &&& &for (a=0; a&10000; a++);
&& &&& &&& &&& &&& &&& &printf (&%c\nplease enter your destination:&,'4');
&& &&& &&& &&& &&& &&& &lift_key_4=
&& &&& &&& &&& &&& &&& &
&& &&& &&& &&& &case '%':
&& &&& &&& &&& &&& &&&& printf (&AT+CIPSEND=0,33\n&);
&& &&& &&& &&& &&& &&& &for (a=0; a&10000; a++);
&& &&& &&& &&& &&& &&& &printf (&%c\nplease enter your destination:&,'5');
&& &&& &&& &&& &&& &&& &lift_key_5=
&& &&& &&& &&& &&& &&& &
&& &&& &&& &}
&& &&& &&& &ES=0;
//下面附上更为可靠的esp8266初始化函数(使用了do...while...循环,确保esp8266回复了ok)
//这里使用的是定时器2,所以程序与上面的有点不同
void init_esp()
&& & int d =1;
&& & SCON=0x50; //串口工作方式1,8位UART,波特率可变 &
&&&& TH2=0xFF;&&&&&&&&& &
&&&& TL2=0xFD;&&& //波特率:115200 晶振=11.0592MHz
&&&& RCAP2H=0xFF;& &
&&&& RCAP2L=0xFD; //16位自动再装入值
&&&& TCLK=1;& &
&&&& RCLK=1;& &
&&&& C_T2=0;& &
&&&& EXEN2=0; //波特率发生器工作方式
&&& TR2=1 ; //定时器2开始&& &&& &&& &//
&& &TI = 1;
&& &REN=1;&& &&& //使能串口允许接收
&& &SM0=0;&&&&& //工作在串口的工作方式1
&& &SM1=1;
&& &ES=0;&& &&& //串口中断关闭,待初始化后再打开
&& &EA=1;&& &&& //总中断打开
&& &&& &for (a=0; a&50000; a++);&& &//延时几秒,让模块有时间启动
&& &&& &printf (&AT+CWMODE=3\n&); //
&& &&&& do{
&& &&& &&&& if(RI)
&& &&& &&&& {&& &&& &&& &&& &//查询是否有数据接收
&& &&& &&& &&& &&&& ldat=SBUF;&& &&& &//数据暂存于变量中
&& &&& &&& &&& &&&& RI=0;
&& &&& &&& &&& &&&& if (ldat=='K')//命令执行成功,就会返回OK,这里就是查询是否有K返回,若有K返回,就说明执行成功,可以执行下一条,否则继续循环
&& &&& &&& &&& &&& &&&& d=0;
&& &&& &&& & }&& &
&& & && &&&& }while (d); &
&& && &&&& d =1;//b、c、d复位,便于执行下一条命?
&& &&& &for (a=0; a&50000; a++);&& &
&& &&& &printf (&AT+RST\n&);
&& &&&& do{
&& &&& &&&& if(RI)
&& &&& &&&&& {&& &&& &&& &
&& &&& &&& &&& &&&& ldat=SBUF;&& &&& &
&& &&& &&& &&& &&&& RI=0;
&& &&& &&& &&& &&&& if (ldat=='K')
&& &&& &&& &&& &&& &&&& d=0;
&& &&& &&& & }
& & && &&&& }while (d); &
&& &&&& d =1;
&& &&& &for (a=0; a&80000; a++);&& &
&& &&& &printf (&AT+CIPMUX=1\n&);
& &&&& do{
& &&& &&&& if(RI)
& &&& &&& && {&& &&& &&& &
& &&& &&& &&& &&&& ldat=SBUF;&& &&& &
&& &&& &&& &&& &&&& RI=0;
&& &&& &&& &&& &&&& if (ldat=='K')
&& &&& &&& &&& &&& &&&& d=0;
&& &&& &&& && }
&& & && &&&& }while (d);
&& &&&& d =1;
&& &&& &for (a=0; a&10000; a++);
&& &&& &printf (&AT+CIPSERVER=1\n&); && &
&& & &&& do{
&& &&& &&&& if(RI)
&& &&& &&&& {&& &&& &&& &
&& &&& &&& &&&& ldat=SBUF;&& &&& &
&& &&& &&& &&&& RI=0;
&& &&& &&& &&&& if (ldat=='K')
&& &&& &&& &&& &&&& d=0;
&& &&& &&&& }
&& &&&&&& }while (d);
&& &&&& d =1;
&& &&& &for (a=0; a&10000; a++);
&& &&& &printf (&AT+CIPSTO=50\n&); && &&& & //服务器超时时间
&& &&& && do{
&& &&& &&& && if(RI)
&& &&& &&& &&&& {&& &&& &&& &&& &
&& &&& &&& &&& &&&& ldat=SBUF;&& &&& &
& &&& &&& &&& &&&& RI=0;
&& &&& &&& &&& &&& &&&& if (ldat=='K')
&& &&& &&& &&& &&& &&& &&&& d=0;
&& &&& &&& &&&& }
& &&& && }while (d);
&& &&&& d =1;
&& &&& &for (a=0; a&10000; a++);
&& &&& &ES=1;&& //串行口中断打开
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10472次
排名:千里之外
原创:15篇
评论:11条
(6)(1)(4)(4)51单片机如何通过GPRS模块与手机通信
[问题点数:40分]
51单片机如何通过GPRS模块与手机通信
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。5352人阅读
在我入门ESP8266小黄板的过程中,过程是艰难的,因为网络上的资料太多太乱,官网上的资料不算太完备,而在技术交流群里面的就更乱了,所以想按自己学习所总结到的经验来分享给大家。
资源链接:
请使用本教程之前先下载以上资源。
前言:esp8266我用到的是小黄板测试板,而ESP8266主要有两种固件,一种是AT固件,一种是IOT固件。
前者用串口调试助手,一步步输入AT指令操作模块,详情请查看资源链接下面的\esp8266\esp8266编程相关手册\4A-Espressif
AT指令集018.pdf和4B-Espressif AT指令使用示例_v0.2.pdf,具体用法也可以参考我的另一篇文章:。用法非常简单。
后者是IOT模式是物联网全自动操作的,在这里是关于IOT方式的详细使用方法。
一、ESP8266固件编程与烧写
烧固件即可理解成是烧写系统,或者是烧写驱动。想玩ESP8266就要先往里面烧写固件。就像学习其他一般WiFi模块,我们要先了解几个问题:
a、固件从哪里来?
第一种是从官网获取各个不同版本的固件;
第二种是从互联网上获得别人已经写好并编译好的固件,一般是从官网上修改所得;
第三种是自己编写的固件。
b、怎样烧固件?
第一种如果烧写已有固件,则可用普通烧写工具刷入该bin文件;
第二种是自己编写好的固件源代码,要用编译工具先将源代码编译出.bin文件,才可以进行烧写。
c、怎样编写自己的固件?
先在官网上下载基础的iot_sdk包,再用编程工具,如Eclipse,编写好之后,进行编译,再烧写,这些步骤在下文都会一一详述。
1、打开编程工具
进入\esp8266
\1.在eclipse编写固件源代码\1.编程工具\AITHINKER-ESP8266-SDK\ESP8266IDE.exe
关于ESP8266IDE.exe的详细使用方法请看下面,与eclipse的用法相同:
\1.编程工具\安信可科技ESP8266模块编译平台说明.pdf
在上面说明文档中导入的步骤中导入esp_iot_sdk工程。
2、打开esp_iot_sdk工程
\1.在eclipse编写固件源代码\2.iot_sdk_examples,下面有四个已有的sdk工程,大同小异,可以根据不同需要导入不同工程,也可到官网下载。
其中,all_fit是小黄板上最实用的一个工程,里面包含已经编译好的IOT固件AI-THINKER-IOT- 165528.bin,可以烧写到板子上,方法查看第4点:烧写已有固件的方法。
同时也包含IOT.apk,安装到安卓手机上,将手机连接上小黄版放出来的WiFi,即可玩app里面的操作。
其他三个工程,用ESP8266IDE.exe修改好代码后编译烧写。
3、SDK代码修改基本方法
将对应的esp_iot_sdk工程导入ESP8266IDE.exe后,进入\app\user\user_main.c,修改以下内容:
在52、53行中修改WiFi账号和密码
在276、280行中修改服务器端地址和端口号
进行上述操作即可让小黄板连上当前WiFi,要对程序作进一步修改,请查看:
\esp8266\esp8266编程相关手册\2C-Espressif IoT SDK 编程手册_v0.9.1.pdf
4、烧写已有固件的方法
若要参考厂家已有固件,可以用烧写工具导入烧写,并与厂家对应的app配合使用。详情参看:
\esp8266\2.烧写已有固件的方法\烧写已有固件说明文档.doc
5、自行编译烧写固件的方法
(1)配置环境:参看下述文档,按照步骤安装并配置好,
esp8266\3.在win下配置固件编译环境并烧写\完全脱离虚拟机进行编译的环境安装包.txt
(2)按照文档将在第3步编写好的工程的三个文件driver、include、user,复制到C:\usr\xtensa\esp_iot_sdk\app里面。
(3)烧写程序先将小黄板的跳帽接上,再插入电脑USB口,运行C:\usr\install里的xtensa
(4)在命令提示符状态下输入:cd app
(5)然后输入make指令对源代码进行编译操作
(6)编译成功后,输入makebin,最终输出Fans_SDK_flash.bin固件。
(7)将模块8266通过USB转TLL串口接到电脑上,确保模块是处理升级烧录状态(跳帽插在多出来的两个脚上),最后在命令提示符下输入burnbin,将固件写到模块中去。
二、手机客户端
资源地址:
1、手机使用已有app连接模块
打开:\2.手机客户端\1.已有app\固件与app组合使用\,如下:
(1)将IOT.apk安装到手机上,将IOT.bin烧到板子上。
(2)手机连接模块释放出来的热点,名称为:AI-THINKER-XXXXX ,然后打开app,就会自动连上模块。
(3)选择菜单“控制设备”,选择“LED调光”或者“开关”,就可以控制板上的灯的状态了。
2、使用手机调试助手连接模块
(1)将\2.手机客户端\2.手机调试助手\手机TCP&UDP调试助手.apk安装到手机上。这个其实是一个实现手机和其他设备UDP或者TCP连接的工具软件。连接时需要知道对方服务的IP地址和端口号。
(2)用“USR-TCP232-Test.exe”与其配合使用,查看收发情况。
(3)“esp_iot_sdk”是一个实现模块与手机实现TCP连接的一个简单例子。改编请参考网站:
在网站中,有很多其他各种用法的参考代码:
到此,我们实现了在局域网内的手机与模块之间的连接与通讯,还有手机与模块通过服务器连接进行通讯,大家有兴趣的可以尝试,这里就不多说了。
这里没有具体操作到极致的细微,差不多是一个操作指导书,每一步的里面都会延伸到相应的文档,希望能够帮助大家。
如有疑问,加扣扣:~
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10474次
排名:千里之外
原创:15篇
评论:11条
(6)(1)(4)(4)

我要回帖

更多关于 esp8266 单片机编程 的文章

 

随机推荐