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

STM32外设系列—HC-05(蓝牙)

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:57
一、蓝牙简介
3 y$ ^* _: E- V, |' a; V! V6 M蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4~2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。我们这里介绍的是在嵌入式开发中常用的蓝牙模块——HC-05。
, o9 t- E1 h& h$ f" X+ l

/ h3 q. _/ U+ |% U
微信图片_20231023235738.png

# V8 l  A) p. ~% t/ X+ Y* u! }+ a
HC-05

6 b" m5 c! |* c6 g; f: S# ?

& }3 b* A" g2 |  V# L
二、使用方法
6 m# {8 w  p2 m0 A( t! ~7 _$ v2.1 接线
7 ~5 x" R+ Q1 C1 M
HC-05供电电压为3.6V~6V。通常使用5V供电。其余的RXD接TXD,TXD接RXD,CND接GND即可。! o% i7 q. C+ G% E) f! d: ?# v

! P' c7 [# d: \: A2.2 AT指令
! {9 H9 m% s% T( @0 }& I- IHC-05也可以使用AT指令进行配置。在配置之前,首先需要让模块进入配置模式。博主买的HC-05有一个小按钮。按住小按钮再给蓝牙模块上电,蓝牙模块进入配置模式,此时模块上自带的LED会慢速闪烁。进入配置模式后,就可以用AT指令来配置我们的HC-05了。配置时,用USB转TTL连接HC-05,用串口调试助手发送AT指令进行配置。需要注意的是,HC-05配置模式的波特率固定为38400,如果你给HC-05发送指令,没有收到回复,记得检查一下串口调试助手的波特率是否正确。下面列举一些配置时常用的AT指令
) N6 r8 C- }" ]3 e4 A* T- o. c% r6 l, t" h4 @- [+ A
• AT 检查HC-05模块连接是否正常,HC-05收到后会回复“OK”
( `( |: m2 t8 N/ o, {  j9 G• AT+NAME=名字 配置HC-05的名字,配置成功后会返回“OK”
  ~6 u: b9 p9 Q1 K! D• AT+NAME? 询问HC-05的名字。发送后会收到“+NAME:"名字"”,换行加“OK”+ S5 a. j* W0 L, e5 y% S; B8 `
• AT+PSWD=密码 配置HC-05密码,配对时需要用到。配置成功后,会收到“OK”& m1 w) ?, S+ Q' C- ?
• AT+PSWD? 询问HC-05配对密码。发送后会收到“+PSWD:991102”,换行加“OK”# P: m7 L* t6 d4 K' \
• AT+UART=波特率,停止位,校验 设置HC-05的波特率,其中停止位0表示一位停止位,为1表示两位停止位。校验位为0表示无校验,为1表示奇校验,为2表示偶校验。比如设置115200的波特率,一位停止位,无校验。发送“AT+UART=115200,0,0”即可。配置成功后会返回“OK”# n8 U5 @$ W% |0 S$ ?
• AT+UART? 询问HC-05波特率。发送后会收到“+UART:波特率,停止位,校验”,换行加“OK”: ]) a: ?9 g! S  I
  B* x, U/ n* t- J' e2 D
配置完成功后,断电重新上电,HC-05按照配置好的名字,配对密码和波特率开始工作。此时LED快闪。! ?/ f# v2 Y. W6 g
4 U$ ]" ^$ t. o( U$ M. h
% j5 v2 O" V& f; _$ M& Z5 Z6 T  |3 f
三、蓝牙APP

6 ^! O  ^% ?6 Z- E0 R6 i" ?这里介绍一个超级好用的蓝牙APP——蓝牙调试器。大概长这个样子,大家可以在应用商店下载5 z( Z' L1 \5 Y7 D( O3 \6 ?

1 f2 \, m% u# Y3 I, R
微信图片_20231023235811.png
; i+ e4 ^3 f7 J" r$ {' C0 Y! l# m
蓝牙调试器

8 Y. f/ @+ x6 n( e7 C$ L+ u  f% {
/ f5 g8 U' I  D

- a6 j8 ?4 L' r" L: g
这个蓝牙调试器是一个大佬编写的,我这里只是介绍一下使用方法。其他的详细内容,可以到大佬的原文查看提高开发效率-蓝牙调试器。
3 c" C- ?% C2 ?6 d2 a5 R

4 p8 b6 ]4 x7 n2 N/ c/ H8 f为什么推荐这个蓝牙调试器?个人觉得,它能够在众多蓝牙调试器中脱颖而出,是因为它支持用户自己设计GUI,提供了许多控件,比如常见的按钮,文本框,可编辑文本框,以及一些滑动条,遥杆和曲线图等。支持自由设置位置,大小,功能十分强大。更重要的是,大佬提供了程序文件,对于想快速上手蓝牙模块,用手机与蓝牙交互的小伙伴来说,十分友好。
1 _( T/ w8 J; K* H6 \' k) W( I5 p7 f, F- c, q
四、实战项目6 P$ g( s5 C+ M# l  S5 G
下面我们以手机控制两个LED亮灭,同时通过BH1750检测周围环境光照强度变化,返回到手机端显示,并且能够显示光强变化曲线。
5 F4 f' K( @1 ?9 P8 v  v2 v0 s- V3 i, p1 u3 E$ [" @
4.1 添加文件- h8 o; ?% I. P# c
第一步,先将大佬的文件添加到工程中。大佬的工程中的初始化函数已经包含了串口的初始化,所以我们不需要再包含串口文件。
6 f" L3 h6 U) N9 J% l
/ {. A5 u- ^+ Z) {
微信图片_20231023235815.png
0 g( a' Y$ Y' X8 D: D
添加蓝牙文件

4 W' r( q; u* ~1 K2 W
) q* v+ r8 A2 N7 f9 h: J7 d
# o$ X! H8 |  ?1 b) t! k' T
除此之外还要讲BH1750相关文件添加进来,具体可见博主STM32外设系列BH1750篇,这里就不再做介绍。
( m9 a! R% Q2 N6 z
5 k) T$ M' D* d# N4.2 配置需要传递的参数7 Z( Q* m4 {7 R7 ]- B/ _5 q
根据项目要求,我们需要配置三个参数,分别用来控制两个LED亮灭,传输周围环境光照强度。首先在程序中定义好这三个变量。
1 R" O* t! I1 P/ i2 S; h0 m8 x7 v
  1. int gLed1Flag = 0;   // LED1亮灭控制标志位
    ) t0 [2 ^7 M3 V- Y' p+ }
  2. int gLed2Flag = 0;   // LED2亮灭控制标志位# [5 E1 ?+ ?7 @4 d
  3. float gLingt = 0;   // 周围环境光照强度
复制代码

6 n9 Y: r6 f( t- \1 Q定义好这些变量之后,我们需要配置一下文件中的接收和发送数据。打开大佬的.h文件,可以看到里面定义了许多类型的发送和接收变量。这里的发送接收是针对单片机来说的,而不是手机。
+ {4 [5 u- C: }
  1. #define TX_BOOL_NUM  0
    8 }( U+ J% ?. V# S6 p( F! x
  2. #define TX_BYTE_NUM  0, Y7 @& X8 I  q, v
  3. #define TX_SHORT_NUM 06 b- A/ l  |  ]/ H/ Y
  4. #define TX_INT_NUM   07 L# j* g6 d& F1 F9 N
  5. #define TX_FLOAT_NUM 0
    . {$ d9 y# J# p5 x4 L
  6. 9 N% o/ [6 T7 F' l
  7. #define RX_BOOL_NUM  0
    / E5 ?( D& t: s" x
  8. #define RX_BYTE_NUM  0% r( i9 _' }- K/ c- T" @
  9. #define RX_SHORT_NUM 0
    5 x6 C& d+ E. O$ }" h
  10. #define RX_INT_NUM   0* W& |: q6 D5 s$ L1 ?; ^0 j
  11. #define RX_FLOAT_NUM 0
复制代码
. e. g" U8 ]' r! }! A# g) z1 s1 j
我们需要单片机发送一个周围环境的光照强度,数据类型为浮点型。需要接收两个LED亮灭控制变量,数据类型为int型。我们在对应的位置配置好对应的变量数量,如下3 l" a0 |& r: Q$ p' F

8 X) Z" W0 |( N. u* p% b  `
  1. #define TX_BOOL_NUM  0
    , g' r1 w6 j7 K7 j
  2. #define TX_BYTE_NUM  0
    . b3 P% X+ ^3 d+ R, V) y$ f
  3. #define TX_SHORT_NUM 0. E' c& J5 {7 F( C
  4. #define TX_INT_NUM   0% m2 d% k( u. o9 r1 Y: N
  5. #define TX_FLOAT_NUM 15 |( S  j8 ?6 }) `0 ~( E8 Y0 g* a

  6. & h9 r5 i% a6 v- t9 y8 a. c. ^* q
  7. #define RX_BOOL_NUM  0
    ( N" _+ u  w" q$ }4 K9 e
  8. #define RX_BYTE_NUM  0
    & m7 v7 a4 J8 V$ y0 O9 h7 P
  9. #define RX_SHORT_NUM 0( k2 N" q' ^/ \( N& A
  10. #define RX_INT_NUM   20 C: b8 @3 S: M5 N* s
  11. #define RX_FLOAT_NUM 0
复制代码
8 @) y- B! X& ^# ]& C. j
4.3 获取返回值
; W8 g# g5 h0 ]9 e8 i在使用手机APP控制LED亮灭时,单片机需要接收到手机发送来的数值。接收程序如下) Z( e/ @4 |6 l- Z9 T+ y% e
  1. // 如果接收到APP端数据9 _; _3 W5 n6 A7 j% p6 f9 h: B
  2.         if(readValuePack(&rxpack))! ^) ?/ _, t% H5 T0 S
  3.         {
    8 Q+ I& |, k; q# ]  _6 H
  4.             gLed1Flag = rxpack.integers[0];
    : U4 W/ n% ]' [- a9 q
  5.             gLed2Flag = rxpack.integers[1];
    2 e" |+ f+ e+ d' U
  6.         }
复制代码

( P5 d) C2 l) M$ `( w具体哪个值对应哪个参数,这些需要在手机端配置,放在下面介绍。
! m& j4 ?& ?9 w$ {$ h0 K# e. O. J4 |9 }/ q  Q: Y4 }8 h, T9 j" a/ M
4.4 发送光照强度

( W- W5 c7 }- _4 ^7 n; O4 o% }7 F单片机需要不断地向APP端发送周围环境光照强度数据,程序如下8 Y5 M2 I; f- |4 g8 m, H
  1. // 向APP发送周围环境光照强度9 Z1 G: D7 b- [# ^
  2.     txpack.floats[0] = gLingt;
    - L0 Y5 ?0 V! }* @3 H
  3.     sendValuePack(&txpack);8 ^) U- d* ]; B- u; j, l' `
  4.     delay_ms(10);   // 防止发送过快
复制代码
  G' b7 u8 A& q9 R
需要注意的是,蓝牙发送数据时如果需要一次发送多个数据,一定要在两次发送之间加10ms延时,否则会造成发送失败。9 I: |9 ]5 {5 N6 Y+ Y3 |: R
* R9 r# o4 ^# ~* I' V& `
+ {# W% Q9 M2 j' L' `
4.5 控制程序7 t# K% [0 L8 ~; }8 d- j9 v7 u6 p
包含两部分内容,一部分是通过BH1750获取周围环境光照强度,另一部分是LED亮灭控制函数。程序如下& p# Q9 {- l  v/ r7 c
  1. // LED亮灭控制- m! ~6 S. X( Z
  2.         if (gLed1Flag == 1)
    ( X4 Q8 i; q- z3 l( M+ D
  3.         {( z0 L$ V0 f* F. ]  D& o+ v
  4.             Med_Led_StateCtrl(LED1,LED_ON);   // 点亮LED1+ w9 Q: S/ h- `; J% |
  5.         }/ x; F$ N7 j; J  D* A: {
  6.         if (gLed2Flag == 1)* }2 m# I- I2 u$ w: I
  7.         {
    . I6 N4 O" B& F0 O3 L: a
  8.             Med_Led_StateCtrl(LED2,LED_ON);   // 点亮LED2
      d( H$ g- Y/ J, X& u
  9.         }; P5 G- i( c, {" F* ?8 q% o8 c/ ^) G# D
  10.         if (gLed1Flag == 0)
    % n- n5 w: f2 c6 ?
  11.         {0 U( U* f$ U+ K- _& n8 @/ T
  12.             Med_Led_StateCtrl(LED1,LED_OFF);   // 熄灭LED10 Y9 f/ b. ~' B1 B, `
  13.         }
    ( q  g3 q) n0 ^; n
  14.         if (gLed2Flag == 0)/ Y. _; M8 {: h" q( z7 X
  15.         {6 y7 C/ \5 ~7 y$ O/ ^1 N
  16.             Med_Led_StateCtrl(LED2,LED_OFF);   // 熄灭LED2
    0 {  U0 g2 D6 U5 e0 u5 k
  17.         }# j4 b# l7 T: j) @: ?
  18.         ' n! v5 @6 W6 X- _% j* T4 `; c
  19.         gLingt = Med_Bh1750_GetLightIntensity();   // 获取周围环境光照强度9 i; H5 H' b' m; k
  20. 4.6 手机端页面设计
复制代码

; c9 Y4 \0 o0 Y* _, a5 ], ]; x4.6 手机端页面设计
; B' s# N" F! E4 P% G根据项目要求,需要有两个LED开关,一个显示周围环境光照强度的文本框,还有一个波形显示框。  B, T2 n8 L0 k& g
# |+ t' l- o6 n, K7 k9 z; P# r1 G, @
4.6.1 新建调试工程
8 N+ b5 d0 L- v! ]" R! n打开蓝牙调试助手,选择中间的“专业调试”,然后点击加号新建调试工程。' f' {+ q! a2 [+ e# c6 H
8 @( W/ A8 y$ V
微信图片_20231023235818.png
) U0 e* I% m& t! ]5 |
新建调试工程
! o7 f+ D  A1 f" Z
3 D% t2 Z: B- k. {* W+ A

* P5 J' A( u! @- H8 V( B3 T& k8 C
4.6.2 设置通信变量
1 m- J$ L( K: c/ M8 L, p* v" w# y
我们新建完调试工程后,需要先进行通信设置。实际就是将我们手机APP与单片机通信时需要的变量配置好。5 ~+ B! ^3 y  O0 ?$ W' G" q  @4 X

# j9 H( ^8 O) m3 h* o: S8 Q首先选中新建的调试工程,选择“通信设置”
7 g5 x, G, ]  `) j9 ]. t) t* {5 g, W, \% Q$ C, T5 k
0 b/ ]2 A! z7 d& m) P! v
微信图片_20231023235822.png

5 |% ]! G2 |0 n5 @5 ^
通信设置
5 U: t" U2 `- p/ N0 z- `: v

; I. {' N( g" o5 L0 M1 _; P' I- E' C; J$ \- z9 [
进入之后可以看到如下页面
4 E1 D( ]0 w0 n9 j. B7 b5 T
) ^; ~, i# A4 {
微信图片_20231023235825.jpg

( C- T- R6 Z- _9 R' i
通信设置页面
9 a  B" X( ]1 O  w
$ h( G* M5 e  e! ~* a" n$ ]) P3 w
/ x7 W$ \# r5 _* B6 F# w# C
这里的发送接收,只针对手机APPA而言的。7 D3 s! G2 P$ ?. h2 z5 g/ Z
  P& z6 \5 q5 V' F( I, N7 V
我们需要新建一个接收变量和两个发送变量。接收变量为float型,发送变量为int型。这里的顺序对应我们单片机接收时,变量在接收数组中的位置。
. R1 [/ R3 [. z' n; Y* [9 G( ?; {9 e, b6 |/ [1 w4 \8 \

; @$ e1 o  @  I9 C- w0 K
微信图片_20231023235828.png
5 B5 K. ?9 p. u+ u7 g
发送变量

; n0 s# M# l4 s/ g4 c
微信图片_20231023235831.png

- }1 c) R* z4 r7 o% B% R6 @- F
接收变量
3 y4 |- ]" }7 m* v$ {+ P

/ ~+ Q2 }# y+ O6 p. p

, Q/ Q0 Y5 n: J" V5 Q4 o' m. |" G
设置完收发变量后还需要设置一下通信模式。点击最右边的通信模式。选择“仅操作控件时发送”即可。如下图
' F% b9 D& i% f( S8 z+ P5 |0 `- j1 k5 P. J
微信图片_20231023235834.png

1 Y" {4 s& Y% [& z6 u0 y2 y) |
通信模式设置
7 X, F, G% [; j- S3 i

1 [8 U0 }9 e( X
8 e: E6 G+ I% d
至此,通信设置完成。7 K* t5 q; f/ G8 o) G8 [, u

8 j. m+ p+ a  `) R% a4.6.3 编辑控件/ l0 a/ o: y/ ?% P( P
选中新建的调试工程,选择“编辑控件”,即可进入编辑页面。
# M( F- Z, C6 C  f' s4 C, r+ V) u% X3 B+ \- c- Y
微信图片_20231023235836.png
2 D" N9 V7 V# p/ b8 ^
编辑控件
- u; W. _, S" U
1 ~  X! f% C: t$ e7 g+ ]! _$ g- c( T

& J8 v1 B: X# a
4.6.4 添加LED控制开关: T- I; [# r' O
进入编辑控件页面后,点击加号,添加一个开关。添加时会弹出页面让我们设置开关的信息4 K: v6 X/ f" V2 }$ d
2 N9 s2 s6 k: A$ Z! N. ]
微信图片_20231023235840.png

4 k3 E1 k/ F( D0 I( n6 i
添加开关
8 o8 E  t# I9 u) P* u$ U
2 u! d' z0 z  |! Z% p1 {5 I$ ]- c

; R' y# Z8 K" X! O
第一栏是选择该变量是接收变量还是发送变量,第二栏是选择变量类型。最后一栏是选择关联的变量。关联的变量就是我们在通信设置中添加的变量。
- J8 e0 ^# a2 l( |$ d  y5 n

/ N9 t0 a5 c+ Y" @( ]选择完成后需要设置开关参数,设置打开和关闭时对应的值* }" O1 L& d" O1 B# N* u$ k8 o
3 a. j% Y( h1 |7 Y+ ~
微信图片_20231023235843.png

7 N$ u! S9 y; h
设置参数
) l, e( O/ F0 S2 Q  h
% ]8 C0 `1 W- y& o& N

) U1 Z0 o3 @. b: M" Z# p
4.6.5 添加光照强度显示控件
9 h2 V* o) c; m) P. {2 W光照强度显示控件我们选择文本,操作与添加LED开关类似,注意链接好我们添加的光照强度变量即可,这里就不再做详细介绍了。# _  c0 y- ^) s, b4 U  M

( V; z5 o4 ?: n# A3 Z" P项目要求能够显示周围环境光照强度变化曲线。这里我们用Y-T一维曲线图来显示。添加之后链接我们添加的光照强度变量,设置好范围即可,这里不再展示。
4 I  Y4 a* c7 C, k/ q( d* h4 K% e- r: T8 c7 Y# T+ @' ]
五、成果展示
' [; |( `0 n+ o8 r+ O% q2 @首先用蓝牙调试器搜索我们的HC-05进行配对。配对完成后,在专业调试中找到我们新建的调试工程。点击右侧的开始按钮,选择我们的蓝牙,就可以开始操作啦。
& |  @1 u6 y0 P7 E5 j$ P: h( I; A8 A/ w" q; x+ o9 `
微信图片_20231023235846.jpg
$ v6 `! G' J. Q% c7 ]! v3 Q- }
成果展示
6 g9 N0 E, t! j& R2 y: r
6 P! A, O: h- z8 |- A3 y

; O$ g8 z8 t/ n3 J
点击开关可以控制LED的亮灭。文本框显示当前周围环境光照强度。最下面显示当前周围环境光照强度变化曲线。博主最近手边没有烙铁,买来的BH1750没有焊接排针,所以没有连接。因此,显示的光照强度值为0。
# \- w( V2 R: H  `" s+ F- J
5 d- ~) `0 F9 Z% |% Y8 \% Z
& _9 j- L9 K3 w+ u6 r  d
转载自:二土电子
7 I+ X3 V; B. @4 n7 S; |9 m# L如有侵权请联系删除, @) t5 g7 u9 D/ P. c( Q( a

/ C& i% o: i! _/ K4 m$ f% {; E0 s' J- E1 c9 ?7 Z
收藏 评论2 发布时间:2023-10-23 23:57

举报

2个回答
STMWoodData 回答时间:2023-10-27 17:34:10

学习学习

xu@xupt 回答时间:2023-11-2 15:03:01

AT-Command 开发HC05确实方便呀

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