请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】WiFi模块(ESP8266)—基于STM32

[复制链接]
STMCU小助手 发布时间:2022-5-14 21:00
前言
今天这一讲注意涉及到WiFi模块ESP8266的使用,主要是用WiFi来控制LED0亮灭,包括会详细介绍一下该模块的使用,废话不多说,正题进入···

一、ESP8266介绍
互联网+时代,无线传输、无线通信尤为重要,那么在WiFi通信方面就数ESP8266用的最为广泛了,因为ESP8266是一个具备高性能的模块,在不了解其原理的情况下,只要有一定的串口知识理解,那么就可以轻松上手该模块,进而实现手机WiFi操作。简单来说,就是利用编程来实现WiFi模块的透明传输。

Y30PA0V8QXT2T@T)TU4}`QK.png

这里我们看到该模块有8个接口,但是实际上我们只需要用到五个接口就可以操作这个WiFi模块了,主要是3.3V、GND、RXD、TXD、EN这五个接口可以看上图,RXD接单片机上的TXD接口(这里我用的是串口3,所以接PB10),TXD接单片机上的RXD接口(即PB11),EN接3.3V即可。

那么他有哪些指令呢?

这里你会发现它有三种模式即STA、AP、混合,那么我们该如何使用呢,这里简单说明一下

STA模式就是类似一个接收模式,就是开启该模式后,你只能通过串口给他发送信息,ESP8266只负责接收,而不会产生一个热点,(手机或其他设备是找不到热点的)然后这模式我一般会直接用来调试各种AT指令,通过串口调试助手进行数据传输

AP模式就简单了,就是它发出去一个热点,供手机或其他设备连接,如果要实现手机连热点来控制单片机,那么该模式就要开启了。

混合模式就是两者同时实现。

接下来关于传输的方式,一般都是采用透传比较好,如果不采用透传模式,那么每发送一次数据都要发送一次AT+CIPSEND=<param>的指令就显得尤为麻烦,因此模式一般设置为透传模式,退出透传模式就给指令“+++”即可,后面代码里也有具体涉及到透传模式的退出操作,后面代码再一一介绍。

二、如何实现WiFi传输?代码详解附上
串口3初始化函数:
  1. #include "delay.h"
  2. #include "usart3.h"
  3. #include "stdarg.h"                  
  4. #include "stdio.h"                  
  5. #include "string.h"         
  6. #include "timer.h"

  7.         u8 res;        
  8. //串口接收发送缓存区               
  9. u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];                        
  10. u8  USART3_TX_BUF[USART3_MAX_SEND_LEN];                 



  11. vu16 USART3_RX_STA=0;           

  12. //串口3中断
  13. void USART3_IRQHandler(void)
  14. {

  15.         if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
  16.         {         
  17.                 res =USART_ReceiveData(USART3);                 
  18.                 if((USART3_RX_STA&(1<<15))==0)
  19.                 {
  20.                         if(USART3_RX_STA<USART3_MAX_RECV_LEN)        
  21.                         {
  22.                                 TIM_SetCounter(TIM7,0);                                         
  23.                                 if(USART3_RX_STA==0)                                 
  24.                                 {
  25.                                         TIM_Cmd(TIM7,ENABLE);
  26.                                 }
  27.                                 USART3_RX_BUF[USART3_RX_STA++]=res;        
  28.                         }else
  29.                         {
  30.                                 USART3_RX_STA|=1<<15;                        
  31.                         }
  32.                 }
  33.         }                                                                                                                           
  34. }   

  35. //串口3初始化
  36. void usart3_init(u32 bound)
  37. {  

  38.         NVIC_InitTypeDef NVIC_InitStructure;
  39.         GPIO_InitTypeDef GPIO_InitStructure;
  40.         USART_InitTypeDef USART_InitStructure;

  41.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        
  42.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

  43.          USART_DeInit(USART3);
  44.                  //USART3_TX   PB10
  45.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  46.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  48.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  49.     //USART3_RX          PB11
  50.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  51.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  52.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  53.         
  54.         USART_InitStructure.USART_BaudRate = bound;
  55.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  56.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  57.         USART_InitStructure.USART_Parity = USART_Parity_No;
  58.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  59.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        

  60.         USART_Init(USART3, &USART_InitStructure);


  61.         USART_Cmd(USART3, ENABLE);              
  62.         

  63.   USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  64.         

  65.         NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  66.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
  67.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;               
  68.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        
  69.         NVIC_Init(&NVIC_InitStructure);        
  70.         
  71.         
  72.         TIM7_Int_Init(1000-1,7200-1);               
  73.         USART3_RX_STA=0;               
  74.         TIM_Cmd(TIM7,DISABLE);                        

  75. }
  76. //串口3printf函数,保证输入不大于设定长度
  77. void u3_printf(char* fmt,...)  
  78. {  
  79.         u16 i,j;
  80.         va_list ap;
  81.         va_start(ap,fmt);
  82.         vsprintf((char*)USART3_TX_BUF,fmt,ap);
  83.         va_end(ap);
  84.         i=strlen((const char*)USART3_TX_BUF);               
  85.         for(j=0;j<i;j++)                                                
  86.         {
  87.           while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
  88.                 USART_SendData(USART3,USART3_TX_BUF[j]);
  89.         }
  90. }
复制代码

ESP8266初始化函数:

  1. #include "esp8266.h"
  2. #include "string.h"
  3. #include "usart.h"
  4. #include "usart3.h"
  5. #include "stm32f10x.h"
  6. #include "sys.h"
  7. #include "delay.h"
  8. #include "lcd.h"

  9. //ESP8266初始化
  10. void esp8266_start_trans(void)
  11. {
  12.         
  13.         esp8266_send_cmd("AT+CWMODE=2","OK",50);//设置为AP模式

  14.         esp8266_send_cmd("AT+RST","ready",20);//重启
  15.         
  16.         delay_ms(1000);      
  17.         delay_ms(1000);
  18.         delay_ms(1000);
  19.         delay_ms(1000);
  20.         
  21.         esp8266_send_cmd("AT+CWSAP="ESP8266","12345678",1,4","OK",200);//设置WiFi名称、密码,模式
  22.         esp8266_send_cmd("AT+CIPMUX=1","OK",20);//进入透传模式
  23.         esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);//设置端口8080
  24.         esp8266_send_cmd("AT+CIPSEND","OK",50);//开始发送数据
  25. }

  26. //退出透传模式
  27. u8 esp8266_quit_trans(void)
  28. {
  29.         u8 result=1;
  30.         u3_printf("+++");
  31.         delay_ms(1000);                                       
  32.         result=esp8266_send_cmd("AT","OK",20);
  33.         if(result)
  34.                 printf("quit_trans failed!");
  35.         else
  36.                 printf("quit_trans success!");
  37.         return result;
  38. }

  39. //发送指令,返回0发送成功,1则失败
  40. u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
  41. {
  42.         u8 res=0;
  43.         USART3_RX_STA=0;
  44.         u3_printf("%s\r\n",cmd);        
  45.         if(ack&&waittime)               
  46.         {
  47.                 while(--waittime)        
  48.                 {
  49.                         delay_ms(10);
  50.                         if(USART3_RX_STA&0X8000)
  51.                         {
  52.                                 if(esp8266_check_cmd(ack))
  53.                                 {
  54.                                         printf("ack:%s\r\n",(u8*)ack);
  55.                                 
  56.                                         break;
  57.                                 }
  58.                                         USART3_RX_STA=0;
  59.                         }
  60.                 }
  61.                 if(waittime==0)res=1;
  62.         }
  63.         return res;
  64. }


  65. //检测是否应答指令
  66. u8* esp8266_check_cmd(u8 *str)
  67. {
  68.         char *strx=0;
  69.         if(USART3_RX_STA&0X8000)               
  70.         {
  71.                 USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
  72.                 strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
  73.         }
  74.         return (u8*)strx;
  75. }


  76. //向ESP8266发送指令(数据)的函数,暂时用不到,可以自己斟酌加上
  77. //u8* esp8266_send_data(u8 *cmd,u16 waittime)
  78. //{

  79. //        char temp[5];
  80. //        char *ack=temp;
  81. //        USART3_RX_STA=0;
  82. //        u3_printf("%s",cmd);        
  83. //                LCD_ShowString(30,130,200,16,16,cmd);        
  84. //        if(waittime)               
  85. //        {
  86. //                while(--waittime)        
  87. //                {
  88. //                        delay_ms(10);
  89. //                        if(USART3_RX_STA&0X8000)
  90. //                        {
  91. //                                USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;
  92. //                                ack=(char*)USART3_RX_BUF;
  93. //                                printf("ack:%s\r\n",(u8*)ack);
  94. //                        LCD_ShowString(30,190,200,16,16,(u8*)ack);        
  95. //                                USART3_RX_STA=0;
  96. //                                break;
  97. //                        }
  98. //                }
  99. //        }
  100. //        return (u8*)ack;
  101. //}
复制代码

主函数:

  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "usart3.h"
  5. #include "esp8266.h"
  6. #include "string.h"
  7. #include "timer.h"
  8. #include "led.h"


  9. int main(void)
  10. {        
  11.         char a[15];         
  12.         delay_init();                                               
  13.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                        
  14.         uart_init(115200);                                 
  15.         usart3_init(115200);         
  16.         LED_Init();  
  17.         esp8266_start_trans();                //ESP8266初始化                        

  18.          while(1)
  19.         {
  20.         if(USART3_RX_STA&0x8000)
  21.                 {
  22.                     sprintf(a,"%s",USART3_RX_BUF);

  23.                         if(strstr((const char*)a,"on")) //输入on,LED0亮
  24.                                 LED0=0;
  25.                         if(strstr((const char*)a,"off")) //输入off,LED0灭
  26.                                 LED0=1;        
  27.         
  28.                         USART3_RX_STA=0;
  29.                         
  30.                         
  31.         }
  32. }
  33. }
复制代码

三、结果实现流程与展示
下面如何用手机实现控制呢?

1、首先在手机端下载一个TCP,在各大浏览器搜索就有了

20210816224343488.png

2、打开WiFi,搜索你设置的热点并连接

4DHD_BSDN}JU{67GQ%[TN.png

3、查看该WiFi的地址

2021081622454918.png

这里可能会有一定的误差错误,可能会是192.168.4.1,好像要正确的我是去串口调试助手查了一下,跟这里又不太一样,具体原因我也不太了解,如果手机上显示的IP地址不对,那就只能利用调试助手进行一下AT指令查询,这样比较准确,就把串口更改一下就行了(记得代码串口也要更改,自己尝试上手比较有收获)。

4、打开TCP,输入地址和端口,连接上热点,然后就可以进行各种命令了

结果:

输入on

DQH31)Z_BJ8L5CHHMN9{`_4.png

输入off

]]BQH2M~G2_}5M[}20})IKW.png

四、总结
哈哈,学到这里就会发现你已经轻松掌握了如何使用ESP8266WiFi串口模块了,那么接下来就是对所学知识的巩固与实践操作,再然后就是利用该模块进阶完成各种设计


收藏 评论0 发布时间:2022-5-14 21:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版