单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 245|回复: 11
打印 上一主题 下一主题
收起左侧

单片机ESP8266无线传输DHT11温湿度(APP+E4A调试说明与程序设计)

[复制链接]
跳转到指定楼层
楼主
1.烧录固件到ESP8266
2.重启进入运行模式(断开IO 0)
3.用电脑收无线网admin   密码:12345678 (固件初始的)
4.用电脑打开IP网址:10.10.10.208 进入设置
 内网IP改为:10.10.10.208  端口:5000
 外网不用动,其它网络名字admin   密码:12345678 (固件初始的)不用改了
5.安装手机APP,点连接。10.10.10.208  端口:5000 (固件初始的)
6.可以操作了。
7.接收温度和单片串口通讯OK手机和串口助手都能查看到单片机的温度。

制作出来的实物图如下:


APP


ESP8266设置及说明
本设计使用ESP8266WIFI模块实现单片机超声波测量数据向手机无线传输,让手机是显示测量结果。
单片机与ESP8266通信方式采用AT命令方式,首先由单片机对esp8266进行初始化,再将手机连上esp8266的WiFi,然后再通过手机端发送指令,esp8266接收到命令传入单片机,单片机再进行相应的操作。模块的VCC,GND,TXD,RXD与单片机的VCC,GND,RXD,TXD接好,以为51单片机没有进程和线程的概念,所以就在main函数的while(1)中放入我们要的主程序,而用串口中断的方式来接收esp8266发过来的数据信息,从而实现用esp8266控制单片机。
ESP8266模块是3.3V供电! 切记请勿接5V ! 模块想要从FLASH启动进入AT系统,只需CH-PD引脚接VCC或接上拉(不接上拉的情况下,串口可能无数据),其余三个引脚可选择悬空。(GPIO0为高电平代表从FLASH启动,GPIO0为低电平代表进入系统升级状态,此时可以经过串口升级内部固件 RST(GPIO16)可做外部硬件复位使用)。测试系统不同,接线方法也选择多多,请各位根据自己的情况进行选择,推荐接法:只需CH-PD引脚接VCC后,将UTXD,GND,VCC,URXD连上USB-TTL(两者的TXD和RXD交叉接)即可进行测试。
在本设计中,单片机的串口中断的波特率设为9600,记得在将ESP8266模块与单片机硬件连接之前,先用USB-TTL模块连接好ESP8266模块,将ESP8266模块用AT命令改为9600的波特率。
使用的命令:
AT+UART=9600,8,1,0,0

AT+CWSAP="wifi_yuan","123456789",11,4 //设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)
完成上面两步后,就可以将ESP8266模块与单片机系统连接起来。原理图中JP1是ESP8266模块插座。

参考硬件PCB图:


网络配置固件使用说明




Esp8266-01管脚图

Esp8266程序下载说明:1.请将MTDOGPIO0置于低电平,GPIO2置于高电平。
   如果你的模块没有MTDO,请至少将GPIO0置于低电平。
   GPIO0置于低电平是烧写模式,高电平是运行模式。
2.请复位(复位是指RST低电平脉冲)或重新上电进入烧写模式。
3.请不要使用USBTTL引出的电源,请使用独立电源。
4.烧写成功后,请重新上电。模块波特率更改为9600115200.
5.烧写中途失败后,请重新上电烧写。
Esp8266下载模式,降CH_PD接入电源,GPIO0接地重要事情说3遍!!!!!

分别导入下载数据。





点击下载。
8266下载模式重新启动。
下载过程中显示数据。

            


等待下载完成。
网页配置固件配置:将esp8266运行模式运行,esp8266将运行到sta+ap模式,esp8266热点的SSID是:admin 密码:12345678 。连接到esp8266热点后,打开游览器,网址输入 10.10.10.208  将进入如下配置。连接路由器后可以不用连接esp8266的热点可以直接输入IP地址配置,具体介绍请看静态IP地址设置。此功能很方便



1.    esp8266热点名字与密码修改:
如图所示,修改帐号与密码直接修改就可以,在热点中不支持中文不支持符号,密码最少8



2.    esp8266连接路由器修改:如图所示,修改连接路由器的的帐号与密码和是否连接。帐号和密码不支持中文和符号
选择是否连接则会连接到相应的路由器。





3.    通信协议的设置:1.    TCP SERVER 服务器模式设置:
在tcp 服务器模式下IP地址无用静态IP如果要用就选择不用则不选择功能下面则会说明,只需要设置相应的端口号则为服务器的端口号,如果要连接esp8266服务器模式 IP地址输入10.10.10.208 输入其相应的端口号则
进入透传模式。直接用串口发送任何消息服务器都会接收,反之也是一样。
2.    TCP Client 客户端模式:
在TCP 客户端模式中静态IP如果要用就选择不用则不选择功能下面则会说明,在IP地址中输入其要连接服务器的IP地址与端口号则就可以配置。配置完成后esp8266进入透传。直接用串口发送消息客户端就会向服务器发送消息。(TCP 客户端模式必须要连接到路由器才可以开启此功能
3.    UDP: 在UDP中不分客户端模式与服务器模式静态IP如果要用就选择不用则不选择功能下面则会说明,他是以广播形式发送消息。在UDP模式中不管是连接到路由器或者没连接到路由器IP地址则输入的IP是要发送信息目标地址的IP(如果所有的UDP都要接收到IP地址则 255.255.255.255),端口号则是目标的端口号4.静态IP:
静态IP 地址的作用是:连接路由器后固定分配的IP地址,xxx.xxx.xxx.yyy ,xxx是路由器决定(如:192.168.0.yyy),yyy则是你想分配的IP地址,如果要启动静态IP地址必须要勾上。
静态IP地址设置后在局域网内可以不必连接esp8266的热点一样可以配置8266.在连接到路由器后可以直接打开路由器在路由器地址输入设置的静态IP则可以进入配置界面。静态IP是必须在连接路由器后可以使用。


备注:在使用过程中不能使用80端口,目前v1.020160531版本IP地址不支持域名解析,下一个则支持域名解析,在配置完成后要点击保存就可以了,如果要复位则电机复位就可以了。每种配置完成后都是透传,直接发送数据及可。
如果对此固件有其他BUG或者要修改固件功能可以直接联系作者,如果有更好的设置方案也可以和作者讨论。



ESP8266调试总结
ESP8266可以配置成station 、AP、station+AP三种模式,就是说模块可以当成一个设备(client)连接局域网内的路由,也可以设置成是一个路由(sever),也可以既作为局域网里面的client同时又是其它client的sever


1、ESP8266 Client模式(Station):

AT+RST                        //复位模块
AT+CWMODE=1                    //设置为station模式
AT+RST                        //重启生效
AT+CWLAP                    //查看可以连接到的无线路由
AT+CWJAP="yuan","456852123"            //连接上无线路由
AT+CIFSR                    //查询模块的IP地址
AT+CIPMUX=1                    //打开多连接,否则会报错Link typ error
AT+CIPSTART=0,"TCP","192.168.1.111",6060    //连接到TCP Server上 使用网络调试助手创建一个TCP Server
AT+CIPSEND=0,7                    //发送字符长度   
testrun                        //发送7个字符给Server端
                        同时Server端也可以发数据给Client端


单链接方式
AT+RST                        //复位模块
AT+CWMODE=1                    //设置为station模式
AT+RST                        //重启生效
AT+CWLAP                    //查看可以连接到的无线路由
AT+CWJAP="JSZZSJ3","********"            //连接上无线路由
AT+CIFSR                    //查询模块的IP地址
AT+CIPMUX=0                    //打开单连接,否则会报错Link typ error
AT+CIPSTART="TCP","192.168.1.111",6060        //连接到TCP Server上  使用网络调试助手创建一个TCP Server
AT+CIPSEND=7                    //发送字符长度   
testrun                        //发送7个字符给Server端
                        同时Server端也可以发数据给Client端


2、ESP8266 Server模式(Station+AP):
AT+RST                        //复位模块
AT+CWMODE=3                    //设置为AP模式
AT+RST                        //重启生效
AT+CWLAP                    //查看可以连接到的无线路由
AT+CWJAP="JSZZSJ3","********"            //连接上无线路由
AT+CIFSR                    //查询模块的IP地址
AT+CIPMUX=1                    //打开多连接
AT+CIPSERVER=1,6060                //建立Server

使用网络调试助手创建一个TCP Client,设置好要连接到的Server的IP和端口号,即可连接
Client就可以发送数据给Server端了
如果同时想Server发数据给Client只要如下命令
AT+CIPSEND=0,7    //发送字符长度
就可以发送数据了


3、串口透传模式(TCP模式)
AT+RST                        //复位模块
AT+CWMODE=3或者1                 //设置为AP+Station模式或Station模式
AT+CWLAP                    //查看可以连接到的无线路由
AT+CWJAP="yuan","456852123"            //连接上无线路由
AT+CIFSR                    //查询模块的IP地址
AT+CIPSTART="TCP","192.168.1.176",9999        //用手机做服务器,打开网络调试助手,建一个TCP server
AT+CIPMODE=1
AT+CIPSEND

接下来就可以透传了
如果要关闭透传先发送三个“+”,提示CLOSE后,再勾选发送新行


4、串口透传模式(UDP模式)
AT+RST                        //复位模块
AT+CWMODE=3或者1                 //设置为AP+Station模式或Station模式
AT+CWLAP                    //查看可以连接到的无线路由
AT+CWJAP="JSZZSJ3","********"            //连接上无线路由
AT+CIFSR                    //查询模块的IP地址
AT+CIPSTART="UDP","192.168.1.176",9999,5000,0    //用手机做服务器,打开网络调试助手,建一个UDP server
AT+CIPMODE=1
AT+CIPSEND

接下来就可以透传了
如果要关闭透传先发送三个“+”,提示CLOSE后,再勾选发送新行


AT+RESTORE
AT+CIPSTART="UDP","255.255.255.255",5000,5000
AT+CIPMODE=0                    //0  表示单距连接
AT+CIPSEND=5                            //5  是数据长度






给你一个双向传输的示例

A模块和B模块先执行:
AT+CWMODE=3

A模块:
AT+CWLAP//列出附近的AP得到B模块的SSID
AT+CWJAP="B模块的SSID","PWD"
AT+CIPMUX=0
AT+CIPSTART="UDP","255.255.255.255",6060,6060,0
AT+CIPMODE=1
AT+CIPSEND

B模块
AT+CIPMUX=0
AT+CIPSTART="UDP","255.255.255.255",6060,6060,0
AT+CIPMODE=1
AT+CIPSEND

单片机源程序如下:

  1. [code]/********************************************************************/
  2. /*         WIFI无线传输手机显示                                                                        */
  3. /********************************************************************/
  4. #include <reg51.h>
  5. #include<intrins.h>
  6. #include <stdio.h>
  7. #define uint unsigned int
  8. #define uchar unsigned char
  9. #define ulong  unsigned long

  10. /*****************相关变量**************/

  11. uint Receive,i,xm0,xm1,xm2; //温度传送用
  12. long s;

  13. uint xm3,xm4,xm5; //湿度传送用
  14. long s1;




  15. uchar Recive_table[40];                  //用于接收wifi模块反馈到MCU上的数据
  16. uchar code ta[]="0123456789- "; //测试一下
  17. uchar table[]="温度:00.0 C  湿度:00.0 %";//传送用定位模板





  18. void delay (int a)//毫秒级延时
  19. {
  20. int x,y;
  21. for(x=a;x>0;x--)
  22.         for(y=110;y>0;y--);
  23. }
  24. void delayus(int t)//微秒级延时
  25. {
  26. while(t--);
  27. }
  28. /*******************************************************************
  29. 名称:延时函数  作用:毫秒级延时,微妙级延时函数,为数据收发完成作等待.......  
  30. ********************************************************************/
  31. void ms_delay(uint t)
  32. {  
  33.         uint i,j;  
  34.         for(i=t;i>0;i--)   
  35.         for(j=110;j>0;j--);
  36. }   

  37. void us_delay(uchar t)
  38. {  
  39.         while(t--);
  40. }         
  41. /*------------------------------------------------
  42. uS延时函数,含有输入参数 unsigned char t,无返回值
  43. unsigned char 是定义无符号字符变量,其值的范围是
  44. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  45. 长度如下 T=tx2+5 uS
  46. ------------------------------------------------*/
  47. void DelayUs2x(unsigned char t);
  48. /*------------------------------------------------
  49. mS延时函数,含有输入参数 unsigned char t,无返回值
  50. unsigned char 是定义无符号字符变量,其值的范围是
  51. 0~255 这里使用晶振12M,精确延时请使用汇编
  52. ------------------------------------------------*/
  53. void DelayMs(unsigned char t);
  54. /*------------------------------------------------
  55. uS延时函数,含有输入参数 unsigned char t,无返回值
  56. unsigned char 是定义无符号字符变量,其值的范围是
  57. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  58. 长度如下 T=tx2+5 uS
  59. ------------------------------------------------*/
  60. void DelayUs2x(unsigned char t)
  61. {   
  62.          while(--t);
  63. }
  64. /*------------------------------------------------
  65. mS延时函数,含有输入参数 unsigned char t,无返回值
  66. unsigned char 是定义无符号字符变量,其值的范围是
  67. 0~255 这里使用晶振12M,精确延时请使用汇编
  68. ------------------------------------------------*/
  69. void DelayMs(unsigned char t)
  70. {
  71.           while(t--)                 //大致延时1mS
  72.          {
  73.              DelayUs2x(245);
  74.                  DelayUs2x(245);
  75.          }
  76. }



  77. sbit Data=P3^7;   //定义数据线
  78. uchar rec_dat[11];   //用于显示的接收数据数组

  79. uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;


  80. void DHT11_delay_us(uchar n)
  81. {
  82.     while(--n);
  83. }

  84. void DHT11_delay_ms(uint z)
  85. {
  86.    uint i,j;
  87.    for(i=z;i>0;i--)
  88.       for(j=110;j>0;j--);
  89. }
  90. void DHT11_start()
  91. {
  92.    Data=1;
  93.    DHT11_delay_us(2);
  94.    Data=0;
  95.    DHT11_delay_ms(20);   //延时18ms以上
  96.    Data=1;
  97.    DHT11_delay_us(30);
  98. }
  99. uchar DHT11_rec_byte()      //接收一个字节
  100. {
  101.    uchar i,dat=0;
  102.   for(i=0;i<8;i++)    //从高到低依次接收8位数据
  103.    {         
  104.       while(!Data);   ////等待50us低电平过去
  105.       DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0
  106.       dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位
  107.       if(Data==1)    //数据为1时,使dat加1来接收数据1
  108.          dat+=1;
  109.       while(Data);  //等待数据线拉低   
  110.     }  
  111.     return dat;
  112. }  



  113. void Uart_Init()                                //使用定时器1作为波特率发生器(STC89C52、STC89C51、AT89C51等均可)
  114. {  
  115.     TMOD = 0x21;
  116.     SCON = 0x50;                                 //设置串行方式
  117.     TH1 = 0xFD;                                         //波特率9600
  118.     TL1 = TH1;
  119.     PCON = 0x00;
  120.     EA = 1;                                                //总中断打开
  121.     ES = 1;                                                //开串口中断  
  122.     TR1 = 1;                                        //启动定时器1
  123. }

  124. /********************************************************************
  125. 名称:串口发送函数  功能:MCU向无线WIFI模块ESP8266发送数据  
  126. ********************************************************************/
  127. void Send_Uart(uchar value)
  128. {  
  129.         ES=0;                                                  //关闭串口中断  
  130.         TI=0;                                           //清发送完毕中断请求标志位   
  131.         SBUF=value;                                 //发送  
  132.         while(TI==0);                                 //等待发送完毕   
  133.         TI=0;                                           //清发送完毕中断请求标志位   
  134.         ES=1;                                                  //允许串口中断
  135.         TH0=0;
  136.         TL0=0;  
  137. }  

  138. /********************************************************************
  139. 名称:WIFI模块设置函数  作用: 启动模块,以便可以实现无线接入和控制  
  140. ********************************************************************/

  141. void ESP8266_Set(uchar *puf)         // 数组指针*puf指向字符串数组               
  142. {   
  143.         while(*puf!='\0')                    //遇到空格跳出循环  
  144.         {   
  145.                 Send_Uart(*puf);                  //向WIFI模块发送控制指令。   
  146.                 us_delay(5);   
  147.                 puf++;   
  148.         }  
  149.         us_delay(5);  
  150.         Send_Uart('\r');                         //回车  
  151.         us_delay(5);  
  152.         Send_Uart('\n');                           //换行  
  153. }

  154. /********************************************************************
  155. 名称:主函数  作用:程序的执行入口  
  156. ********************************************************************/

  157. void main()
  158. {         
  159.         Uart_Init();                                                                                        //波特率发生器
  160.         ms_delay(10);
  161.         ESP8266_Set("AT+CWMODE=2");                                                         //设置路由器模式1 station,模式2 AP,模式3 station+AP混合模式   
  162.         ms_delay(500);
  163. //        ESP8266_Set("AT+RST");                                                                         //重新启动wifi模块            
  164. //  ms_delay(1000);
  165.         ESP8266_Set("AT+CWSAP=\"wifi_yuan\",\"123456789\",11,4");          //AT+CWSAP="wifi_yuan","123456789",11,4  设置模块SSID:WIFI, PWD:密码 及安全类型加密模式(WPA2-PSK)
  166.         ms_delay(500);
  167.         ESP8266_Set("AT+CIPMUX=1");                                                                //开启多连接模式,允许多个各客户端接入
  168.         ms_delay(500);
  169.         ESP8266_Set("AT+CIPSERVER=1,5000");                                          //启动TCP/IP 实现基于网络//控制         ESP8266_Set("AT+CIPSERVER=1,5000");  
  170.         ms_delay(500);
  171.         ESP8266_Set("AT+CIPSTO=0");                                                         //永远不超时
  172.         ms_delay(500);         
  173.         ES=1;                                                                                           //允许串口中断                 

  174.         while(1)   
  175.         {               
  176.             
  177.                
  178. ///////////////////////////////////////////////////////////////////////////               
  179.     DHT11_start();//读温度               
  180.     if(Data==0)
  181.     {
  182.        while(Data==0);   //等待拉高     
  183.       DHT11_delay_us(40);  //拉高后延时80us
  184.        R_H=DHT11_rec_byte();    //接收湿度高八位  
  185.        R_L=DHT11_rec_byte();    //接收湿度低八位  
  186.         T_H=DHT11_rec_byte();    //接收温度高八位  
  187.      T_L=DHT11_rec_byte();    //接收温度低八位
  188.         revise=DHT11_rec_byte(); //接收校正位

  189.         DHT11_delay_us(25);    //结束

  190.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  191.         {
  192.             RH=R_H;
  193.             RL=R_L;
  194.             TH=T_H;
  195.             TL=T_L;
  196.         }
  197.                 }
  198. /////////////////////////////////////////////////////////////////////////////////               
  199.                                 
  200.                   ms_delay(500);
  201.      //处理温度部分               
  202.                   s=T_H*10;        
  203.                   xm0=(s/100)%10;//存放百位数据
  204.                   xm1=(s/10)%10;  //存放十位数据
  205.                   xm2=s%10;  //存放个位数据
  206.                
  207.                   table[6]=ta[xm0];
  208.                   table[7]=ta[xm1];
  209.                   table[9]=ta[xm2];  
  210.            
  211.      //处理湿度部分               
  212.                   s1=R_H*10;               
  213.                   xm3=(s1/100)%10;//存放百位数据
  214.                   xm4=(s1/10)%10;  //存放十位数据
  215.                   xm5=s1%10;  //存放个位数据
  216.                
  217.                   table[20]=ta[xm3];
  218.                   table[21]=ta[xm4];
  219.                   table[23]=ta[xm5];
  220.                
  221.                                 
  222.                   ESP8266_Set(table);//数据发送出去
  223.             ms_delay(500);
  224.                
  225.         }   
  226. }   

  227. /*********************************************************************  
  228. 名称:串行通讯中断  作用:发送或接收结束后进入该函数,对相应的标志位软件清0,实现模块对数据正常的收发。  
  229. ********************************************************************/

  230. void Uart_Interrupt() interrupt 4         
  231. {   
  232.         static uchar i=0;  
  233.         if(RI==1)  
  234.         {   
  235.                 RI=0;   
  236.                 Receive=SBUF;                                                        //MCU接收wifi模块反馈回来的数据      
  237.                 Recive_table[i]=Receive;   
  238.                 if((Recive_table[i]=='\n'))
  239.                 {                     
  240.                         i=0;
  241.                 }   
  242.                 else i++;                                                                                  //遇到换行 重新装值
  243. ……………………

  244. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
STC89温湿度DHT11+APP+E4A+ESP8266无线OK.zip (4.06 MB, 下载次数: 17)

评分

参与人数 2黑币 +112 收起 理由
WFX777888 + 12 我用的是8266 12F去哪里下载固件啊
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
 楼主| 冰冰洁洁 发表于 2019-1-12 14:37 | 只看该作者
这是同时传输两个变量的程序,含源代码和E4A和手机APP全部都打包调试通过,这个传输有点像GPS一次传个一串,然后再显示自己要的,本来下位机还要做个OLED显示的,下次升级哈
回复

使用道具 举报

板凳
admin 发表于 2019-1-12 17:45 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

地板
51mcu 发表于 2019-1-12 18:11 | 只看该作者
楼主,这个好像不是你的源创,温湿度的程序,却配上了超声波测距的PCB图、原理图,容易误导。。。。。。。文章中细述也有错误。
回复

使用道具 举报

5#
 楼主| 冰冰洁洁 发表于 2019-1-12 19:18 来自手机 | 只看该作者
51mcu 发表于 2019-1-12 18:11
楼主,这个好像不是你的源创,温湿度的程序,却配上了超声波测距的PCB图、原理图,容易误导。。。。。。。 ...

对的,其他程序改的,只是实现功能,PCB什么的这个程序也没有什么实用性,我就没时间去改了,还是请各位自行订证!!!哈哈哈哈,因为我要学的东西还很多,总感觉时间太短了,只有有实用价值的我才会去弄下,因为我想把时间留给明天。。。。。。谢谢指证
回复

使用道具 举报

6#
ssk7793 发表于 2019-1-13 00:57 | 只看该作者
赞,只有天天学习的人才会觉得时间太少。做些自己感兴趣的事情,人生才充满意义。
回复

使用道具 举报

7#
HXXXX 发表于 2019-1-13 15:35 | 只看该作者
这个可以实现温湿度检测数据远程传输到上位机吗
回复

使用道具 举报

8#
HXXXX 发表于 2019-1-13 15:38 | 只看该作者
大佬还有用STM32实现实时远程视频传输的成功项目吗?可以分享一下吗?
回复

使用道具 举报

9#
WFX777888 发表于 2019-1-15 08:03 | 只看该作者
谢谢分享资料
回复

使用道具 举报

10#
jcxyu 发表于 2019-1-15 17:00 | 只看该作者
谢谢分享
回复

使用道具 举报

11#
酌繁 发表于 2019-1-15 19:49 | 只看该作者
谢谢楼主,请问在哪可以学习STM32驱动ESP8266程序?
回复

使用道具 举报

12#
酌繁 发表于 2019-1-15 20:26 | 只看该作者
内容逻辑明了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

快速回复 返回顶部 返回列表