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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:57
一、蓝牙简介  Y- g% \- E" Y
蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4~2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。我们这里介绍的是在嵌入式开发中常用的蓝牙模块——HC-05。
/ O% L) V- ~8 r/ p+ n
9 ]8 I  n+ _' N- v
微信图片_20231023235738.png

7 H- W! b" W6 }: Q( _3 e3 b
HC-05
- L) a  A1 [1 v( K

- A: H8 e: F/ Y" |/ O& X" n
二、使用方法( F9 r( j' r* |2 Z
2.1 接线

; ?7 `1 m: V: Q% [* ?HC-05供电电压为3.6V~6V。通常使用5V供电。其余的RXD接TXD,TXD接RXD,CND接GND即可。
( _, ^0 l" H  R& Z6 X" r" B* L: |8 N. x3 N3 v
2.2 AT指令* B! c# y9 z! \) q, s; m
HC-05也可以使用AT指令进行配置。在配置之前,首先需要让模块进入配置模式。博主买的HC-05有一个小按钮。按住小按钮再给蓝牙模块上电,蓝牙模块进入配置模式,此时模块上自带的LED会慢速闪烁。进入配置模式后,就可以用AT指令来配置我们的HC-05了。配置时,用USB转TTL连接HC-05,用串口调试助手发送AT指令进行配置。需要注意的是,HC-05配置模式的波特率固定为38400,如果你给HC-05发送指令,没有收到回复,记得检查一下串口调试助手的波特率是否正确。下面列举一些配置时常用的AT指令8 W2 [6 H; A* L
  J5 @7 S) |  ~: m0 H
• AT 检查HC-05模块连接是否正常,HC-05收到后会回复“OK”5 Z6 R5 `6 s* S$ |; c
• AT+NAME=名字 配置HC-05的名字,配置成功后会返回“OK”( ]5 X5 l" A4 z9 t( j9 \3 `
• AT+NAME? 询问HC-05的名字。发送后会收到“+NAME:"名字"”,换行加“OK”
& R: O4 L" Q0 `4 k. X5 _( A• AT+PSWD=密码 配置HC-05密码,配对时需要用到。配置成功后,会收到“OK”* }  b, f5 z% M: H
• AT+PSWD? 询问HC-05配对密码。发送后会收到“+PSWD:991102”,换行加“OK”: S+ `) l- V, y) b, {$ R6 o
• AT+UART=波特率,停止位,校验 设置HC-05的波特率,其中停止位0表示一位停止位,为1表示两位停止位。校验位为0表示无校验,为1表示奇校验,为2表示偶校验。比如设置115200的波特率,一位停止位,无校验。发送“AT+UART=115200,0,0”即可。配置成功后会返回“OK”
" G& {! H1 V0 N/ c9 o* }• AT+UART? 询问HC-05波特率。发送后会收到“+UART:波特率,停止位,校验”,换行加“OK”3 s/ B( `% \0 t. q+ M* G
3 f  H# n/ `/ H) T4 W8 U" R
配置完成功后,断电重新上电,HC-05按照配置好的名字,配对密码和波特率开始工作。此时LED快闪。
( z( c/ h3 m1 v0 {4 J/ [2 a5 M: t# D
5 R: n  V, ~0 r% t

/ F8 J6 i2 w# ~0 H( H三、蓝牙APP

2 I2 D6 c5 T! G9 Q0 _这里介绍一个超级好用的蓝牙APP——蓝牙调试器。大概长这个样子,大家可以在应用商店下载
# e7 ~3 @8 y9 v+ a( w
% }! D: M2 W! |
微信图片_20231023235811.png

4 ^- i( D* f- r( \  Z" T
蓝牙调试器

: H! c% \! H( ~; m0 I& Y
! F, e4 h4 m( e' Z& P
. \9 d3 u% i2 M6 [5 K# U4 w
这个蓝牙调试器是一个大佬编写的,我这里只是介绍一下使用方法。其他的详细内容,可以到大佬的原文查看提高开发效率-蓝牙调试器。. P8 I( R  h. ^5 u; u

2 M" G% _; r+ x1 P0 B9 v& [为什么推荐这个蓝牙调试器?个人觉得,它能够在众多蓝牙调试器中脱颖而出,是因为它支持用户自己设计GUI,提供了许多控件,比如常见的按钮,文本框,可编辑文本框,以及一些滑动条,遥杆和曲线图等。支持自由设置位置,大小,功能十分强大。更重要的是,大佬提供了程序文件,对于想快速上手蓝牙模块,用手机与蓝牙交互的小伙伴来说,十分友好。3 S& Q/ c! U0 H

' f& s3 V2 _5 `2 @四、实战项目4 X, u0 q  b" d, O! `6 I
下面我们以手机控制两个LED亮灭,同时通过BH1750检测周围环境光照强度变化,返回到手机端显示,并且能够显示光强变化曲线。6 U' B5 n" x% V$ [
8 u' N9 R* d$ F$ K
4.1 添加文件
7 }& i! t  N+ ~  T第一步,先将大佬的文件添加到工程中。大佬的工程中的初始化函数已经包含了串口的初始化,所以我们不需要再包含串口文件。
; E: u5 b4 ?8 j0 S8 R
9 h2 d4 R# w+ L
微信图片_20231023235815.png
! _9 n0 _; z8 ~% @) [1 J1 a
添加蓝牙文件
, D+ U0 r* x* {: Z

% G- V8 }- T  c8 h$ S/ }
5 h; g4 O7 r1 M, T/ [! g! O9 F0 @
除此之外还要讲BH1750相关文件添加进来,具体可见博主STM32外设系列BH1750篇,这里就不再做介绍。# x' y+ X" S9 Y" t" x$ D
1 r* T9 x- v; C1 i) Z  a) q' q- E, ~, [
4.2 配置需要传递的参数$ h+ C& s7 Y# W+ g% ]4 H2 o* i9 ?1 S
根据项目要求,我们需要配置三个参数,分别用来控制两个LED亮灭,传输周围环境光照强度。首先在程序中定义好这三个变量。
( C2 `  E( d7 p5 D2 E* `' E% P9 {3 l
  1. int gLed1Flag = 0;   // LED1亮灭控制标志位
    8 [+ q  A# S  z4 R0 w
  2. int gLed2Flag = 0;   // LED2亮灭控制标志位
    0 |$ b- y+ H! Q* ?! b! K/ V& B
  3. float gLingt = 0;   // 周围环境光照强度
复制代码
/ l' I! h  s4 s9 }( X
定义好这些变量之后,我们需要配置一下文件中的接收和发送数据。打开大佬的.h文件,可以看到里面定义了许多类型的发送和接收变量。这里的发送接收是针对单片机来说的,而不是手机。
+ I. k* y1 s. G4 m. B
  1. #define TX_BOOL_NUM  0& R8 H; Z* R' s( {/ d6 D! m3 n) m
  2. #define TX_BYTE_NUM  0
      K+ A9 E! X2 T# a
  3. #define TX_SHORT_NUM 0
    " L/ M6 I5 h7 w- b7 ^2 q
  4. #define TX_INT_NUM   0% o1 ^, O3 O9 Y6 L* l; V6 o' }+ C
  5. #define TX_FLOAT_NUM 0
    7 A% D7 m6 n5 e) j
  6. ( X8 H  T" L2 D& n: s. s
  7. #define RX_BOOL_NUM  0
    ' }2 |2 O* U# K8 f7 m6 @" g
  8. #define RX_BYTE_NUM  0
    + B, j  }+ c0 i& j9 M
  9. #define RX_SHORT_NUM 0, N3 b7 s% H1 {, V* C
  10. #define RX_INT_NUM   0
    8 @; f9 V6 J# t
  11. #define RX_FLOAT_NUM 0
复制代码

1 z. l5 D7 S9 V; b- U9 e1 P我们需要单片机发送一个周围环境的光照强度,数据类型为浮点型。需要接收两个LED亮灭控制变量,数据类型为int型。我们在对应的位置配置好对应的变量数量,如下
, n# Y- A5 m! o2 L0 x# V
/ q) E  x2 A7 ]4 V6 o& C
  1. #define TX_BOOL_NUM  0
    4 `) I7 I" m6 c* S
  2. #define TX_BYTE_NUM  0
    6 D( z' `4 {- q# x
  3. #define TX_SHORT_NUM 0
    4 c/ r% }6 F) V5 k- m8 D( |
  4. #define TX_INT_NUM   0# e+ |& n1 x5 k& d' J
  5. #define TX_FLOAT_NUM 1
    & U  j8 l, [' D: F, U2 t  C9 g
  6. 7 g: }- I  x# _9 y' j+ Z% J
  7. #define RX_BOOL_NUM  0
    9 w& j1 C( B% U  {
  8. #define RX_BYTE_NUM  01 d7 A& T6 D& C, Q/ d
  9. #define RX_SHORT_NUM 0$ J$ h7 o3 `" d  B. J8 W  W
  10. #define RX_INT_NUM   2
    - U. E& A. Y2 Z/ g# r
  11. #define RX_FLOAT_NUM 0
复制代码
+ i$ X2 J5 S6 F: F5 l5 U! B
4.3 获取返回值
9 E* i8 T% _+ D& O0 N8 y6 F- Z在使用手机APP控制LED亮灭时,单片机需要接收到手机发送来的数值。接收程序如下
7 O8 Q6 w. y/ }0 S! h1 D
  1. // 如果接收到APP端数据
    ' Y8 m. Z$ D7 t, X5 M% F& s
  2.         if(readValuePack(&rxpack))  O6 v$ ?; W  J. I, N
  3.         {
    $ e' `$ r8 K4 Q7 l" [3 s
  4.             gLed1Flag = rxpack.integers[0];$ l+ ]8 `5 I/ f8 r" |
  5.             gLed2Flag = rxpack.integers[1];
    " L6 n6 C. Y2 J$ b' u' e9 T5 f
  6.         }
复制代码
4 j8 |! t, d$ i" L9 B
具体哪个值对应哪个参数,这些需要在手机端配置,放在下面介绍。5 g6 f; Q' X8 V; D, ^5 F, ?
0 W  f7 g7 Y% h0 Y7 Z0 I9 E
4.4 发送光照强度

) ~. w; G0 J/ I- |, M单片机需要不断地向APP端发送周围环境光照强度数据,程序如下3 y) @, f. t3 z, {- {+ {. X* ]
  1. // 向APP发送周围环境光照强度
    . i$ T& Z- C& W- N5 |+ g
  2.     txpack.floats[0] = gLingt;1 X1 B  P8 ?6 i1 P3 a5 ^
  3.     sendValuePack(&txpack);' L5 K: h8 @; x2 l' @' X/ J
  4.     delay_ms(10);   // 防止发送过快
复制代码

1 _, L* F) ?7 J% _需要注意的是,蓝牙发送数据时如果需要一次发送多个数据,一定要在两次发送之间加10ms延时,否则会造成发送失败。
( |' s' Y& @3 ~$ q6 r- ]6 ?, E) E+ e
. D3 V( ~" u4 W) \" X/ e: m
4.5 控制程序  O, z6 `) ^! g" [9 [/ ~
包含两部分内容,一部分是通过BH1750获取周围环境光照强度,另一部分是LED亮灭控制函数。程序如下
) k, H3 E, G4 W. }: _& y0 a
  1. // LED亮灭控制
    8 h) c0 G/ a! \- }; m0 C
  2.         if (gLed1Flag == 1)! c1 @9 R' c0 T$ g$ P( I) N+ O
  3.         {
    " c0 n1 B: N& w
  4.             Med_Led_StateCtrl(LED1,LED_ON);   // 点亮LED1
    , f3 @! I1 ?( j
  5.         }3 R2 \+ e7 e; c6 b, l3 ~9 L. @
  6.         if (gLed2Flag == 1)
    / i: e$ |0 R! K  ?
  7.         {. G' A0 z- @$ L. i1 R# F
  8.             Med_Led_StateCtrl(LED2,LED_ON);   // 点亮LED2
    1 O4 S/ Z( ~! y- T
  9.         }
    2 ~1 F# d9 t$ V6 d4 d
  10.         if (gLed1Flag == 0)2 p  S1 X/ U" }7 F
  11.         {
    6 a% e- W+ p* `, x1 l! U8 F
  12.             Med_Led_StateCtrl(LED1,LED_OFF);   // 熄灭LED1+ K; Y/ [7 f1 Q) [) o
  13.         }
    0 }# F+ U+ t6 v1 O
  14.         if (gLed2Flag == 0)
    ) W/ E0 }- k4 F
  15.         {
    , G6 A8 H" Z% B% q, n; c
  16.             Med_Led_StateCtrl(LED2,LED_OFF);   // 熄灭LED2, `7 y5 L2 A4 {' h
  17.         }
    ( c, Z1 a9 p2 b2 ]# c
  18.         
    9 ]$ `: D6 t/ g/ {. D, a
  19.         gLingt = Med_Bh1750_GetLightIntensity();   // 获取周围环境光照强度
    ; Y, o  o' l# Y& b9 m5 ^
  20. 4.6 手机端页面设计
复制代码

, F4 s# C& e2 Q4.6 手机端页面设计' b" T# G& {: o
根据项目要求,需要有两个LED开关,一个显示周围环境光照强度的文本框,还有一个波形显示框。8 |: k! Y# T0 a5 C# t3 J

, n) j8 S6 w/ `8 U4.6.1 新建调试工程
8 j% g9 M' Q$ @  d5 _& R打开蓝牙调试助手,选择中间的“专业调试”,然后点击加号新建调试工程。
* b  z( h3 l5 @
8 `/ e! Z# m5 q. |3 V# s
微信图片_20231023235818.png
5 C4 k2 w- d- e( y5 z5 x" \$ n& |' Z
新建调试工程

/ Q8 g, O2 y. ]$ s! o

4 r+ B# K, H" s; N2 F, p" R' o2 x* k+ P$ e5 u1 G. w
4.6.2 设置通信变量

# u% K8 R6 B1 u8 g我们新建完调试工程后,需要先进行通信设置。实际就是将我们手机APP与单片机通信时需要的变量配置好。4 T, C+ F7 p# h& G/ X

0 H- D7 K1 t5 [9 j; z首先选中新建的调试工程,选择“通信设置”, t5 }' {- j3 R. Z
$ m; M9 {% N5 F) \+ e/ N
3 \( u: F# D& e( O) D* r: C# \% r5 H
微信图片_20231023235822.png

. {- ^- c4 ]8 v# [! ?
通信设置
1 S: i+ ~' S2 G$ ?8 B) c7 E

- p2 D8 j9 Z. p6 I4 o: [9 |7 d- S! ]! ~; I% g
进入之后可以看到如下页面
: _% W8 X+ i  J( D6 M  j; ]. I! {( Y; _& I0 u& ^( Z
微信图片_20231023235825.jpg
. V& n4 w  W6 `- t+ h. R
通信设置页面

4 i  q& ^* c- o
% N' s8 q( S# R$ O

+ J( b, }; l' l* m- D
这里的发送接收,只针对手机APPA而言的。
( w- i+ ]$ ]' z# B6 n: N) n! b8 A6 K7 O+ _; O! F  G8 A' t
我们需要新建一个接收变量和两个发送变量。接收变量为float型,发送变量为int型。这里的顺序对应我们单片机接收时,变量在接收数组中的位置。) M/ @4 D! A8 H# G
2 _$ N% D: @- r" u/ [) V/ m  J

& l* [% z# m' w9 Y$ Y: N. H
微信图片_20231023235828.png

4 P6 d$ e6 n. ~9 e/ z
发送变量

9 T! ]2 d/ R2 C8 X% p# O+ M; Y
微信图片_20231023235831.png

% s/ @% P1 t6 C/ j! U9 A" i
接收变量
" Z- f3 z, C2 Q0 `1 N/ }

8 m* Z& @- [4 ?. w

) V) N+ ~2 F1 e
设置完收发变量后还需要设置一下通信模式。点击最右边的通信模式。选择“仅操作控件时发送”即可。如下图
4 |# N8 `* A% g- Y9 c4 B* Z7 _
) q% \/ U. Y8 N/ b" Y
微信图片_20231023235834.png
" P/ y4 L: b7 W, t
通信模式设置
+ |( x6 z1 N8 W+ ^4 Z. W

" p5 I7 |# I. y
" F7 a/ O' m; ?8 i& X. Q
至此,通信设置完成。6 T: s- z3 N+ m8 q

) v" f% E  p! l$ x9 _! G0 L, X4.6.3 编辑控件
5 X, C& h! H+ w! ^/ C选中新建的调试工程,选择“编辑控件”,即可进入编辑页面。
% W3 W/ F2 F) Z8 J
/ [4 z6 R% n  d2 ]+ i& Q& }
微信图片_20231023235836.png
8 e- o6 J0 Z, F; y  r8 h- I/ C
编辑控件

% z' H: ?- w- Y; T

; l2 d& V- [! C, I
4 S1 O$ V$ _2 ?  C) ~3 L
4.6.4 添加LED控制开关: I+ {9 u- O  H& t& W8 l
进入编辑控件页面后,点击加号,添加一个开关。添加时会弹出页面让我们设置开关的信息
7 W4 M! z, }; y. _: {* i
/ [2 V/ q! ~/ K8 `% D: V, a% f
微信图片_20231023235840.png
. p/ C- n1 R4 d8 Z) e" E1 P
添加开关
+ g. S0 O3 D! c, i: D7 u( N  d

) O# K6 r3 E) N0 V
, W1 L" |( r& f4 V4 m/ K
第一栏是选择该变量是接收变量还是发送变量,第二栏是选择变量类型。最后一栏是选择关联的变量。关联的变量就是我们在通信设置中添加的变量。( f; s% t: n1 ?2 E7 m  k$ u! W% O

# B0 N) V8 ~' m$ F2 m. P选择完成后需要设置开关参数,设置打开和关闭时对应的值
0 P1 |9 z! K4 c& s
/ _" ?4 S: w1 l
微信图片_20231023235843.png

  \6 \3 @, s( t2 F4 u5 t
设置参数
& n" j& e6 k7 X4 u3 U7 W
: y; e' f) f% I6 n

) N5 p2 R6 L) D) {4 B9 v4 \7 s0 u! c
4.6.5 添加光照强度显示控件
" Q" ~! k! P/ ?' q( B$ @: \% v- O光照强度显示控件我们选择文本,操作与添加LED开关类似,注意链接好我们添加的光照强度变量即可,这里就不再做详细介绍了。
- n  c8 D7 [  o" i- @
" z! x, ~0 ?8 z. n6 D$ e. U  J
项目要求能够显示周围环境光照强度变化曲线。这里我们用Y-T一维曲线图来显示。添加之后链接我们添加的光照强度变量,设置好范围即可,这里不再展示。
# h& t6 q3 ]2 F1 t, G: b
$ @7 }5 @3 u( Q  u+ _五、成果展示
3 w) P4 d# e3 ~4 e7 T( t# I首先用蓝牙调试器搜索我们的HC-05进行配对。配对完成后,在专业调试中找到我们新建的调试工程。点击右侧的开始按钮,选择我们的蓝牙,就可以开始操作啦。6 C7 x6 i: {$ T$ V% ]# V

& v+ Q8 d4 O4 e; k! h
微信图片_20231023235846.jpg
) T2 j' j+ C. z2 K, }
成果展示

8 U2 f3 V0 G4 @& q, G

7 j% r4 |" p4 v3 `  |- E8 }1 U0 c7 \4 U; _7 O: H% Q' o) X
点击开关可以控制LED的亮灭。文本框显示当前周围环境光照强度。最下面显示当前周围环境光照强度变化曲线。博主最近手边没有烙铁,买来的BH1750没有焊接排针,所以没有连接。因此,显示的光照强度值为0。- N9 Y+ M. O/ p1 x" N

9 f+ w3 |- Y0 n& g

, ?5 a/ V) Y' _: \, P转载自:二土电子' X+ [) u! A% b: x" n0 H6 H
如有侵权请联系删除
- ]& Q, }% D: S2 l& _# E5 G
7 Q- `, v; T) b2 Y( I- W  Z
4 }: A. m- C1 A$ v
收藏 评论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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版