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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:57
一、蓝牙简介
5 I$ o+ n" F0 ^, K0 d蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4~2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。我们这里介绍的是在嵌入式开发中常用的蓝牙模块——HC-05。7 ~2 m5 }# e1 ^7 D& T
' E% N6 @' Q5 @5 ^- v* v! n6 n
微信图片_20231023235738.png

" ]8 B1 B! Q: G* r: y
HC-05
5 V4 G  C7 f: b- t

+ o7 V% G! D( k/ X- H
二、使用方法/ ~4 S: K( N3 z' u' V9 ^2 H
2.1 接线

8 L; ~% R, @. C  u% \$ B1 \HC-05供电电压为3.6V~6V。通常使用5V供电。其余的RXD接TXD,TXD接RXD,CND接GND即可。' Y' g+ a( T/ B7 Z% y
3 B! t0 ?% w! F; [2 t+ T! R: ~" Z
2.2 AT指令
' _- R. a  Z+ F- M( lHC-05也可以使用AT指令进行配置。在配置之前,首先需要让模块进入配置模式。博主买的HC-05有一个小按钮。按住小按钮再给蓝牙模块上电,蓝牙模块进入配置模式,此时模块上自带的LED会慢速闪烁。进入配置模式后,就可以用AT指令来配置我们的HC-05了。配置时,用USB转TTL连接HC-05,用串口调试助手发送AT指令进行配置。需要注意的是,HC-05配置模式的波特率固定为38400,如果你给HC-05发送指令,没有收到回复,记得检查一下串口调试助手的波特率是否正确。下面列举一些配置时常用的AT指令( k5 \# G$ a( ]  ?' d- |

' G: n) {, V0 b  H• AT 检查HC-05模块连接是否正常,HC-05收到后会回复“OK”( v; n, q' n! J! Q9 _5 N
• AT+NAME=名字 配置HC-05的名字,配置成功后会返回“OK”9 g3 k/ Q8 \+ U5 E
• AT+NAME? 询问HC-05的名字。发送后会收到“+NAME:"名字"”,换行加“OK”+ e! ]: T, i: p0 B! S' Y: l
• AT+PSWD=密码 配置HC-05密码,配对时需要用到。配置成功后,会收到“OK”* N6 G6 G& R& S9 T6 Z3 @
• AT+PSWD? 询问HC-05配对密码。发送后会收到“+PSWD:991102”,换行加“OK”: ~# n+ F& }4 J) e6 s  B
• AT+UART=波特率,停止位,校验 设置HC-05的波特率,其中停止位0表示一位停止位,为1表示两位停止位。校验位为0表示无校验,为1表示奇校验,为2表示偶校验。比如设置115200的波特率,一位停止位,无校验。发送“AT+UART=115200,0,0”即可。配置成功后会返回“OK”5 i0 l. k. y2 V) z6 ?+ G- M
• AT+UART? 询问HC-05波特率。发送后会收到“+UART:波特率,停止位,校验”,换行加“OK”7 A6 }. i- X+ \0 Q6 V% Y

) C# P  o4 g/ e; s0 m/ L$ }! \6 m, P& u配置完成功后,断电重新上电,HC-05按照配置好的名字,配对密码和波特率开始工作。此时LED快闪。4 x4 m7 t8 Z; ^* M" y

" `( F1 V, s. B4 e) P7 Y0 Q
1 _& z0 E! W# }# h7 \1 m# N
三、蓝牙APP

' t+ s! D4 p5 k( S9 W' b2 }$ i6 ]这里介绍一个超级好用的蓝牙APP——蓝牙调试器。大概长这个样子,大家可以在应用商店下载. _) t  W% ]4 ]; o' ]7 c

( _2 t3 v" x  a% N" o
微信图片_20231023235811.png
  G1 n( k! f( G# L) }( i
蓝牙调试器
3 [; V  d& {' ]5 L

& {$ Q7 g2 Y9 ]5 ]  I$ H# x3 o* \; P9 K( E1 @
这个蓝牙调试器是一个大佬编写的,我这里只是介绍一下使用方法。其他的详细内容,可以到大佬的原文查看提高开发效率-蓝牙调试器。6 p4 L" w( F. W# N2 d
1 V$ b$ k2 {" Z+ u, ]" Q. l4 ]  ?
为什么推荐这个蓝牙调试器?个人觉得,它能够在众多蓝牙调试器中脱颖而出,是因为它支持用户自己设计GUI,提供了许多控件,比如常见的按钮,文本框,可编辑文本框,以及一些滑动条,遥杆和曲线图等。支持自由设置位置,大小,功能十分强大。更重要的是,大佬提供了程序文件,对于想快速上手蓝牙模块,用手机与蓝牙交互的小伙伴来说,十分友好。6 b' H& a. j9 K0 O: d! h

3 A( I; q, M3 W5 X3 H四、实战项目
" v4 V% E5 F/ I9 N- z, T下面我们以手机控制两个LED亮灭,同时通过BH1750检测周围环境光照强度变化,返回到手机端显示,并且能够显示光强变化曲线。! I# U. R- t3 s) A$ R

  v% i; I6 r  u  F8 a4.1 添加文件
5 G! k4 L) [# i& g- S& d$ o第一步,先将大佬的文件添加到工程中。大佬的工程中的初始化函数已经包含了串口的初始化,所以我们不需要再包含串口文件。
7 n! p& e4 o: m- E

3 f: k5 d" |9 R! P
微信图片_20231023235815.png
+ G, L% t# O" M" B
添加蓝牙文件

; w2 A3 g; Z6 R2 k7 [: f* b# {
# G8 S! I# E, g3 Q" g
, D2 {0 Q1 A$ a; n: z) ~
除此之外还要讲BH1750相关文件添加进来,具体可见博主STM32外设系列BH1750篇,这里就不再做介绍。
3 J) H5 R: x6 L
5 k0 y& K: b$ v  e* S4.2 配置需要传递的参数6 [7 h* j0 Z6 m  {+ F
根据项目要求,我们需要配置三个参数,分别用来控制两个LED亮灭,传输周围环境光照强度。首先在程序中定义好这三个变量。* g; m* w  K+ U* @& T- @% q3 Q
  1. int gLed1Flag = 0;   // LED1亮灭控制标志位: E% ?) U* V% y- U- }
  2. int gLed2Flag = 0;   // LED2亮灭控制标志位
    1 }* o7 S& ?& H8 N0 M1 E& ?
  3. float gLingt = 0;   // 周围环境光照强度
复制代码

. t$ Y8 z9 i% N! i7 k$ Z! J. r" j9 U定义好这些变量之后,我们需要配置一下文件中的接收和发送数据。打开大佬的.h文件,可以看到里面定义了许多类型的发送和接收变量。这里的发送接收是针对单片机来说的,而不是手机。
/ P4 X2 L7 y3 d$ B
  1. #define TX_BOOL_NUM  0, Y8 Z9 r5 n/ O/ ?; h; V) T
  2. #define TX_BYTE_NUM  0/ U8 E! c9 t, N
  3. #define TX_SHORT_NUM 0
    ' f/ {0 t1 S5 P  e/ ^
  4. #define TX_INT_NUM   0$ i# }: I, {3 r# z2 \7 i
  5. #define TX_FLOAT_NUM 0. h" T% X. S/ l" r/ A
  6. 0 M5 o3 O$ r1 h
  7. #define RX_BOOL_NUM  0
    : n# o! `+ M/ h; C, e/ _" U% ~: I
  8. #define RX_BYTE_NUM  0
    % }6 n8 o# I; H' c. T# B8 J
  9. #define RX_SHORT_NUM 0
    1 n5 Y) G+ A( ]. ~! ]7 }
  10. #define RX_INT_NUM   0
    5 F% t! q& n& P& i) B& @8 U4 q
  11. #define RX_FLOAT_NUM 0
复制代码

  e8 Z  _1 ~/ f5 \, R0 ]/ {我们需要单片机发送一个周围环境的光照强度,数据类型为浮点型。需要接收两个LED亮灭控制变量,数据类型为int型。我们在对应的位置配置好对应的变量数量,如下0 S2 F- B4 d) b
) z$ J4 j& b* Q) `) T
  1. #define TX_BOOL_NUM  0
    0 n6 a7 W/ T, H$ O4 z
  2. #define TX_BYTE_NUM  0
    - I# g7 h) n3 }1 [% v( g, a  q
  3. #define TX_SHORT_NUM 0
    , R8 _1 w% r3 x
  4. #define TX_INT_NUM   0  G$ X4 [# \# S: D3 x/ u
  5. #define TX_FLOAT_NUM 1; w/ e9 R' i& x9 l( y7 ^, H
  6. , R+ r$ f- O+ E/ d7 J1 X0 e, q
  7. #define RX_BOOL_NUM  0; k- A2 s' f; o2 Z* o9 U  j
  8. #define RX_BYTE_NUM  07 m1 N0 S, A+ G( T5 k6 @
  9. #define RX_SHORT_NUM 0
    $ ]: a/ L3 ]# w, g: X# L) e6 H
  10. #define RX_INT_NUM   2% n, K9 Y( p# ?2 b+ M$ G
  11. #define RX_FLOAT_NUM 0
复制代码
3 V+ _3 g8 T  W
4.3 获取返回值
0 X" Q  I, Z9 H& p# N, B! Y在使用手机APP控制LED亮灭时,单片机需要接收到手机发送来的数值。接收程序如下/ i- A$ c% Y: j4 _2 c" m
  1. // 如果接收到APP端数据
    8 A" p  ?+ v; A4 y. Y
  2.         if(readValuePack(&rxpack))/ U! Y1 s8 f! Q7 j5 n; z
  3.         {2 ^7 ?+ a% [2 G" t, E8 {
  4.             gLed1Flag = rxpack.integers[0];
    4 @  M- X4 y6 G& {* a
  5.             gLed2Flag = rxpack.integers[1];
    2 g+ z# ?- K  c1 p! W+ X
  6.         }
复制代码
, f5 n6 n! b) A2 {: ?- D
具体哪个值对应哪个参数,这些需要在手机端配置,放在下面介绍。  O! l8 v2 D. O5 `0 d8 M; K
3 p7 @2 k# e) Q! M
4.4 发送光照强度
) Z$ p  D2 P* V( G5 v3 z
单片机需要不断地向APP端发送周围环境光照强度数据,程序如下
& ?' B/ a* H+ Q0 \
  1. // 向APP发送周围环境光照强度: H6 n" @- C$ p1 k7 `
  2.     txpack.floats[0] = gLingt;4 E* b( g$ a. J
  3.     sendValuePack(&txpack);
    $ N: S" g- V# R: y, Z* b
  4.     delay_ms(10);   // 防止发送过快
复制代码

% Q- R9 z. E. N7 B1 V需要注意的是,蓝牙发送数据时如果需要一次发送多个数据,一定要在两次发送之间加10ms延时,否则会造成发送失败。
* U% |6 o1 p6 I
+ [2 H- Z. E- Y
7 q1 Y/ h. o0 n$ G0 ^) Z" M
4.5 控制程序# k+ u: G& x/ f
包含两部分内容,一部分是通过BH1750获取周围环境光照强度,另一部分是LED亮灭控制函数。程序如下
8 m& F. o2 S/ M. \% M9 u: w
  1. // LED亮灭控制1 H( p# t8 ^6 P% G
  2.         if (gLed1Flag == 1)2 O; O9 W6 N" q8 p, ]6 d
  3.         {
    7 `9 _- y& c; l2 e9 }/ [
  4.             Med_Led_StateCtrl(LED1,LED_ON);   // 点亮LED1+ T  B8 u, X$ g2 j5 q+ D. B3 \
  5.         }
    & G1 }5 K* o3 I! h$ o* R8 K* o9 {
  6.         if (gLed2Flag == 1)0 z" X& Q; D& Y8 l, c- l# k
  7.         {) \3 ~3 @/ j* T% Y, F2 i
  8.             Med_Led_StateCtrl(LED2,LED_ON);   // 点亮LED2
      X; k# o8 B+ ]7 z' j
  9.         }
    / ^# m2 k  c2 z- t! k) Z
  10.         if (gLed1Flag == 0)
    ) s' _9 d, _8 J6 P8 n2 b
  11.         {
    ! i- r* J+ {9 j
  12.             Med_Led_StateCtrl(LED1,LED_OFF);   // 熄灭LED1: w0 b5 {# ]+ E* w6 N; I
  13.         }
    5 g; t. a, k4 A8 I) Q+ W
  14.         if (gLed2Flag == 0)
      T6 x% Y" [! G9 ?9 Q& L- [( F
  15.         {
    7 z: X+ r6 n" T$ z$ L  c( ^
  16.             Med_Led_StateCtrl(LED2,LED_OFF);   // 熄灭LED2
    ; \: i5 E' v: ], H  w( M9 D
  17.         }
    / G* W4 {; r, U9 u. X* V
  18.         
    ' n( v  ^; Q. w0 a" U
  19.         gLingt = Med_Bh1750_GetLightIntensity();   // 获取周围环境光照强度  x6 I) l7 k/ C6 S7 O. G. E
  20. 4.6 手机端页面设计
复制代码

, m" n# M% |& m' h# z6 _! |9 K4.6 手机端页面设计/ T( K) l( f8 A% }  d4 D
根据项目要求,需要有两个LED开关,一个显示周围环境光照强度的文本框,还有一个波形显示框。) s/ f1 J* b3 ~

5 y! G+ J5 f- N  d0 b4.6.1 新建调试工程! g/ A8 R9 |- o
打开蓝牙调试助手,选择中间的“专业调试”,然后点击加号新建调试工程。7 |# P9 t. Q/ ?2 h  j& Q7 k; `8 [

7 [% C0 z' }7 C5 F
微信图片_20231023235818.png

9 n9 e5 Y$ [% B) g$ c# g
新建调试工程

2 t$ M' z+ x( h
, H  c! E. H: h/ W
, B+ K# {% K: C0 z+ D
4.6.2 设置通信变量
3 |  d: F* F) W7 V1 E. i8 }  ~" m
我们新建完调试工程后,需要先进行通信设置。实际就是将我们手机APP与单片机通信时需要的变量配置好。
0 b/ A$ X3 P  h  U$ q1 M
, f) G! ~. |& j# l6 A! h! t( |' X/ A首先选中新建的调试工程,选择“通信设置”6 b4 G) V" `  e' `3 g

% s/ F" K0 q; L

. }% o0 |1 K7 L
微信图片_20231023235822.png
& A/ q1 [$ O' p% O! V2 |
通信设置

# N# S0 M# u. H7 ?% d$ ]# K

; n& d! \! W3 q1 x) d! ~6 b+ A
  K2 ~- p. q6 C8 A- W- \/ S
进入之后可以看到如下页面' I+ }% ~5 M  a1 ?  y5 Z( N
) E) ~9 W0 d- z7 z
微信图片_20231023235825.jpg
; L7 g) J: C( g. L8 C
通信设置页面

- C! E2 b- d- ^# X
% B& N6 X% p8 m  f8 n0 @4 t

& {8 q* s3 g+ r: E% N% a" v1 R
这里的发送接收,只针对手机APPA而言的。
9 Q, D; ~! s; {" f9 k  d( i$ J. @# b# v0 W7 p% m1 ?  k
我们需要新建一个接收变量和两个发送变量。接收变量为float型,发送变量为int型。这里的顺序对应我们单片机接收时,变量在接收数组中的位置。. n( V1 w8 w  S) u* d# H
3 r# Z: N6 C$ P$ u
( r) t+ S+ S5 ?. n4 W: d% c
微信图片_20231023235828.png

) h! F$ W$ p4 z
发送变量
' t& a. q6 ?! A. w$ L+ W" Q
微信图片_20231023235831.png

3 v. r! [* e7 _* K+ `5 |8 G
接收变量
6 v) Q0 T8 y0 R( B& f) l+ ~

% I/ N+ F7 _& b/ ?4 e

2 t% N& q; A* h9 E6 W: J  K3 O
设置完收发变量后还需要设置一下通信模式。点击最右边的通信模式。选择“仅操作控件时发送”即可。如下图
% i. j7 c/ @) U' L2 d, n) l% o, |+ L0 U) ]& [7 G8 N7 F2 z1 C% e# E
微信图片_20231023235834.png

+ Y7 h( h8 t$ L( B, z
通信模式设置

$ v3 s8 k/ \4 x/ Z/ I( _3 d

" k5 z' w, z+ p# ^3 }2 t+ c0 F& y) |/ d7 {# _
至此,通信设置完成。
  p3 U  L" p1 y% w' _- t. K

  ?0 p+ i8 S3 t, E4.6.3 编辑控件
. V, e6 C. q' O( i1 c选中新建的调试工程,选择“编辑控件”,即可进入编辑页面。! ]8 K, l4 [' _2 W7 [/ }

! b4 a% R3 J$ f+ D. m# |
微信图片_20231023235836.png
7 g& C- t' C7 @  n1 H! @
编辑控件
/ n# h9 w; D( {8 T; s! z6 ?
- m' H$ x2 m% Z5 M0 T$ j9 g- I
2 D, r% H1 @! l$ c$ d. ^9 M
4.6.4 添加LED控制开关
4 r3 j. I% e5 ]/ f- B进入编辑控件页面后,点击加号,添加一个开关。添加时会弹出页面让我们设置开关的信息
1 c4 B* S$ a9 p! g# j6 s* g& I
1 P5 r/ [7 ?" R2 F' o
微信图片_20231023235840.png
- `; ?0 X' C8 L5 W  @7 P( X
添加开关
8 D# z/ X0 m( O' h

: Z2 M  V3 B3 ~+ K+ h9 H8 g
4 w; b0 J  t* E+ z9 i! n1 \! T
第一栏是选择该变量是接收变量还是发送变量,第二栏是选择变量类型。最后一栏是选择关联的变量。关联的变量就是我们在通信设置中添加的变量。
2 T8 L: l3 U4 s

2 F/ T6 ]( h) S9 R5 q选择完成后需要设置开关参数,设置打开和关闭时对应的值
+ {9 c' h8 `- [! X9 D9 n* m
8 X9 {) Q- u$ |' C3 K2 ?& ?
微信图片_20231023235843.png
$ d1 I& j$ @4 Q1 B- i' D
设置参数

9 b. H( D+ ]1 g  j3 `
+ N& l5 B* X4 y/ u3 C
% Q3 W7 X- R4 }2 w: i7 |
4.6.5 添加光照强度显示控件3 Q% |2 g* u4 X7 q
光照强度显示控件我们选择文本,操作与添加LED开关类似,注意链接好我们添加的光照强度变量即可,这里就不再做详细介绍了。
8 }+ N$ r' f6 ]; |- s$ d

- T$ I4 N+ c, r* m; v" `: f项目要求能够显示周围环境光照强度变化曲线。这里我们用Y-T一维曲线图来显示。添加之后链接我们添加的光照强度变量,设置好范围即可,这里不再展示。
0 k4 i( N! O7 k6 w3 S8 X2 j/ x( I/ w) W
五、成果展示
" t* J( }6 q' t. ?首先用蓝牙调试器搜索我们的HC-05进行配对。配对完成后,在专业调试中找到我们新建的调试工程。点击右侧的开始按钮,选择我们的蓝牙,就可以开始操作啦。
" _0 Y9 F& ~# o5 k
2 g% a" |! t6 `0 C; m1 _
微信图片_20231023235846.jpg
9 k' w. h. [( g7 i! ?3 M- ^% w
成果展示
* L% H+ F- s' K

7 e7 ~8 d9 M! {) ]7 X, {1 g1 z  }3 K6 F5 [
点击开关可以控制LED的亮灭。文本框显示当前周围环境光照强度。最下面显示当前周围环境光照强度变化曲线。博主最近手边没有烙铁,买来的BH1750没有焊接排针,所以没有连接。因此,显示的光照强度值为0。
6 _# x7 @2 x+ {" `* R( X/ \) R
5 p2 D% c; @# g# q6 j
3 U. Q4 j2 R% e1 n1 O
转载自:二土电子
4 Q0 U- B3 S) V如有侵权请联系删除
4 `0 M' [8 }& `/ o
. n+ `) h5 j) W3 B+ X0 o( J

$ Z/ i8 p- I' x6 O8 L9 Q
收藏 评论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 手机版