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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:57
一、蓝牙简介6 |( v' U, e% @1 W4 ~
蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4~2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。我们这里介绍的是在嵌入式开发中常用的蓝牙模块——HC-05。  j5 ?) g' q. [5 O2 n( T" m- [/ e
  Z$ a' M, \' Q) Y1 u9 O- K
微信图片_20231023235738.png
& ]& G! B- J) z0 W& Y% L/ F0 K' |
HC-05

" ]; z8 f$ n0 }2 a- w- p5 h) @

0 Y! H0 O2 R0 Y" e1 v
二、使用方法
8 n* Q% ~8 H: j2.1 接线

+ s0 H2 K& q# D* r2 ~+ cHC-05供电电压为3.6V~6V。通常使用5V供电。其余的RXD接TXD,TXD接RXD,CND接GND即可。
# A. D" \; L# x4 G! M# h7 M, w4 ^7 i
2.2 AT指令
4 i" G" ^3 M, d( R, Q* pHC-05也可以使用AT指令进行配置。在配置之前,首先需要让模块进入配置模式。博主买的HC-05有一个小按钮。按住小按钮再给蓝牙模块上电,蓝牙模块进入配置模式,此时模块上自带的LED会慢速闪烁。进入配置模式后,就可以用AT指令来配置我们的HC-05了。配置时,用USB转TTL连接HC-05,用串口调试助手发送AT指令进行配置。需要注意的是,HC-05配置模式的波特率固定为38400,如果你给HC-05发送指令,没有收到回复,记得检查一下串口调试助手的波特率是否正确。下面列举一些配置时常用的AT指令4 Y. h  @  k8 K' j
( m+ q& ^, R2 |( D8 `5 t. Y
• AT 检查HC-05模块连接是否正常,HC-05收到后会回复“OK”+ o, n7 b' q1 d! K
• AT+NAME=名字 配置HC-05的名字,配置成功后会返回“OK”
3 z$ T, K% @2 u) Y• AT+NAME? 询问HC-05的名字。发送后会收到“+NAME:"名字"”,换行加“OK”, {! N; h2 A! q; j( `* y! z  E9 q
• AT+PSWD=密码 配置HC-05密码,配对时需要用到。配置成功后,会收到“OK”( z0 |- _% C- ~9 U9 H
• AT+PSWD? 询问HC-05配对密码。发送后会收到“+PSWD:991102”,换行加“OK”
' \9 T* H3 i5 u1 x  T• AT+UART=波特率,停止位,校验 设置HC-05的波特率,其中停止位0表示一位停止位,为1表示两位停止位。校验位为0表示无校验,为1表示奇校验,为2表示偶校验。比如设置115200的波特率,一位停止位,无校验。发送“AT+UART=115200,0,0”即可。配置成功后会返回“OK”
2 A% ?0 F, _4 o0 a9 M; h$ C. n  t2 V• AT+UART? 询问HC-05波特率。发送后会收到“+UART:波特率,停止位,校验”,换行加“OK”/ c7 t$ ~# [1 B: K

% |* p: p2 _6 r  E! J配置完成功后,断电重新上电,HC-05按照配置好的名字,配对密码和波特率开始工作。此时LED快闪。5 n* ^% _1 P4 g2 d% F) x5 Z9 S
' X$ r3 d6 O  Z+ g
/ i2 `/ y" Q* x( v# n
三、蓝牙APP
9 h3 B3 ]. e# ^: }
这里介绍一个超级好用的蓝牙APP——蓝牙调试器。大概长这个样子,大家可以在应用商店下载
) Y) w8 A8 J( I% {6 t
! U) h* z8 C0 z- @# Z
微信图片_20231023235811.png

* [/ R+ ^  x% z/ h
蓝牙调试器
3 t; q: `! T4 z; d* {

0 h. B& f9 `! M& {0 w
# Y) K; N( }1 j+ S& W7 Q/ I& V; e& ~
这个蓝牙调试器是一个大佬编写的,我这里只是介绍一下使用方法。其他的详细内容,可以到大佬的原文查看提高开发效率-蓝牙调试器。
2 E& B9 J7 k# x# D  J& C3 I9 Q% e
; b2 O! E+ d" m" Z/ ?3 k" y
为什么推荐这个蓝牙调试器?个人觉得,它能够在众多蓝牙调试器中脱颖而出,是因为它支持用户自己设计GUI,提供了许多控件,比如常见的按钮,文本框,可编辑文本框,以及一些滑动条,遥杆和曲线图等。支持自由设置位置,大小,功能十分强大。更重要的是,大佬提供了程序文件,对于想快速上手蓝牙模块,用手机与蓝牙交互的小伙伴来说,十分友好。& j3 W0 ?, o8 F: B6 B0 }

3 m  g- z+ I1 k& {四、实战项目
5 z  p) j4 Y: ?5 }下面我们以手机控制两个LED亮灭,同时通过BH1750检测周围环境光照强度变化,返回到手机端显示,并且能够显示光强变化曲线。' L4 [5 g% F& n6 u$ Q# @7 b
1 [" r6 {7 k3 f
4.1 添加文件
( H' ^: o( z( L, x5 x+ n第一步,先将大佬的文件添加到工程中。大佬的工程中的初始化函数已经包含了串口的初始化,所以我们不需要再包含串口文件。0 ^+ \* s, P+ S0 y, [
) G1 |" I" i' M! Z
微信图片_20231023235815.png
3 q- ~+ g7 T; x8 @2 M! x
添加蓝牙文件
% S! n5 ~6 Q' ]. T

7 E' W7 `1 z1 j0 B
9 T4 q- T2 ~/ P- Y
除此之外还要讲BH1750相关文件添加进来,具体可见博主STM32外设系列BH1750篇,这里就不再做介绍。" W! w7 a7 h% B6 v; S
9 h. q' s' @) Y7 s. f- w
4.2 配置需要传递的参数5 m& V: x$ N* x( A/ q) s  L
根据项目要求,我们需要配置三个参数,分别用来控制两个LED亮灭,传输周围环境光照强度。首先在程序中定义好这三个变量。
2 t$ g8 F9 q- e( N9 x
  1. int gLed1Flag = 0;   // LED1亮灭控制标志位) v' t+ ?( ?4 m2 }- Z' L& R1 u9 F/ S
  2. int gLed2Flag = 0;   // LED2亮灭控制标志位# O+ Z3 i6 {& }2 i6 g
  3. float gLingt = 0;   // 周围环境光照强度
复制代码
. T6 u& c0 q; m- h
定义好这些变量之后,我们需要配置一下文件中的接收和发送数据。打开大佬的.h文件,可以看到里面定义了许多类型的发送和接收变量。这里的发送接收是针对单片机来说的,而不是手机。8 v( @8 o& p! ^2 }! h4 o
  1. #define TX_BOOL_NUM  0
    ! K! A7 v- f% P8 a7 r" w) U
  2. #define TX_BYTE_NUM  0* ]* m3 G$ h! G& s# H
  3. #define TX_SHORT_NUM 0
    ' f, F$ {' _2 [1 u+ ?! s
  4. #define TX_INT_NUM   0  v  U! i) B& A& P! m" w5 s
  5. #define TX_FLOAT_NUM 0. h' T! E& G% l# \

  6. / `- f* }( u3 I+ W3 u
  7. #define RX_BOOL_NUM  0
    ; e" g. |5 x1 }: {$ }4 c: `8 {
  8. #define RX_BYTE_NUM  0
    7 X9 M* r* ]" i. [
  9. #define RX_SHORT_NUM 03 M1 T9 J5 }, y  `" Z3 a4 l
  10. #define RX_INT_NUM   0
      x4 a3 b' m. A2 ]) T7 A
  11. #define RX_FLOAT_NUM 0
复制代码

9 R. p/ Q3 g  \9 `, y我们需要单片机发送一个周围环境的光照强度,数据类型为浮点型。需要接收两个LED亮灭控制变量,数据类型为int型。我们在对应的位置配置好对应的变量数量,如下5 i. Y% k$ x7 O1 p, B; q

7 |+ [( [. C- }& L: G' o. c' B! y
  1. #define TX_BOOL_NUM  01 g! d2 `) `+ o/ A* i- B  n) j
  2. #define TX_BYTE_NUM  0
    9 p6 g) [. a5 n) _6 z3 ^) u
  3. #define TX_SHORT_NUM 06 K6 o) _( u4 ^; c% q
  4. #define TX_INT_NUM   0( G- o- ]1 A3 z7 Q. O3 ]9 m! L
  5. #define TX_FLOAT_NUM 1$ B) ?9 u; S; s
  6. ) _; ~9 }& V+ R; i- x% T
  7. #define RX_BOOL_NUM  0
    / s+ v* o3 D3 H+ o1 u. H3 d' E
  8. #define RX_BYTE_NUM  0
    9 g2 S. u  I( [, G: B! ?6 a/ z
  9. #define RX_SHORT_NUM 0
    # U; J6 q2 `- v0 U$ z% y; k
  10. #define RX_INT_NUM   2
    ( j9 z1 J' k" B4 ]- d. w
  11. #define RX_FLOAT_NUM 0
复制代码
& [8 p0 c+ L3 k  c! x* G
4.3 获取返回值% C' U9 A0 o3 q1 E  t; a( b7 H) h8 H& Q) r
在使用手机APP控制LED亮灭时,单片机需要接收到手机发送来的数值。接收程序如下
* Y" r9 Y/ X7 J" J) j9 Z
  1. // 如果接收到APP端数据
    " l, m3 b. O( e
  2.         if(readValuePack(&rxpack))
    2 x5 u7 k. f  [" C6 G" r  T) d
  3.         {/ C$ B* n  Q3 I2 S3 g) j, T1 _; x
  4.             gLed1Flag = rxpack.integers[0];+ Y/ @$ |% }0 Y1 O
  5.             gLed2Flag = rxpack.integers[1];
    ! [5 e* N" N8 F8 U" e
  6.         }
复制代码
1 D5 ^# i& l6 A
具体哪个值对应哪个参数,这些需要在手机端配置,放在下面介绍。
; V7 ^3 I. o4 X2 A. q: F$ P
" }- G$ F' K& c+ i6 l0 R0 N4.4 发送光照强度
" G  W  \  d, u% d, o( M: ]9 k
单片机需要不断地向APP端发送周围环境光照强度数据,程序如下8 ]7 r" V- d: r# [% @4 G
  1. // 向APP发送周围环境光照强度
    . @/ _4 j2 s4 l8 |, l! b8 k
  2.     txpack.floats[0] = gLingt;
    $ M- }  V# E! \& V: t0 ^
  3.     sendValuePack(&txpack);
    1 x, l* T, m/ p. q
  4.     delay_ms(10);   // 防止发送过快
复制代码
' X' b) B* K! M8 _- n/ ?
需要注意的是,蓝牙发送数据时如果需要一次发送多个数据,一定要在两次发送之间加10ms延时,否则会造成发送失败。) B+ E1 g! O  n+ s
" G! L' b" g5 k# m6 n
, C* ]7 i; ]9 w' [& t* d8 G
4.5 控制程序2 J; J" Y" G# S" C( ^+ J. ~: x
包含两部分内容,一部分是通过BH1750获取周围环境光照强度,另一部分是LED亮灭控制函数。程序如下: ]( U# s& F# ^) n% v
  1. // LED亮灭控制: F" o% ?2 q( G& o
  2.         if (gLed1Flag == 1)
    / u7 z& I3 B8 B( c3 i  [6 s- [# K
  3.         {' H4 t  P' h6 W4 r: U5 T
  4.             Med_Led_StateCtrl(LED1,LED_ON);   // 点亮LED19 W- [0 W. L6 Y* x
  5.         }
    9 `! u; j# g! ?- Q
  6.         if (gLed2Flag == 1)6 B+ \/ H( ?2 }+ K
  7.         {
    & j% X; v% a' u
  8.             Med_Led_StateCtrl(LED2,LED_ON);   // 点亮LED2
    - R+ O: ]; b' g! z) Z0 b
  9.         }
    9 K6 R" ~' k& b/ L7 l& o% I
  10.         if (gLed1Flag == 0)9 I) O: O  P4 {" i# m4 n% I' }
  11.         {5 j* i* D' r1 B" c) \% s
  12.             Med_Led_StateCtrl(LED1,LED_OFF);   // 熄灭LED19 q8 j: h7 h1 R' Z3 [6 p
  13.         }
    6 M) L4 G1 V' |5 _
  14.         if (gLed2Flag == 0)
    & ~) n; [" I+ Q4 Q' ?
  15.         {) Z* L6 d- u6 ~
  16.             Med_Led_StateCtrl(LED2,LED_OFF);   // 熄灭LED2; M8 b1 Q. |: k7 s: |7 ^
  17.         }6 Z' j* c: j) k+ g
  18.         2 H* b1 V% f8 u0 Q
  19.         gLingt = Med_Bh1750_GetLightIntensity();   // 获取周围环境光照强度
    % `" S" ?7 }! o) p
  20. 4.6 手机端页面设计
复制代码
4 j: j' z. r# g& D$ |: a. m( B
4.6 手机端页面设计
, I$ [6 U+ ^6 P) Y根据项目要求,需要有两个LED开关,一个显示周围环境光照强度的文本框,还有一个波形显示框。6 {0 t$ `3 m" k. q( t# J

+ ?3 b: M7 Z% M3 t4.6.1 新建调试工程$ H4 P$ l4 G* c& G/ K
打开蓝牙调试助手,选择中间的“专业调试”,然后点击加号新建调试工程。
# A, y# K+ a2 V2 u9 R2 m8 b! W  ^" b8 H/ {6 }
微信图片_20231023235818.png

! E+ y6 |- |. }% E3 s
新建调试工程

& P6 d% F* F" e) K
, p3 M6 L$ q3 s. z; o+ V5 D$ p

0 D5 n# _5 {' U) `/ g4 r- K
4.6.2 设置通信变量
0 T( w; w' w( B  T& m) k
我们新建完调试工程后,需要先进行通信设置。实际就是将我们手机APP与单片机通信时需要的变量配置好。
8 W0 u+ N4 M& P* a$ w1 q5 b1 Z% \
; U& G9 Z8 g$ p0 {. U) y2 h  ~首先选中新建的调试工程,选择“通信设置”" n+ j9 W0 |' h2 M
  Z; q7 H! {; i, l
# Y  [% G! ?1 I3 y
微信图片_20231023235822.png

/ [8 L/ E& h# k% w! Q  j
通信设置
$ }& c6 p% w, e" S6 m9 N- |
/ A  H. z5 B0 [: z' [. x

3 `, w  Q0 u1 ?; ~8 V7 n
进入之后可以看到如下页面
3 W, _- L1 L5 p# b6 K0 E
' y0 r" E! U  O
微信图片_20231023235825.jpg

2 n/ c& B8 @5 u/ p
通信设置页面
  F  `; m. X( |4 s) |; d
+ ~* h" P" Z- J0 |6 e2 [

" H; a: S, G  y5 ]- `' G& J9 w
这里的发送接收,只针对手机APPA而言的。
& f; B' @; _6 N2 d: B  o; z3 X$ e) F1 p& z! ]1 B
我们需要新建一个接收变量和两个发送变量。接收变量为float型,发送变量为int型。这里的顺序对应我们单片机接收时,变量在接收数组中的位置。7 E, j( E# F5 S' E8 _4 H2 q$ O3 }
/ d! w7 H3 P/ J  ^
& B  F' D4 I2 `2 _9 z; M; _
微信图片_20231023235828.png
0 M2 G( ?# b: B1 M7 }
发送变量

% a  i: U  M/ F
微信图片_20231023235831.png
, |( [$ L8 s% R* k; I3 [; c: X
接收变量

% L* t( M+ X! Y8 o7 o' z/ b

( }' f4 R; g# x# J8 u+ [

$ T# z% F9 K6 \
设置完收发变量后还需要设置一下通信模式。点击最右边的通信模式。选择“仅操作控件时发送”即可。如下图. a# M- K# c% B* e2 I
/ B: h  b, y" Z  {( a7 O, J, f6 a
微信图片_20231023235834.png

/ W) N( R/ m& k3 N
通信模式设置

9 n, i5 L3 A3 Y- V, x
; g9 ~9 z  y  p( J$ q) o* }, }, ?* o

; j% I8 {3 k( {
至此,通信设置完成。( F9 U) ^7 W7 }7 I1 @/ d: K" @6 o

2 Y) l9 o! t' O4.6.3 编辑控件
1 W2 W# E9 [$ H2 `* u选中新建的调试工程,选择“编辑控件”,即可进入编辑页面。
% {* Q6 T2 a' L$ X8 q+ G- R5 Y
  t( R/ N- b$ q. i" y* i- z
微信图片_20231023235836.png
% i% c7 Z9 y- v( Z' o# f
编辑控件
# G: E1 A% ~* E- L" y0 h

# E4 A, Q" |& @- x) O- a. }# t1 r5 [6 J4 `" l3 o
4.6.4 添加LED控制开关
- w/ D8 c0 R) I2 x; ]8 l进入编辑控件页面后,点击加号,添加一个开关。添加时会弹出页面让我们设置开关的信息
6 b; T& m: I; B) E+ @/ d6 {( l9 x! X
微信图片_20231023235840.png

6 N" H, t) Z3 p: F) L* Z
添加开关

: K% J& N# g' H

0 U8 I  {, l% j: z' Y1 m% _3 p  K% l" l, i1 x. j4 X
第一栏是选择该变量是接收变量还是发送变量,第二栏是选择变量类型。最后一栏是选择关联的变量。关联的变量就是我们在通信设置中添加的变量。4 ^# Q: V4 Y6 {# n" h

$ L" A8 b* J/ M' p9 o4 X. P选择完成后需要设置开关参数,设置打开和关闭时对应的值
. E- C0 M/ m% a8 X. ^& x+ X- m4 @2 e" I( ^
微信图片_20231023235843.png

) D+ A9 O: Y1 h2 u4 S
设置参数

  N8 k: k; g$ n3 q

4 }: z0 \8 ^0 r# A/ D' F
; }/ K( f( D1 k* U! m) l6 _
4.6.5 添加光照强度显示控件$ G9 ^( {  M9 ?# n* v
光照强度显示控件我们选择文本,操作与添加LED开关类似,注意链接好我们添加的光照强度变量即可,这里就不再做详细介绍了。! e1 _, C" {7 x+ B9 ^0 W3 b
$ `5 @8 z; z' n3 @/ o, N2 L9 M
项目要求能够显示周围环境光照强度变化曲线。这里我们用Y-T一维曲线图来显示。添加之后链接我们添加的光照强度变量,设置好范围即可,这里不再展示。
' W1 c( H2 b3 F, k, S2 I$ [7 y! r6 b) |) @7 T& r$ i) K# l
五、成果展示
% L6 ~" o. M, h- T( g5 ]" ]( {% D首先用蓝牙调试器搜索我们的HC-05进行配对。配对完成后,在专业调试中找到我们新建的调试工程。点击右侧的开始按钮,选择我们的蓝牙,就可以开始操作啦。1 R! q" x' R! C6 s2 C

8 K/ ~5 L, x' a5 g, p- e5 D+ L
微信图片_20231023235846.jpg

, z) W1 ^8 L' I3 N& e/ q( m
成果展示

* I( W/ m# w. t7 J& q5 G
8 t$ @) N. T; `, L- P- \

; E' g' }7 P7 l* z+ t! D% ?
点击开关可以控制LED的亮灭。文本框显示当前周围环境光照强度。最下面显示当前周围环境光照强度变化曲线。博主最近手边没有烙铁,买来的BH1750没有焊接排针,所以没有连接。因此,显示的光照强度值为0。
9 k  w) Y' G4 D9 }$ T: z3 H1 b  E0 R# E

0 x, b1 a) D: W3 J. F& _转载自:二土电子7 W0 n* y; T* V' q8 z
如有侵权请联系删除
( ~% W& H0 K& `: O' v3 N8 @
" J! B# [. s4 o6 i
, n0 ?4 f7 T0 m7 p- v) I) `4 y
收藏 评论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 手机版