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

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

[复制链接]
STMCU小助手 发布时间:2022-5-20 17:53
前言
; U8 H- u# M" `* q1 p今天是学习百问网智能家居项目的第4天,本文我们将会介绍如何使用ESP8266进行连接WIFI
# Q' G9 N% h% n5 I8 F" L$ ~  W3 P
一、ESP8266和WIFI的连接3 s' F- B! x' h( ^) B
STM32通过串口和ESP8266进行通信,发送指定的AT指令即可实现联网。ESP8266可以单独进行联网也可以通过上面方式进行联网。
- E, ]( n% y- M* |  s( f5 C, y7 j注意:ESP8266只能连接2.4GHZ的WIFI,很多人可能因为连接到的是5GHZ的WIFI导致ESP8266无法和WIFI进行连接。
: \* ]/ P- A  D3 S5 T. c& |# W9 i' N" F: {; y
二、代码展示/ N  k5 Q; S& j% k# P, ~$ t7 y+ ?
main.c
8 b# G4 w& x9 [+ J; C9 l4 o- o
; q" n5 _& z. y( D  B3 U) d
  1.   USART3_StartRx();//开启串口3接收函数
    3 d: k1 d$ p/ M
  2.   esp8266_Init();
复制代码
& I' W( r( K6 p3 |+ `/ z. T
串口代码
6 z. [) A4 ]+ N/ g& f: a% b% G4 r) {7 H
  1. static uint8_t rx_len;
    * o0 X; n2 g/ l  Q
  2. static uint8_t rx_data;
    4 S- j- \9 y  Q8 E
  3. static uint8_t usart_rx_buf[200];
    9 g8 C7 c& L- Y! o
  4. / S2 d9 @$ `5 x; ^7 E; W
  5. // 串口3启动接收3 Y8 x& s. l; M% o; K7 \( S' ?
  6. void USART3_StartRx(void), ?& }& l1 L+ u5 N. b
  7. {
    : ?1 f, @! H$ S# x0 ~4 R. A) T
  8.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);* x/ f+ ^' J* r. m2 l
  9. }# u$ ?% g5 E( G: b0 N

  10. " ]. I( r. [3 K/ c, D- S: q
  11. // 串口3中断回调函数(保存每次接收的数据,并启动下一次接收): y: Y4 i' B5 ]! l' `  s
  12. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    ; `0 D& R  v( I: `+ ?
  13. {
    % S. q$ ]4 n: _4 J7 V) p. n9 L" X8 [
  14.         usart_rx_buf[rx_len%200] = rx_data;
    : K! z9 D- u5 W9 S  V+ J
  15.         rx_len++;
    , Z; r) [* @- }5 x; e3 @
  16.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);
    & ?4 g: F- q5 p! D( a# L5 w7 \' W
  17. }
    $ {; l* v; I3 i! Q6 t- s
  18. 5 W/ C& V% I7 E  }: T9 ~
  19. // 串口3接收的数据
    8 o; u8 V3 a4 T7 h7 k
  20. uint16_t USART3_Receive(uint8_t *pdata)
    9 s- X: i) p% |  K& J8 F
  21. {3 h, z; e1 [5 L8 x5 s5 F& L
  22.         memcpy(pdata, (uint8_t*)usart_rx_buf, rx_len);# k2 R( M0 e# O, T: n- ~' ^5 M; v
  23.         return rx_len;/ \/ H* \9 P0 ~. @2 F
  24. }, p: ~9 J2 c" B4 d6 D

  25. & f3 l' W5 q* }: ^8 b, [
  26. // 串口3发送数据5 V$ U% B- U' ?! A
  27. void USART3_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)4 A$ N8 z) ?4 V5 J5 v3 Z6 ~3 H
  28. {: S6 i( I+ R( N
  29.         HAL_UART_Transmit(&huart3, pData, Size, Timeout);2 S0 C+ Z: ~2 L7 f
  30. }
    1 w- j% N( U$ q. B( w8 E
  31. " L  I0 @' O$ D" ]+ @( G0 T' b4 h
  32. // 清理串口3接收的数据
    & p- \9 p( _8 \, c6 k1 q
  33. void USART3_ClearBuf(void)
    + M' |: @& ~# [) s
  34. {
    ; \) W: l0 M6 f, Y" ^
  35.         rx_len = 0;
    + m: [; m# @' v1 _+ q$ x
  36.         memset((uint8_t*)usart_rx_buf, 0, 200);//将数据都清除为0) z$ m7 d# K) i- i* w. I
  37. }
    , G4 e/ L& q7 d* I( p
复制代码

, q" h# @/ T6 G! F2 h9 |3 d' }ESP8266.c
5 D1 ]$ r; Q: V; u* Z$ J) H
- U- u% P1 r( G4 p( h1 Z* b- ]
  1. #include "esp8266.h"
    6 B" v+ ]% h9 ?* l
  2. #include "log.h"# X$ ]( }( H/ Q0 d* _' N* W# h9 j& F6 J2 F
  3. #include <string.h>8 G% {* Q1 R  `3 Z# y( A9 z

  4. 3 i- b, r2 ~) J$ _8 Y- P

  5. 8 W9 K" `6 M" {7 X
  6. 6 y: J" O4 B1 x, u$ }$ T% A
  7. u8 esp8266_sendcmd(char *cmd,char *reply,u16 timeout)
    - B, {4 b& h9 [$ K$ r; W
  8. {/ p4 X+ G4 T6 a  @: @) d
  9.   //保存传入的指令6 O9 ]7 k2 b) N( h4 [9 |1 r
  10.   u8 buf[256]={0};
    7 N5 n  h# l7 H+ s. O6 S
  11.   strcat(buf,cmd);//将AT指令拼接到buf: h  k0 k, t; Q2 P0 d8 F

  12. 4 O$ @; o& h5 n2 m) V# `
  13.   //处理AT指令
    5 l- a! u# h# E, O; A/ _& l: m
  14.   if(0==strstr(buf,"\r\n"))//判断是否有换行符& G  @2 Y. u. i6 k
  15.   {  V. ~& U) z- R( J
  16.     strcat(buf,"\r\n");//加上换行符
    8 q+ B2 {8 e, n0 I; u5 ?+ P
  17.   }
    ( h4 A7 K- \( @4 n  U
  18. 9 d+ k! T+ @1 I, e/ ]* g- I
  19.   //清理前面接收的buf( v+ n# a3 p1 k& O0 |
  20.   USART3_ClearBuf();( R- N. S$ D" ~: G& p

  21. 8 D. u; g$ O! ]; P! g5 C8 y
  22.   //发送数据* J  M8 |" A& R& e" B# [0 U
  23.   USART3_Transmit((u8*)buf,sizeof(buf),500);
    ! ?' [: G2 G% P+ Z' N! _6 c

  24.   z4 M0 a; K. @8 b7 x
  25.   //接收数据3 }1 P9 {& x: m/ o1 v
  26.   memset(buf,0,256);
    0 R+ m+ c. J; k" N9 `
  27.   while(timeout!=0)
    & J1 O# l+ N* P3 j- l
  28.   {0 }4 E+ f1 w1 k' y/ v0 h
  29.     if(USART3_Receive((u8*)buf))
    : a1 o9 L4 q: Q2 V; X
  30.     {9 H9 o  k9 o% V" O! `" g0 R; I
  31.       if(strstr(buf,reply))
    3 a/ x- M3 E& }8 |& D2 H; U
  32.       {
    ! |9 g8 y! k; B
  33.         PRINTF("%s Send ok!\r\n", cmd); // 发送成功
    ! ^' \- {4 {: ~/ Y/ O
  34.         if (strstr(buf, "CIFSR"))8 f2 Z7 }' `+ c( f4 r  }  i! J
  35.         {
    # l6 A3 l* }% t! e8 N
  36.                   PRINTF("%s\r\n", buf); // 打印IP地址' N1 p0 e1 d  a, L, D
  37.         }
      Y1 v2 A3 R  Q2 G/ o
  38.         return 0;9 I$ t. K1 Z2 y% ]
  39.       }5 I2 `# F6 s# C3 |
  40.     }
    4 s+ @3 ?+ B0 V- @! M
  41.     else
    7 `6 E  M4 f. F% m9 i
  42.     {
    + }: x/ m6 {7 c4 v0 {7 o! f
  43.       timeout--;
    % E/ x/ @- {1 Q* k# \
  44.       HAL_Delay(1);
    % O1 k/ h, b+ R  O! a2 {
  45.     }
    : J7 y4 w/ [5 Y- Q' n
  46. ! I: M* r/ g; R4 X
  47.   }; l: ?- F3 S  x( ^) y4 e1 c

  48. : y: O6 Y7 H$ m' t/ k6 w  x) q; R7 J3 _- s

  49.   T2 E: A( M' V  ?; d, |
  50.   PRINTF("%s send error\r\n",cmd);( j7 x0 u3 V# _9 P
  51.   return 1;+ t8 N3 D3 ~# Y1 M  s' b3 i0 r3 n
  52. }
    # d$ R6 u+ Q3 ]" z) ?! O; V5 h

  53. - f0 F8 K2 ^- H2 P! T! Q6 J( F
  54. - P: }8 a% ^9 y6 z' _$ p
  55. void esp8266_Init(void): `) X9 `. c' \" K) Y$ t
  56. {2 r5 n3 r( ^3 j/ a/ E: O
  57.   esp8266_sendcmd("AT+RST", "OK", 500);//重启模块
    8 U, L1 S/ ?  \
  58.   HAL_Delay(1000);- l+ N) C7 d2 Y/ r. H* }
  59.   esp8266_sendcmd("AT+CWMODE=1", "OK", 500);//模式设置
    1 o$ C, \& }$ N/ Z( i: V% t& T
  60.   esp8266_sendcmd("AT+CWJAP="MERCURY_2446","740740740"", "OK", 5000);//连接路由  r- |& ^" K( u4 x0 o' u* z
  61.   esp8266_sendcmd("AT+CIPMUX=1", "OK", 500);//设置多连接
    8 T* h* ?# {( D8 |- }0 [
  62.   esp8266_sendcmd("AT+CIPSERVER=1,9999", "OK", 500);//创建TCP服务. `; ?! g/ [+ d# o6 L4 O
  63.   esp8266_sendcmd("AT+CIFSR", "OK", 500);//查询IP地址
    6 J4 V+ J) V1 f% u. @( n/ ^* r8 h
  64. }
    & O6 w2 D7 E, H7 S9 ~3 Q
  65. % X( d& d, ~! k& i- M4 W6 a( O
  66. void esp8266_Task(void)
    ; Q# v4 G- T; T: h9 w
  67. {
    - m% r2 ?! W: @3 K2 ~3 U# P) `
  68. - L$ i" ^8 R2 v( x. i) x
  69. }4 ?& ~: \) {2 }. }. K
  70. - }5 R: s/ z4 o; H/ z0 a
  71. void esp8266_Handle(void)  W% ?( C( Q0 z
  72. {5 ^5 A( c9 h& c5 k! E7 U6 @& _

  73. 8 y+ x3 \2 y& F& Q
  74. }
复制代码
; ^$ Q1 I7 }7 |: ]0 [" M+ c
ESP8266.h
2 W% D# h5 J- Z3 d* I& {
. F% t! u# y6 [; z3 z. |# Y
  1. #ifndef _ESP8266_H_
    : G# H1 U* o/ p! S' e
  2. #define _ESP8266_H_3 n4 X( _# |" L0 ]( N8 m0 Y* ^
  3. * ?  k3 m% u- R: S: Z
  4. #include "main.h"
      c+ [  N* j2 v$ L# j5 C* l$ f- e; _

  5. 0 [1 k! v$ G$ Z& v, |( B/ p
  6. #define u8 unsigned char
    / F  N# s( q, R- q8 P8 D; q$ O
  7. #define u16 unsigned short
    + k* x) w. [& H
  8. #define u32 unsigned int
    ' a( V/ S. L7 A- \

  9. 3 F" `: R* @" O! W1 B
  10. #define WIFI_NAME   "Dongsan201"/ T( T" Q# U3 [# J
  11. #define WIFI_PASSWORD   "66666666"
    ; o2 `6 g. z& f) h0 x  o

  12. ( D6 T8 S; d9 i) T0 I
  13. u8 esp8266_sendcmd(char *cmd,char *reply,u16 time);//向esp8266发送AT指令
    6 b* i, v, h) R6 c, l
  14. & u" i, c6 H) G) F+ c: K% S
  15. void esp8266_Init(void);//初始化调用
    6 F7 }# F/ A: e2 R
  16. void esp8266_Task(void);//后台轮询调用- V' Q2 w, g$ _4 k9 O7 c
  17. void esp8266_Handle(void);//中断调用
    # B" v' q$ L% c/ a; F
  18. * ]" b6 T, V5 Z

  19. $ C+ g3 p9 s6 c2 R6 i
  20. 8 |6 {7 B7 d+ H1 P; k; Y6 b
  21. $ Y" Q/ z% n  [& K
  22. #endif
    7 c" `5 B" ~) ~) H- {; h' d7 i+ Z
复制代码

8 n* b% {! Z# Amain.c
4 h0 N7 ]2 z6 n3 W  u* ?% ~4 I. ]; U7 E' P+ Q1 y1 g2 s$ F. N4 _
  1. esp8266_Init();
复制代码
9 G! o/ W8 q# k' V% B
总结3 B+ s0 N; p9 w1 p* X8 S( ^' S2 p
感谢百问网让我了解到了如何使用ESP8266进行联网。
- `$ z: N. [, K3 U( P8 }. [; h4 V0 @4 ?
) l; T; v* E* S( k
赞 收藏 评论0 发布时间:2022-5-20 17:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版