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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:57
一、蓝牙简介- Y- N/ I& ^# B0 q' E1 I
蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4~2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。我们这里介绍的是在嵌入式开发中常用的蓝牙模块——HC-05。7 c3 O% S& a5 n/ i0 H; {4 f
% j- T( c( H" |  W6 J- q3 l
微信图片_20231023235738.png
+ d( T6 J* m0 J' u# ]. [+ R
HC-05

% k% R8 s9 q2 r3 Z, E

: W" t" i" I0 q* h! q4 F1 ]5 A
二、使用方法
8 K8 U, p$ q! i; \! j( I* K$ D2.1 接线

: G$ x2 X9 Q3 ]6 |, p' {HC-05供电电压为3.6V~6V。通常使用5V供电。其余的RXD接TXD,TXD接RXD,CND接GND即可。- ]$ ~/ V5 [1 a8 a/ E4 X  Q
: q! Y- |+ I  G- w# m% h0 z. l
2.2 AT指令  L$ p% S( ]* A- N( O' p, B
HC-05也可以使用AT指令进行配置。在配置之前,首先需要让模块进入配置模式。博主买的HC-05有一个小按钮。按住小按钮再给蓝牙模块上电,蓝牙模块进入配置模式,此时模块上自带的LED会慢速闪烁。进入配置模式后,就可以用AT指令来配置我们的HC-05了。配置时,用USB转TTL连接HC-05,用串口调试助手发送AT指令进行配置。需要注意的是,HC-05配置模式的波特率固定为38400,如果你给HC-05发送指令,没有收到回复,记得检查一下串口调试助手的波特率是否正确。下面列举一些配置时常用的AT指令$ N1 y5 ^) n: n  _& s7 p6 q

- W  O/ i7 V$ ^% t• AT 检查HC-05模块连接是否正常,HC-05收到后会回复“OK”9 _! D) R5 Q& ^0 K7 B9 B
• AT+NAME=名字 配置HC-05的名字,配置成功后会返回“OK”! b- r& j' U5 D+ L5 g
• AT+NAME? 询问HC-05的名字。发送后会收到“+NAME:"名字"”,换行加“OK”
+ O. h/ p/ A9 ?. M; q• AT+PSWD=密码 配置HC-05密码,配对时需要用到。配置成功后,会收到“OK”' c8 Q/ V! A5 Y. D$ T
• AT+PSWD? 询问HC-05配对密码。发送后会收到“+PSWD:991102”,换行加“OK”7 W# {" F& }! c3 M; E2 O& ^
• AT+UART=波特率,停止位,校验 设置HC-05的波特率,其中停止位0表示一位停止位,为1表示两位停止位。校验位为0表示无校验,为1表示奇校验,为2表示偶校验。比如设置115200的波特率,一位停止位,无校验。发送“AT+UART=115200,0,0”即可。配置成功后会返回“OK”, c0 \1 Q% M1 x' x! g) g) Q
• AT+UART? 询问HC-05波特率。发送后会收到“+UART:波特率,停止位,校验”,换行加“OK”! P6 E% V( S) e& _  ~, l

; H4 h8 N/ }# N% p2 y配置完成功后,断电重新上电,HC-05按照配置好的名字,配对密码和波特率开始工作。此时LED快闪。; ~- `& T! Y6 J5 p0 h6 n" R- T1 R4 H
+ n  E) n/ H: `$ _" f. g6 ~

% j: ?. Z3 ~4 A- K三、蓝牙APP
& G2 I9 w1 @- M! B. X3 \
这里介绍一个超级好用的蓝牙APP——蓝牙调试器。大概长这个样子,大家可以在应用商店下载9 S7 G  `# R) E- Y$ I$ c: T

9 G+ K  Y# a' `/ z% S" s  _
微信图片_20231023235811.png
; ?( q! o- ?3 s* J& D( P
蓝牙调试器

9 t2 t  C& |/ j! T

& w: c! ]; Q. `4 J7 ]- \; {' p: C* Q' \
这个蓝牙调试器是一个大佬编写的,我这里只是介绍一下使用方法。其他的详细内容,可以到大佬的原文查看提高开发效率-蓝牙调试器。$ C% D: T( ?$ L+ g

) d9 c# ~# P+ X8 i1 y$ ?/ @为什么推荐这个蓝牙调试器?个人觉得,它能够在众多蓝牙调试器中脱颖而出,是因为它支持用户自己设计GUI,提供了许多控件,比如常见的按钮,文本框,可编辑文本框,以及一些滑动条,遥杆和曲线图等。支持自由设置位置,大小,功能十分强大。更重要的是,大佬提供了程序文件,对于想快速上手蓝牙模块,用手机与蓝牙交互的小伙伴来说,十分友好。6 H" s1 G- p& H6 n

5 m  V, l9 K3 d: ~, `& S四、实战项目) Q& ~6 W/ |' F3 u* d  k+ _0 \' v/ U
下面我们以手机控制两个LED亮灭,同时通过BH1750检测周围环境光照强度变化,返回到手机端显示,并且能够显示光强变化曲线。0 B1 }, \: ]. \% s  ?. ~
5 e1 L$ f6 l$ M+ X. F6 K2 j
4.1 添加文件
' G1 Q" ~; b% K1 w& N第一步,先将大佬的文件添加到工程中。大佬的工程中的初始化函数已经包含了串口的初始化,所以我们不需要再包含串口文件。/ ^' D9 z1 V" A, U0 D5 j1 P# O
  H. F$ I0 y5 @3 m) G- W* ^
微信图片_20231023235815.png

5 }; o0 h8 d! V' x, I' Y
添加蓝牙文件

- U5 F& J" q/ g
7 m0 \  [  T) w4 R* ~
4 g) s6 r: W& c  O5 K" q
除此之外还要讲BH1750相关文件添加进来,具体可见博主STM32外设系列BH1750篇,这里就不再做介绍。7 r( _! P/ N3 q; e0 f$ k
! c( j6 `7 A8 Q
4.2 配置需要传递的参数
- T2 r9 w. w( t- T9 Y+ l' k: K根据项目要求,我们需要配置三个参数,分别用来控制两个LED亮灭,传输周围环境光照强度。首先在程序中定义好这三个变量。# f  Q' x" H" c) p
  1. int gLed1Flag = 0;   // LED1亮灭控制标志位
    . e% S' m2 n0 v7 E( B" g4 k  _; n
  2. int gLed2Flag = 0;   // LED2亮灭控制标志位) ~+ I- N- ?& z8 b) w# |1 G1 l9 b4 Y
  3. float gLingt = 0;   // 周围环境光照强度
复制代码

1 W# }  J; l8 K: e& O, Z4 _' J+ X: v定义好这些变量之后,我们需要配置一下文件中的接收和发送数据。打开大佬的.h文件,可以看到里面定义了许多类型的发送和接收变量。这里的发送接收是针对单片机来说的,而不是手机。+ W8 o  {: V$ h
  1. #define TX_BOOL_NUM  0
    1 z+ W. Z- V, Z
  2. #define TX_BYTE_NUM  08 F4 B5 {  S0 ?3 n1 ]. f' s* L" t
  3. #define TX_SHORT_NUM 0
    , y0 q! J- v; O! v9 |# ?) l8 K4 Y
  4. #define TX_INT_NUM   0
    * g2 n& I+ _) [/ n) T. u
  5. #define TX_FLOAT_NUM 0
    : m6 W0 h  S$ N

  6. ' J0 k2 Q8 B5 l- l" o* J
  7. #define RX_BOOL_NUM  07 u) A/ ~; N2 E  o* u! U4 N
  8. #define RX_BYTE_NUM  0
    ; [: [4 K5 L" `1 i% H4 T8 b2 Z
  9. #define RX_SHORT_NUM 0
    * l5 C1 W2 a, {
  10. #define RX_INT_NUM   0
    ! h1 V$ S7 c5 h! A
  11. #define RX_FLOAT_NUM 0
复制代码

% ^# B7 Y3 I3 }& J- ^我们需要单片机发送一个周围环境的光照强度,数据类型为浮点型。需要接收两个LED亮灭控制变量,数据类型为int型。我们在对应的位置配置好对应的变量数量,如下7 M$ t; c1 K+ X9 p# b- o5 i- C6 F

* \! m) e) J+ s! C) }/ `
  1. #define TX_BOOL_NUM  0
    ( n9 e$ s0 C- [8 I% }; B0 }) Y
  2. #define TX_BYTE_NUM  0
    - p. w* i) t" p4 h. ^+ w
  3. #define TX_SHORT_NUM 0" _2 w0 @. W: L9 s& m* y2 h
  4. #define TX_INT_NUM   00 t$ k% A& h! j# m
  5. #define TX_FLOAT_NUM 1
    4 L  T. a; Z; Y" o3 W, Q4 `! o
  6. 3 _+ }/ c) ?! s7 k; {
  7. #define RX_BOOL_NUM  0' N5 C; h7 W0 _6 Y
  8. #define RX_BYTE_NUM  0  e2 G8 z9 \( _+ a; V  S4 P  \
  9. #define RX_SHORT_NUM 0
    - U  L* e6 c0 ?) t- l
  10. #define RX_INT_NUM   2
      e- e* K* I, ]% f
  11. #define RX_FLOAT_NUM 0
复制代码

) T, l9 o$ m! B% l% _- f) Q4.3 获取返回值8 w$ u+ @; U& Q+ }8 i0 @% |
在使用手机APP控制LED亮灭时,单片机需要接收到手机发送来的数值。接收程序如下
* V4 y/ j8 t8 D: F8 F9 V
  1. // 如果接收到APP端数据
    & ~& Z1 ]( F( q' I: v# s6 k
  2.         if(readValuePack(&rxpack))4 @/ Q) t0 l- b; g" l1 Q, y
  3.         {& }# L" a5 m( }* F$ E& v. @
  4.             gLed1Flag = rxpack.integers[0];- m" X+ q) }; J& Z. l: A# K4 @
  5.             gLed2Flag = rxpack.integers[1];
    & U. z: ^( l& ]/ F2 a$ K
  6.         }
复制代码
+ _# S) o: ~: P& k4 P
具体哪个值对应哪个参数,这些需要在手机端配置,放在下面介绍。9 h& [1 |( X" s' z$ m3 r5 B
' k: e& ]6 z8 b: K! R
4.4 发送光照强度

( b7 s3 J, c; d, H: x4 l单片机需要不断地向APP端发送周围环境光照强度数据,程序如下
9 c. p) C2 @3 `1 Q& }/ C6 U" ^
  1. // 向APP发送周围环境光照强度
    ; h: |# Q" Q/ I; R& m
  2.     txpack.floats[0] = gLingt;
    6 y9 h1 k* C7 a
  3.     sendValuePack(&txpack);" o3 K) f# ~  m, G" ]
  4.     delay_ms(10);   // 防止发送过快
复制代码

7 T: G# z; y) r  I" n' Q需要注意的是,蓝牙发送数据时如果需要一次发送多个数据,一定要在两次发送之间加10ms延时,否则会造成发送失败。
1 Z5 ^6 _2 \7 F, C( B
" W: \. I1 z+ \5 {* T

2 {  p4 H2 J( \- o/ a4.5 控制程序. J& _0 T% _0 g2 N& c, M/ m0 l
包含两部分内容,一部分是通过BH1750获取周围环境光照强度,另一部分是LED亮灭控制函数。程序如下  L* F# W+ b& o7 {7 ^) ?. H3 V
  1. // LED亮灭控制& t. G& `  s9 |) ]* T! x6 V; W. T
  2.         if (gLed1Flag == 1); _' Y: e9 Z* I) I
  3.         {& i# Q! ?% G+ N+ s! Q3 v  R& ?
  4.             Med_Led_StateCtrl(LED1,LED_ON);   // 点亮LED1% V7 D9 }% m# n" q& k4 l
  5.         }
    3 \/ Q; g4 g6 U- z! c) u( V
  6.         if (gLed2Flag == 1)0 }4 m# r. b4 F  {: Q; ~
  7.         {' k5 m; D4 g6 y2 o/ w, C2 A! F
  8.             Med_Led_StateCtrl(LED2,LED_ON);   // 点亮LED2
    ! b& ]6 O* c: z* G0 N& m
  9.         }+ u1 h* {) a7 b! c' K
  10.         if (gLed1Flag == 0)3 W3 g# l0 G, y+ m
  11.         {$ c9 p- U9 x6 Y- H
  12.             Med_Led_StateCtrl(LED1,LED_OFF);   // 熄灭LED13 M  Z/ k  ~- r/ M
  13.         }
    4 T; w! q/ @- M$ G3 G
  14.         if (gLed2Flag == 0)
    : n8 w1 R5 [+ K4 m/ N7 n2 k
  15.         {; x. Z2 W2 d# @; f( g: G
  16.             Med_Led_StateCtrl(LED2,LED_OFF);   // 熄灭LED2$ l" [. r+ L) r. ^3 f
  17.         }
    9 C5 Z; M  \# I5 ?6 s8 u, |5 P  q7 Q% |
  18.         
    9 V. l+ s8 I) i* e+ j
  19.         gLingt = Med_Bh1750_GetLightIntensity();   // 获取周围环境光照强度0 [% G' X9 ?2 n2 F9 T
  20. 4.6 手机端页面设计
复制代码

7 u; k' k: h  t% C% s: U( w" k5 T4.6 手机端页面设计
# ^9 _5 _5 n" T+ @% V! B根据项目要求,需要有两个LED开关,一个显示周围环境光照强度的文本框,还有一个波形显示框。
: Q5 j' Y% X6 {

( F9 U, J' l( \3 }8 W. F/ E- R4.6.1 新建调试工程
, w( D. B! I' A( ?& _2 |5 L) d2 `) Y打开蓝牙调试助手,选择中间的“专业调试”,然后点击加号新建调试工程。0 a* h* L, k6 R8 |

+ m- m7 R  V+ w  ]: }
微信图片_20231023235818.png

% y$ \1 q) ]8 ?2 f9 r8 Z* c, h2 x$ f+ }
新建调试工程

  N7 V  m& [) ]5 o$ L
9 V- }1 v0 q( G0 ~3 v( j2 x$ J
9 l; n3 a' ~6 N
4.6.2 设置通信变量

& w  h) e: x! C$ M8 |3 k/ F* ]我们新建完调试工程后,需要先进行通信设置。实际就是将我们手机APP与单片机通信时需要的变量配置好。
  m& l4 Z1 Q8 I/ H! O
' t6 P! n# R- K, Q* [, W( a$ u) @首先选中新建的调试工程,选择“通信设置”
, V9 c/ k9 c6 r
! S' [. B% {2 e
& m7 T' f* r0 ?" [& G! F2 |
微信图片_20231023235822.png

" H8 @; K9 T8 N4 T, }% @5 O3 `: ?
通信设置

; \  B: S7 v2 C/ |0 ]; C0 F
. o% ^6 @+ L' w. z

1 y% J1 o/ x. n' |) K6 r  U
进入之后可以看到如下页面
" m$ X9 x0 D* a# U5 K  t1 H, t. D$ c; U- [* A5 `, k7 h
微信图片_20231023235825.jpg

6 ]$ h8 K$ u& K+ T0 Q: g* H
通信设置页面

1 u/ n8 g0 t+ W3 e
3 M6 L! P! k' }) V) x" N

% V4 T; J7 z! b# B3 L
这里的发送接收,只针对手机APPA而言的。
, D- x' u7 ^8 D; P/ R
6 w& @; K, |6 K( m4 e* M" _我们需要新建一个接收变量和两个发送变量。接收变量为float型,发送变量为int型。这里的顺序对应我们单片机接收时,变量在接收数组中的位置。2 q9 q; q- ~6 a
, V* e, ?9 ]7 m; K& k
0 M3 }, x9 y6 f; r
微信图片_20231023235828.png
2 b, _+ [1 l! o0 A- o+ F8 U( I1 N
发送变量
- }$ p1 n$ Z  C" R% q
微信图片_20231023235831.png
6 E! q% N) F! V6 _) T. m% l4 ^6 X; A
接收变量

  h/ {1 p* C" {  A

2 g6 _" w2 I2 a  W  y3 @; [% z: c* M

" k5 P5 D; o* e
设置完收发变量后还需要设置一下通信模式。点击最右边的通信模式。选择“仅操作控件时发送”即可。如下图
4 E$ u: R7 A! x: ?5 v+ Q+ h( p. i1 U# Z$ O- ]$ X2 O5 j7 |& t" g" B$ [
微信图片_20231023235834.png

; C6 @) m9 N0 c6 v
通信模式设置
" I* `; Z8 [/ p, j2 r* y

: y8 D- S2 g3 h2 P, q6 v9 \2 v7 M* e, k
至此,通信设置完成。
% w- S, j' p0 j6 p8 \6 l0 C
3 y3 z9 m* q! H  P2 X, \# v2 M
4.6.3 编辑控件
2 [6 l0 I) Q# |' |" \" n$ _' n选中新建的调试工程,选择“编辑控件”,即可进入编辑页面。/ U2 r% o# C% Z$ d7 s5 y) M! A# D

( |% E6 x8 P; N" u" k8 g
微信图片_20231023235836.png
6 j4 S& d: ~5 T* j
编辑控件

% V3 n2 W* s) q! K

" F* X' c, u! M- Y, b
: n" Q& _3 E; U
4.6.4 添加LED控制开关
* j" C3 o6 G+ b4 D进入编辑控件页面后,点击加号,添加一个开关。添加时会弹出页面让我们设置开关的信息
* x$ u$ }" ?. Y& \% B9 R5 |. k4 Q6 D+ N8 |4 l: Z
微信图片_20231023235840.png

* l$ t, w% i$ v& U
添加开关
5 I7 u2 D3 {, ]% c

$ C3 q7 a1 Z( n8 r& o& j
' N2 S( M' s# J  s
第一栏是选择该变量是接收变量还是发送变量,第二栏是选择变量类型。最后一栏是选择关联的变量。关联的变量就是我们在通信设置中添加的变量。
: l$ B) H7 @8 g) b
  J" S$ v9 s: f" u' [5 N- {8 i
选择完成后需要设置开关参数,设置打开和关闭时对应的值% B! _. {3 G" I1 I

  g* w- S/ {( a* x; K4 z
微信图片_20231023235843.png
- n+ r+ \, G/ T
设置参数
7 G/ O+ k6 L( `: j) M+ g3 u

5 p9 {/ d, j  z1 }& d) Y% y$ G. A, H$ ^
4.6.5 添加光照强度显示控件
, }0 l. r: ^& a: Y) h- E# X9 h: k光照强度显示控件我们选择文本,操作与添加LED开关类似,注意链接好我们添加的光照强度变量即可,这里就不再做详细介绍了。- F' c' Q% _# G. Y+ I

! `  @7 l& R7 |, I+ M2 n) W0 V5 d5 s项目要求能够显示周围环境光照强度变化曲线。这里我们用Y-T一维曲线图来显示。添加之后链接我们添加的光照强度变量,设置好范围即可,这里不再展示。% \4 m- S8 n& {6 v+ j' x! N5 L1 |

6 Q& h' e3 U1 d# c% d7 y* N' a五、成果展示
  d+ P9 ~. a6 U首先用蓝牙调试器搜索我们的HC-05进行配对。配对完成后,在专业调试中找到我们新建的调试工程。点击右侧的开始按钮,选择我们的蓝牙,就可以开始操作啦。
0 u: M4 f- T9 v) O8 n. q% s7 z7 k- d
/ R$ K. I' A# d+ X, t
微信图片_20231023235846.jpg
8 c( z+ h' H" ^: r& ~6 A% s$ w( n9 j
成果展示

: j8 v8 u8 C2 L5 C) c

7 s  u* w$ {3 y% [( e6 R, l8 t) O4 ^, K. ?) q
点击开关可以控制LED的亮灭。文本框显示当前周围环境光照强度。最下面显示当前周围环境光照强度变化曲线。博主最近手边没有烙铁,买来的BH1750没有焊接排针,所以没有连接。因此,显示的光照强度值为0。
7 p( M" V5 l" E* a  y8 f" A6 ?+ V  ~
/ d6 O" F7 D; f
转载自:二土电子
* Y- X+ ]& o- ?! M如有侵权请联系删除
1 l8 V/ J8 w. W6 \, g. Z3 r

4 g8 y  D4 q% u8 f' u4 y! O; s4 G, t3 W- n
赞 收藏 评论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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版