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

【经验分享】STM32智能家居 ESP8266连接WIFI

[复制链接]
STMCU小助手 发布时间:2022-5-20 17:53
前言
今天是学习百问网智能家居项目的第4天,本文我们将会介绍如何使用ESP8266进行连接WIFI

一、ESP8266和WIFI的连接
STM32通过串口和ESP8266进行通信,发送指定的AT指令即可实现联网。ESP8266可以单独进行联网也可以通过上面方式进行联网。
注意:ESP8266只能连接2.4GHZ的WIFI,很多人可能因为连接到的是5GHZ的WIFI导致ESP8266无法和WIFI进行连接。

二、代码展示
main.c

  1.   USART3_StartRx();//开启串口3接收函数
  2.   esp8266_Init();
复制代码

串口代码

  1. static uint8_t rx_len;
  2. static uint8_t rx_data;
  3. static uint8_t usart_rx_buf[200];

  4. // 串口3启动接收
  5. void USART3_StartRx(void)
  6. {
  7.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);
  8. }

  9. // 串口3中断回调函数(保存每次接收的数据,并启动下一次接收)
  10. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  11. {
  12.         usart_rx_buf[rx_len%200] = rx_data;
  13.         rx_len++;
  14.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);
  15. }

  16. // 串口3接收的数据
  17. uint16_t USART3_Receive(uint8_t *pdata)
  18. {
  19.         memcpy(pdata, (uint8_t*)usart_rx_buf, rx_len);
  20.         return rx_len;
  21. }

  22. // 串口3发送数据
  23. void USART3_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)
  24. {
  25.         HAL_UART_Transmit(&huart3, pData, Size, Timeout);
  26. }

  27. // 清理串口3接收的数据
  28. void USART3_ClearBuf(void)
  29. {
  30.         rx_len = 0;
  31.         memset((uint8_t*)usart_rx_buf, 0, 200);//将数据都清除为0
  32. }
复制代码

ESP8266.c

  1. #include "esp8266.h"
  2. #include "log.h"
  3. #include <string.h>



  4. u8 esp8266_sendcmd(char *cmd,char *reply,u16 timeout)
  5. {
  6.   //保存传入的指令
  7.   u8 buf[256]={0};
  8.   strcat(buf,cmd);//将AT指令拼接到buf

  9.   //处理AT指令
  10.   if(0==strstr(buf,"\r\n"))//判断是否有换行符
  11.   {
  12.     strcat(buf,"\r\n");//加上换行符
  13.   }

  14.   //清理前面接收的buf
  15.   USART3_ClearBuf();

  16.   //发送数据
  17.   USART3_Transmit((u8*)buf,sizeof(buf),500);

  18.   //接收数据
  19.   memset(buf,0,256);
  20.   while(timeout!=0)
  21.   {
  22.     if(USART3_Receive((u8*)buf))
  23.     {
  24.       if(strstr(buf,reply))
  25.       {
  26.         PRINTF("%s Send ok!\r\n", cmd); // 发送成功
  27.         if (strstr(buf, "CIFSR"))
  28.         {
  29.                   PRINTF("%s\r\n", buf); // 打印IP地址
  30.         }
  31.         return 0;
  32.       }
  33.     }
  34.     else
  35.     {
  36.       timeout--;
  37.       HAL_Delay(1);
  38.     }

  39.   }


  40.   PRINTF("%s send error\r\n",cmd);
  41.   return 1;
  42. }


  43. void esp8266_Init(void)
  44. {
  45.   esp8266_sendcmd("AT+RST", "OK", 500);//重启模块
  46.   HAL_Delay(1000);
  47.   esp8266_sendcmd("AT+CWMODE=1", "OK", 500);//模式设置
  48.   esp8266_sendcmd("AT+CWJAP="MERCURY_2446","740740740"", "OK", 5000);//连接路由
  49.   esp8266_sendcmd("AT+CIPMUX=1", "OK", 500);//设置多连接
  50.   esp8266_sendcmd("AT+CIPSERVER=1,9999", "OK", 500);//创建TCP服务
  51.   esp8266_sendcmd("AT+CIFSR", "OK", 500);//查询IP地址
  52. }

  53. void esp8266_Task(void)
  54. {

  55. }

  56. void esp8266_Handle(void)
  57. {

  58. }
复制代码

ESP8266.h

  1. #ifndef _ESP8266_H_
  2. #define _ESP8266_H_

  3. #include "main.h"

  4. #define u8 unsigned char
  5. #define u16 unsigned short
  6. #define u32 unsigned int

  7. #define WIFI_NAME   "Dongsan201"
  8. #define WIFI_PASSWORD   "66666666"

  9. u8 esp8266_sendcmd(char *cmd,char *reply,u16 time);//向esp8266发送AT指令

  10. void esp8266_Init(void);//初始化调用
  11. void esp8266_Task(void);//后台轮询调用
  12. void esp8266_Handle(void);//中断调用




  13. #endif
复制代码

main.c

  1. esp8266_Init();
复制代码

总结
感谢百问网让我了解到了如何使用ESP8266进行联网。


收藏 评论0 发布时间:2022-5-20 17:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版