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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:57
一、蓝牙简介
7 i7 l8 t- P9 x' u7 t" o蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4~2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。我们这里介绍的是在嵌入式开发中常用的蓝牙模块——HC-05。7 k* v( Y( \: i  ^0 Z& L' D  N5 j

5 @' ]! ^/ v  g
微信图片_20231023235738.png
% {: ]5 \  v; s
HC-05

- d0 t2 h) o4 e
5 O! X+ s* e; h3 i& _: n
二、使用方法. O+ @; S3 y4 z
2.1 接线
1 a3 {, w* t9 J6 t! m
HC-05供电电压为3.6V~6V。通常使用5V供电。其余的RXD接TXD,TXD接RXD,CND接GND即可。
# s8 v: o" s) }: c6 X* |* R6 l
6 o! V) K# F' Y' d" l2.2 AT指令
+ }  }& B. r, D; ^& zHC-05也可以使用AT指令进行配置。在配置之前,首先需要让模块进入配置模式。博主买的HC-05有一个小按钮。按住小按钮再给蓝牙模块上电,蓝牙模块进入配置模式,此时模块上自带的LED会慢速闪烁。进入配置模式后,就可以用AT指令来配置我们的HC-05了。配置时,用USB转TTL连接HC-05,用串口调试助手发送AT指令进行配置。需要注意的是,HC-05配置模式的波特率固定为38400,如果你给HC-05发送指令,没有收到回复,记得检查一下串口调试助手的波特率是否正确。下面列举一些配置时常用的AT指令
) l9 g0 H7 M$ T6 X6 R/ l8 }3 T$ L/ A" C- O3 h9 C3 o, `
• AT 检查HC-05模块连接是否正常,HC-05收到后会回复“OK”% c3 ?5 c$ H* V8 p
• AT+NAME=名字 配置HC-05的名字,配置成功后会返回“OK”7 A9 `; M3 v$ i$ @
• AT+NAME? 询问HC-05的名字。发送后会收到“+NAME:"名字"”,换行加“OK”; N. }5 ^, I) s$ f% g1 R$ [+ {
• AT+PSWD=密码 配置HC-05密码,配对时需要用到。配置成功后,会收到“OK”
& n) v1 P1 a! l( H/ D• AT+PSWD? 询问HC-05配对密码。发送后会收到“+PSWD:991102”,换行加“OK”8 ], |; C- K  [, L
• AT+UART=波特率,停止位,校验 设置HC-05的波特率,其中停止位0表示一位停止位,为1表示两位停止位。校验位为0表示无校验,为1表示奇校验,为2表示偶校验。比如设置115200的波特率,一位停止位,无校验。发送“AT+UART=115200,0,0”即可。配置成功后会返回“OK”
  D! y# w# N7 H- W1 z; ?• AT+UART? 询问HC-05波特率。发送后会收到“+UART:波特率,停止位,校验”,换行加“OK”
* t* ~0 R) R/ V5 U2 V
; O4 Z1 l2 p3 O2 q) U- j8 |
配置完成功后,断电重新上电,HC-05按照配置好的名字,配对密码和波特率开始工作。此时LED快闪。9 K/ K2 {/ X; Y- O+ r, O1 D2 v) w
& r2 O: ?3 I+ b& J+ N
) b- Z3 Q6 T1 m4 H
三、蓝牙APP

3 a2 v) A+ j5 \9 j4 g1 `, A. K0 [2 d这里介绍一个超级好用的蓝牙APP——蓝牙调试器。大概长这个样子,大家可以在应用商店下载
. e& ?7 ^) K4 Z9 O/ m; _# P' t! n9 ]3 l3 k* W5 k6 B4 ~
微信图片_20231023235811.png

  A9 t' z( c) r0 Y; T- ?
蓝牙调试器

8 j' @2 j$ ?; M9 C6 p  S- N# k% w

: k4 L) ~) v+ g6 f1 R, k2 @4 I' j% }$ O' C# G
这个蓝牙调试器是一个大佬编写的,我这里只是介绍一下使用方法。其他的详细内容,可以到大佬的原文查看提高开发效率-蓝牙调试器。
# {4 ~% T* _2 V' e/ u

# d* W4 K' o0 M3 Y! b  S, T为什么推荐这个蓝牙调试器?个人觉得,它能够在众多蓝牙调试器中脱颖而出,是因为它支持用户自己设计GUI,提供了许多控件,比如常见的按钮,文本框,可编辑文本框,以及一些滑动条,遥杆和曲线图等。支持自由设置位置,大小,功能十分强大。更重要的是,大佬提供了程序文件,对于想快速上手蓝牙模块,用手机与蓝牙交互的小伙伴来说,十分友好。
! m: I  p0 p0 s2 g6 `
3 T! X- N( F7 {3 i/ Z0 s& T3 F四、实战项目' S. ?' C# F% A: |9 E, N
下面我们以手机控制两个LED亮灭,同时通过BH1750检测周围环境光照强度变化,返回到手机端显示,并且能够显示光强变化曲线。
, ^2 g8 |6 e0 ?# K" Z% c
6 y& ^" x9 {; G/ O1 g) Y7 U4.1 添加文件
* j" O3 [: ]3 h& g9 d第一步,先将大佬的文件添加到工程中。大佬的工程中的初始化函数已经包含了串口的初始化,所以我们不需要再包含串口文件。7 U' G1 h! g6 H+ q- n
& h# x4 J# A: H) m  b# q: s4 i0 h
微信图片_20231023235815.png
1 b* _; P' l* c) E8 o/ p# [  X
添加蓝牙文件
7 S0 Y8 L6 M5 q0 ]6 i1 R
' W5 M8 P- V3 q9 @7 G! W& k
: X. x, G3 V$ [  `; {  }. j$ v
除此之外还要讲BH1750相关文件添加进来,具体可见博主STM32外设系列BH1750篇,这里就不再做介绍。
% _6 z  R% ~% `- L$ @
0 j+ L# W. |5 w- [8 N4.2 配置需要传递的参数) p# V2 d; j  ~8 ~3 d
根据项目要求,我们需要配置三个参数,分别用来控制两个LED亮灭,传输周围环境光照强度。首先在程序中定义好这三个变量。
" g* @. n; O! X' [" t# |, q. I
  1. int gLed1Flag = 0;   // LED1亮灭控制标志位
    & [" P, n4 i7 Q2 {1 T/ I: i1 N- u
  2. int gLed2Flag = 0;   // LED2亮灭控制标志位" m- T$ _' {0 C: I6 P" b
  3. float gLingt = 0;   // 周围环境光照强度
复制代码
% O. ]7 N  }9 m$ V% s. h$ q' O
定义好这些变量之后,我们需要配置一下文件中的接收和发送数据。打开大佬的.h文件,可以看到里面定义了许多类型的发送和接收变量。这里的发送接收是针对单片机来说的,而不是手机。
2 a. ~  @+ K6 ?  c. x* k5 r5 d
  1. #define TX_BOOL_NUM  0% a* o; H! M1 s$ z4 m/ R0 K
  2. #define TX_BYTE_NUM  0
    % G& |* U; u. \7 _
  3. #define TX_SHORT_NUM 0
    1 A' j9 f1 m7 L) d: B+ \9 [3 g
  4. #define TX_INT_NUM   0
    ' j! a+ a4 m  ]9 }; p4 p( V$ Y6 \
  5. #define TX_FLOAT_NUM 0' N4 C4 m8 Z3 K$ j! _# f
  6. + y/ O$ V6 {* U1 [3 H9 x
  7. #define RX_BOOL_NUM  0
    ! Z7 K8 h4 m- S' l+ G" Z4 Q) Y( }* _
  8. #define RX_BYTE_NUM  0
    * a  ^, E0 Q& G( J
  9. #define RX_SHORT_NUM 0
    & x* n1 C) o8 q6 |, U  y& ]
  10. #define RX_INT_NUM   0
    ! z0 T& U) Q# ^
  11. #define RX_FLOAT_NUM 0
复制代码

5 I7 b' |1 I& V" z9 @我们需要单片机发送一个周围环境的光照强度,数据类型为浮点型。需要接收两个LED亮灭控制变量,数据类型为int型。我们在对应的位置配置好对应的变量数量,如下) f* o4 r6 w! s, P6 F

! F/ E5 z( a! {3 h
  1. #define TX_BOOL_NUM  0
    4 m: k8 v3 R% F# I
  2. #define TX_BYTE_NUM  0
    ! Y% L6 p0 Q, C
  3. #define TX_SHORT_NUM 0
    9 \  U1 d7 ^' u& }) E% a4 D
  4. #define TX_INT_NUM   0
    . e! j, G- A: ]! `' M" {
  5. #define TX_FLOAT_NUM 18 r! x& J/ l& Q! {4 Q% V% i* x

  6. ; C9 O( s; T( O- H9 t
  7. #define RX_BOOL_NUM  0$ J' L2 [3 `5 Z+ s% O/ `
  8. #define RX_BYTE_NUM  0
    9 `' y: P6 \% D" r
  9. #define RX_SHORT_NUM 0
    ! c5 o5 B# i  n0 r3 l8 o
  10. #define RX_INT_NUM   24 S- E6 s5 o' Z
  11. #define RX_FLOAT_NUM 0
复制代码

: L( z! Z; g' A1 d1 T( {! C( X4.3 获取返回值
6 G6 h& g6 C" Q2 @在使用手机APP控制LED亮灭时,单片机需要接收到手机发送来的数值。接收程序如下# F+ Z. g4 d2 r3 _5 P
  1. // 如果接收到APP端数据
    0 o. m' a' y: s2 p( c
  2.         if(readValuePack(&rxpack))$ i& X2 X9 u3 J% F# K* T, i
  3.         {' u0 t8 w0 c; a8 c( w8 j3 M0 v
  4.             gLed1Flag = rxpack.integers[0];
    # A9 c( s+ B0 |  S; e
  5.             gLed2Flag = rxpack.integers[1];! ^4 ?5 O# q. u; M( H' |
  6.         }
复制代码

8 P( w. I2 a- ^6 g2 i0 K  I具体哪个值对应哪个参数,这些需要在手机端配置,放在下面介绍。7 X+ o; v5 d% `
6 W$ w. ?* m! `. \/ j
4.4 发送光照强度
$ K/ `2 y; Q  H! t4 T
单片机需要不断地向APP端发送周围环境光照强度数据,程序如下
. e5 v* i+ Z7 z+ O  K
  1. // 向APP发送周围环境光照强度' v& f4 A% |; s; Z( t; R3 p) E# h- C
  2.     txpack.floats[0] = gLingt;4 [6 Q0 J" M3 I; k9 K2 }, a
  3.     sendValuePack(&txpack);
    2 X' u0 ?. K+ w
  4.     delay_ms(10);   // 防止发送过快
复制代码
4 }' y8 a7 n# q, V# t( Z, I: }
需要注意的是,蓝牙发送数据时如果需要一次发送多个数据,一定要在两次发送之间加10ms延时,否则会造成发送失败。. {9 y, n' i1 B- [, k

: |; x! L8 @$ v) F) K

- V, U) H* G4 T4.5 控制程序5 J8 Q7 J5 e- O) w) c
包含两部分内容,一部分是通过BH1750获取周围环境光照强度,另一部分是LED亮灭控制函数。程序如下3 o1 h* X( A' x1 x' h: y$ b
  1. // LED亮灭控制
    4 K4 G- [  Q& E
  2.         if (gLed1Flag == 1)
    & B* n/ u, x. j0 l
  3.         {; I$ ^( j5 H- g( }  |
  4.             Med_Led_StateCtrl(LED1,LED_ON);   // 点亮LED1
    6 Q9 e) e, y% @* {4 F% r& X
  5.         }% c) o* \9 h/ W7 B
  6.         if (gLed2Flag == 1)6 ^, i* E) @1 l3 H' d
  7.         {
    ( q  I8 b' {# T$ ~  r
  8.             Med_Led_StateCtrl(LED2,LED_ON);   // 点亮LED2+ q) e! P& ?( o$ @  W4 m
  9.         }
    ; j. T3 {6 e! U, m
  10.         if (gLed1Flag == 0)9 v% l1 R6 l8 E
  11.         {
    . a, B" f" t- h- v2 q4 n
  12.             Med_Led_StateCtrl(LED1,LED_OFF);   // 熄灭LED1
    0 Z% ^* Z: ~: q- M5 m
  13.         }% M( j. F' m4 e8 }0 `
  14.         if (gLed2Flag == 0)$ H8 m, G% l( a! \. s2 \2 D8 R
  15.         {
    1 X4 `! |5 v4 q, D+ b) f/ J4 E
  16.             Med_Led_StateCtrl(LED2,LED_OFF);   // 熄灭LED2
      L. [( Y9 @) C. {; @7 ?. }
  17.         }- L& ?5 z4 Q3 x! S2 ?6 Q4 o
  18.         
    9 D4 H, e, }5 n+ t# N) X
  19.         gLingt = Med_Bh1750_GetLightIntensity();   // 获取周围环境光照强度
    2 w' d7 g9 ]# R5 E6 E" [3 {
  20. 4.6 手机端页面设计
复制代码

( d5 w+ w9 p$ g4 }6 {: h4.6 手机端页面设计4 t/ k# ~' O* [0 Q4 Y  h+ L8 R
根据项目要求,需要有两个LED开关,一个显示周围环境光照强度的文本框,还有一个波形显示框。
0 b. ]0 j: [+ x' U+ N+ J; }) y
/ H) s  K: i* `- F
4.6.1 新建调试工程; J  |3 t9 e9 m$ Q# l' \+ d
打开蓝牙调试助手,选择中间的“专业调试”,然后点击加号新建调试工程。- T' k+ V) @4 C6 L

; g) _8 A" L1 }' N9 T7 f
微信图片_20231023235818.png

8 H2 y" J2 a. r& B
新建调试工程

+ z4 }1 b' Z+ q' I: P5 Z

8 v, G( b( p0 v( a1 h8 B
8 W) n0 ^+ \1 D+ Q( o! K
4.6.2 设置通信变量

3 K& S: [1 q( ^- {9 b我们新建完调试工程后,需要先进行通信设置。实际就是将我们手机APP与单片机通信时需要的变量配置好。
# ~7 A/ ~4 C  C7 }
* ?- L$ e' ^  k2 n# n# p首先选中新建的调试工程,选择“通信设置”
. y& g: V5 M6 C* y1 J/ {
" \, u% q  F7 A( W8 H# N$ E+ q" a# h/ U
* C" Z( `  s6 J  G
微信图片_20231023235822.png
& o& V1 w' h- v5 L& D2 G$ v% `! Y; y
通信设置
5 K4 E' i( N) [) s1 j5 _  q

: W( B1 R) a1 O' F$ \/ [) x2 r2 z$ B; G4 ]
进入之后可以看到如下页面
' v$ }3 U# ^. O5 i- X' e& Q$ F6 ?+ q/ [1 I8 D- N% s0 \0 j
微信图片_20231023235825.jpg
. O/ x5 J$ u! O7 p  X
通信设置页面

7 G, P8 ^4 O( ^0 N  ~
! E* }% J  N9 S- r$ Y, d+ O
7 _5 \2 q& [6 J9 a/ n& V% P( t0 ]
这里的发送接收,只针对手机APPA而言的。
8 b, J' J* S0 G2 a" d; G0 v; ]1 Q0 @# }
我们需要新建一个接收变量和两个发送变量。接收变量为float型,发送变量为int型。这里的顺序对应我们单片机接收时,变量在接收数组中的位置。  J  L, Z; S* T& `7 C

6 k( q5 l- d- G+ E3 K
8 V% L, y, p+ B9 K
微信图片_20231023235828.png
2 E8 l: d; i8 {" u- \
发送变量

& r0 p: E) [. ~% w, V
微信图片_20231023235831.png

3 s* g5 H+ G6 S
接收变量

9 l. Z! {; B/ `0 x6 ?
7 W, t. H" K1 V: K

7 u; ~& w) {. s2 s. p( B
设置完收发变量后还需要设置一下通信模式。点击最右边的通信模式。选择“仅操作控件时发送”即可。如下图* r' p: M; A3 T

) {4 o$ p/ \5 {' t/ l/ r! L
微信图片_20231023235834.png

4 T" ]  x2 v* h# d
通信模式设置

: j( k0 K+ B  ?, j2 W0 J* h
  M+ E: W4 Q! I# T, k8 V$ X

0 j% s; K+ y) H
至此,通信设置完成。% c# P* D; H# J+ D) O3 z' r
9 S2 K3 l% U/ h5 N  G
4.6.3 编辑控件& Z! A( ~% U% H: W& \
选中新建的调试工程,选择“编辑控件”,即可进入编辑页面。7 @% S$ E  N4 i
. q# m- e9 E: ^  N7 \1 y
微信图片_20231023235836.png

" ~; H0 N4 h  C  ?* Q
编辑控件

+ N" ~1 |/ l$ Y% H# T' f0 |
" ]" H. A' A& ^9 X

! X8 Q/ W8 I" j. K, v& I* |
4.6.4 添加LED控制开关/ t3 C4 I: ~" ?- H  w
进入编辑控件页面后,点击加号,添加一个开关。添加时会弹出页面让我们设置开关的信息
) ~% ~8 V# q4 V# o% G) u) [4 M( x3 ?5 F8 ?7 e1 \
微信图片_20231023235840.png
. j2 I2 }0 l2 w$ F0 c4 L
添加开关
( ?- ]8 |+ A* @& Z6 m
2 o  s! s2 a. p) k3 |, E- `
2 X0 c: ]/ T7 l, u/ o) k. p
第一栏是选择该变量是接收变量还是发送变量,第二栏是选择变量类型。最后一栏是选择关联的变量。关联的变量就是我们在通信设置中添加的变量。% I7 q8 i  W  Q) t" C5 v* Z/ V" O
% Z* E+ O/ V0 V; i
选择完成后需要设置开关参数,设置打开和关闭时对应的值
4 u& e$ ~2 |0 Y9 q
0 P- @2 t. r: F4 d8 H$ X3 Y- X
微信图片_20231023235843.png

3 [* Q& N0 j# W/ X% D3 J1 Z
设置参数
4 `- P, o1 u, O9 d( r
. u2 t5 _9 h, G, j
* G; ^3 Y- @7 R& q
4.6.5 添加光照强度显示控件; T4 r$ e3 s- `$ n( _
光照强度显示控件我们选择文本,操作与添加LED开关类似,注意链接好我们添加的光照强度变量即可,这里就不再做详细介绍了。
& z2 G" H* L6 U+ x& o5 Y) n, v

4 `5 o9 K8 V: u+ y. r9 }6 }项目要求能够显示周围环境光照强度变化曲线。这里我们用Y-T一维曲线图来显示。添加之后链接我们添加的光照强度变量,设置好范围即可,这里不再展示。2 h4 S  o6 A! A9 d0 D

" u$ n, g0 G+ ]; r7 c3 i5 I五、成果展示3 n2 {+ j" L7 _, ]8 d
首先用蓝牙调试器搜索我们的HC-05进行配对。配对完成后,在专业调试中找到我们新建的调试工程。点击右侧的开始按钮,选择我们的蓝牙,就可以开始操作啦。
& }4 P! l. h3 m( j7 E, i: P# j2 x. g3 O2 w! N" u- w
微信图片_20231023235846.jpg

4 M. Q' l! l& U
成果展示
5 h1 V9 Q& T. @% h4 S* n

0 U  p# w0 g! m7 g! e8 M* I; X7 t, c8 m2 U0 i% D9 Z4 E7 {& s
点击开关可以控制LED的亮灭。文本框显示当前周围环境光照强度。最下面显示当前周围环境光照强度变化曲线。博主最近手边没有烙铁,买来的BH1750没有焊接排针,所以没有连接。因此,显示的光照强度值为0。- x$ c0 f4 q8 [
5 V! k1 w7 p( X+ S& `9 ~) k& {, \
, {4 j1 a0 }4 u4 S! m! b
转载自:二土电子/ M3 F( `8 B: l
如有侵权请联系删除* t" k0 E' a& Z8 F0 ^

3 f: I; k! @% v. e0 z; t4 D( u# f6 R* [2 E5 E0 D# ^
收藏 评论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 手机版