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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:57
一、蓝牙简介# I# _2 o) q: C4 C1 h; F- j" t. x3 w
蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4~2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。我们这里介绍的是在嵌入式开发中常用的蓝牙模块——HC-05。8 B# j7 E# x# v3 ]8 e# J. d( J+ n

9 T8 ^% v6 r3 j0 X% O
微信图片_20231023235738.png
" X  `1 h2 _+ Q) }/ }8 g
HC-05
9 C9 H2 S( [( L
9 ~- c% n3 U: g) l1 p5 }0 v, X
二、使用方法, r9 R& `( N5 Y
2.1 接线
/ _  h+ o$ [7 r
HC-05供电电压为3.6V~6V。通常使用5V供电。其余的RXD接TXD,TXD接RXD,CND接GND即可。, `4 v% I, _$ \

; F, i5 f# D* Q/ a8 N" ^" ^2.2 AT指令9 T0 c3 l* [6 k' ?* w( C% U
HC-05也可以使用AT指令进行配置。在配置之前,首先需要让模块进入配置模式。博主买的HC-05有一个小按钮。按住小按钮再给蓝牙模块上电,蓝牙模块进入配置模式,此时模块上自带的LED会慢速闪烁。进入配置模式后,就可以用AT指令来配置我们的HC-05了。配置时,用USB转TTL连接HC-05,用串口调试助手发送AT指令进行配置。需要注意的是,HC-05配置模式的波特率固定为38400,如果你给HC-05发送指令,没有收到回复,记得检查一下串口调试助手的波特率是否正确。下面列举一些配置时常用的AT指令
6 Y9 S) |* K% t/ K* S" Z* `* b5 a& A
" D1 j: @$ s5 y! |. @1 T1 e) S• AT 检查HC-05模块连接是否正常,HC-05收到后会回复“OK”
& N# O5 W! Z* E% Z0 ^# v• AT+NAME=名字 配置HC-05的名字,配置成功后会返回“OK”
2 Z$ C$ |, e7 @9 y• AT+NAME? 询问HC-05的名字。发送后会收到“+NAME:"名字"”,换行加“OK”9 X9 }! C9 C8 z: p0 Y. s
• AT+PSWD=密码 配置HC-05密码,配对时需要用到。配置成功后,会收到“OK”
4 s- J- [* V6 O. m0 y• AT+PSWD? 询问HC-05配对密码。发送后会收到“+PSWD:991102”,换行加“OK”
! v8 x8 B6 k( F( j" s• AT+UART=波特率,停止位,校验 设置HC-05的波特率,其中停止位0表示一位停止位,为1表示两位停止位。校验位为0表示无校验,为1表示奇校验,为2表示偶校验。比如设置115200的波特率,一位停止位,无校验。发送“AT+UART=115200,0,0”即可。配置成功后会返回“OK”
3 l5 o1 l/ \( m  |0 ]$ l9 A• AT+UART? 询问HC-05波特率。发送后会收到“+UART:波特率,停止位,校验”,换行加“OK”
) h9 m2 k, V5 ^( ?) q
6 M" J8 q3 D* G, j" p* z) f$ k
配置完成功后,断电重新上电,HC-05按照配置好的名字,配对密码和波特率开始工作。此时LED快闪。
+ m% h% [* j+ s& @" X9 C# ?" h, y; C* x5 C+ U8 H& e

( t% p) m0 {7 s6 K三、蓝牙APP
8 e: W6 P+ v0 [0 i' D" I
这里介绍一个超级好用的蓝牙APP——蓝牙调试器。大概长这个样子,大家可以在应用商店下载* h  h$ a( S% [8 `5 Y
9 G  ]0 ?( j; K, P3 h1 _& u
微信图片_20231023235811.png
* Y+ J  S( U9 b4 k
蓝牙调试器

5 p/ f6 O/ ]+ e& k! F* L* A

" u, ?4 w% b, s: ^" z6 f7 u  o7 `4 S" [7 }+ H7 N. C, c4 d  h* ]! x, Y
这个蓝牙调试器是一个大佬编写的,我这里只是介绍一下使用方法。其他的详细内容,可以到大佬的原文查看提高开发效率-蓝牙调试器。
9 Y+ j7 u! q  H0 U7 A( x2 a

2 E1 H/ W* x3 R& x为什么推荐这个蓝牙调试器?个人觉得,它能够在众多蓝牙调试器中脱颖而出,是因为它支持用户自己设计GUI,提供了许多控件,比如常见的按钮,文本框,可编辑文本框,以及一些滑动条,遥杆和曲线图等。支持自由设置位置,大小,功能十分强大。更重要的是,大佬提供了程序文件,对于想快速上手蓝牙模块,用手机与蓝牙交互的小伙伴来说,十分友好。; _  f" @1 Z8 y: `

; A4 _; E, j$ I四、实战项目1 \0 q! Y* s/ |% L) n! w
下面我们以手机控制两个LED亮灭,同时通过BH1750检测周围环境光照强度变化,返回到手机端显示,并且能够显示光强变化曲线。
. i1 W* S, L) _9 A) n( x5 F3 Y& c; W7 }8 x7 A) w) W
4.1 添加文件
8 J* ]- X* r$ G6 @0 q0 B% [( h第一步,先将大佬的文件添加到工程中。大佬的工程中的初始化函数已经包含了串口的初始化,所以我们不需要再包含串口文件。9 C- `% z4 C$ n* x* x9 l" @% @

! {& G3 V8 ], w9 _: f# x
微信图片_20231023235815.png

. `% L7 N) Z- y$ x4 h! u
添加蓝牙文件
, r4 h' r+ Z$ W; |9 x, U
* g$ p& z. v% J1 y% g) ~' A

0 s( y' _" e+ G0 \
除此之外还要讲BH1750相关文件添加进来,具体可见博主STM32外设系列BH1750篇,这里就不再做介绍。+ O- f) _' H8 _0 h% \' L1 y7 q7 p

% V. B6 Z" Z/ u4.2 配置需要传递的参数
' H' J7 }; d4 S9 m( S  T' t1 D根据项目要求,我们需要配置三个参数,分别用来控制两个LED亮灭,传输周围环境光照强度。首先在程序中定义好这三个变量。' B( V2 n- ?. B6 ~. r* k+ O  j
  1. int gLed1Flag = 0;   // LED1亮灭控制标志位/ \; q( t6 X9 b
  2. int gLed2Flag = 0;   // LED2亮灭控制标志位5 I$ ~8 Z/ a# T6 T) [
  3. float gLingt = 0;   // 周围环境光照强度
复制代码

  Y5 A7 U+ }1 u2 i; v  W定义好这些变量之后,我们需要配置一下文件中的接收和发送数据。打开大佬的.h文件,可以看到里面定义了许多类型的发送和接收变量。这里的发送接收是针对单片机来说的,而不是手机。$ Y/ U9 J7 D: m: z+ G3 u8 N( R
  1. #define TX_BOOL_NUM  03 _$ {0 I' R2 I9 H( u8 k3 f
  2. #define TX_BYTE_NUM  0: k7 N' i6 k! {9 \4 D3 ^
  3. #define TX_SHORT_NUM 08 n, h) @* G3 O( b/ C) e' f
  4. #define TX_INT_NUM   03 v" q" r$ {- I% {% }
  5. #define TX_FLOAT_NUM 0" ]) H' F. B- [( R! s

  6. - U& s' w; Z9 q( E/ n7 t
  7. #define RX_BOOL_NUM  04 j/ ]' ~, x- ?* Z0 s) V6 F# D
  8. #define RX_BYTE_NUM  0/ A* I, W( k3 m0 V7 h
  9. #define RX_SHORT_NUM 04 o8 ?! `( G* B, {8 P, D3 L
  10. #define RX_INT_NUM   0. O' o* R7 Z) c; H/ ~
  11. #define RX_FLOAT_NUM 0
复制代码

8 z" x4 `4 v" Q" g  ~7 `6 s我们需要单片机发送一个周围环境的光照强度,数据类型为浮点型。需要接收两个LED亮灭控制变量,数据类型为int型。我们在对应的位置配置好对应的变量数量,如下
( K! h6 g) B) u. |6 S$ c( t# E+ U' N$ _  y8 G) }
  1. #define TX_BOOL_NUM  0
    9 M3 R9 t1 g3 x# E' ?0 m1 J3 v
  2. #define TX_BYTE_NUM  02 W6 g5 n9 X8 J  b/ K
  3. #define TX_SHORT_NUM 0$ a# w8 }- }5 S! T! q  p
  4. #define TX_INT_NUM   0  ~! }# b1 q3 O- E8 e
  5. #define TX_FLOAT_NUM 1* F- T/ v* O# ^; h+ T% H; h3 P
  6.   r+ N: e/ H, q. f  b; W- J
  7. #define RX_BOOL_NUM  0" r& ~, Q1 F7 V" U. A8 }9 Q3 Z
  8. #define RX_BYTE_NUM  0
      n9 }6 f) K" g. ~) V5 F
  9. #define RX_SHORT_NUM 0/ e7 C8 C- {( Y' U9 }7 H0 O
  10. #define RX_INT_NUM   21 h6 s# v# n$ a7 p5 Y. O" |6 W6 q7 q
  11. #define RX_FLOAT_NUM 0
复制代码

" e  y2 f! b4 a3 _* b: h4.3 获取返回值4 f- m5 m4 I6 Z# j& w" h7 o
在使用手机APP控制LED亮灭时,单片机需要接收到手机发送来的数值。接收程序如下# e4 |( F1 E( k& v3 A
  1. // 如果接收到APP端数据. a* H$ \% p+ b& _
  2.         if(readValuePack(&rxpack))
    4 r0 i7 f, S, `, ?0 _. x: X! ?
  3.         {, J6 Q4 @: p( e5 ?+ I
  4.             gLed1Flag = rxpack.integers[0];/ i6 l6 W9 g/ F
  5.             gLed2Flag = rxpack.integers[1];
    7 y$ O8 d# N- ?. R- P
  6.         }
复制代码

/ ]/ j5 ?( F+ v/ H( P具体哪个值对应哪个参数,这些需要在手机端配置,放在下面介绍。0 V& |' _$ I& r9 E1 K# m6 {

! x0 ]2 S5 ]: [4 Y2 q, ], S5 O  M4.4 发送光照强度
0 j, e: y( D; i! @: A+ m0 P6 a
单片机需要不断地向APP端发送周围环境光照强度数据,程序如下& R9 Z( c6 {5 n: G/ h' W" w
  1. // 向APP发送周围环境光照强度
      A5 B! J! ]$ m
  2.     txpack.floats[0] = gLingt;% K% Q! W$ Z% |9 d% G7 c
  3.     sendValuePack(&txpack);: h8 Q/ v1 S6 N  Q  N' ?
  4.     delay_ms(10);   // 防止发送过快
复制代码
9 S" G5 _& o/ ~
需要注意的是,蓝牙发送数据时如果需要一次发送多个数据,一定要在两次发送之间加10ms延时,否则会造成发送失败。
1 c1 ?1 F4 X! }, E7 ?8 D5 o0 C/ C! P( f; d7 m! r. M
" K- P5 ^- p! t6 C8 i
4.5 控制程序: t7 b" K* q) d4 e
包含两部分内容,一部分是通过BH1750获取周围环境光照强度,另一部分是LED亮灭控制函数。程序如下
6 W' u  e, I) d% K6 d2 @
  1. // LED亮灭控制! @- s+ J8 S% v& b1 W; I
  2.         if (gLed1Flag == 1)
    8 ^  y+ o/ o, F* \
  3.         {
    6 E  T- q( E; y+ P( ~* G
  4.             Med_Led_StateCtrl(LED1,LED_ON);   // 点亮LED19 ^+ [  C3 |: _# i/ X. h
  5.         }& z* C5 T$ _& L4 y' ]) s
  6.         if (gLed2Flag == 1)
    4 V4 D& ~- O& v3 w* S3 y0 y
  7.         {
    5 |9 Q1 [( s9 G1 J2 I
  8.             Med_Led_StateCtrl(LED2,LED_ON);   // 点亮LED2
    8 P; C$ f% u7 y6 U2 m6 h
  9.         }  S3 t* M) z& a0 _4 }
  10.         if (gLed1Flag == 0)) L! w% X8 t- c  ]8 x- S
  11.         {
    5 N. p7 }+ K/ c3 O
  12.             Med_Led_StateCtrl(LED1,LED_OFF);   // 熄灭LED1
    0 h( N) n# I3 O- u& T1 p# a' ^
  13.         }" `$ E3 u5 m8 T* {
  14.         if (gLed2Flag == 0)$ q7 k9 g; Q1 t
  15.         {
    9 n7 i1 t; h, s! z/ l; |
  16.             Med_Led_StateCtrl(LED2,LED_OFF);   // 熄灭LED2# j! Z0 R9 N% s+ O* U" ]9 r
  17.         }& g( P" r/ X5 d' \* c* x. ?. O: G. ?
  18.         
    8 P; h4 t. G7 i4 G$ F
  19.         gLingt = Med_Bh1750_GetLightIntensity();   // 获取周围环境光照强度
    & T; r# |- Y+ X6 O! M
  20. 4.6 手机端页面设计
复制代码

& j* Z7 v$ z6 h4 V+ e4.6 手机端页面设计4 ~5 t( i/ h: f& J, v
根据项目要求,需要有两个LED开关,一个显示周围环境光照强度的文本框,还有一个波形显示框。
$ B" E8 `& Y8 |9 m8 u! ^; R
3 J& b1 A* p- Y6 m9 T. k8 `1 X" U9 b8 H
4.6.1 新建调试工程
, s; _, r" q* y5 z. {6 [# s& A打开蓝牙调试助手,选择中间的“专业调试”,然后点击加号新建调试工程。
+ ^  q* }: e1 F  t/ h! ~1 u% U" i' a
微信图片_20231023235818.png
7 ^( o2 `- {8 ^2 w+ l5 p
新建调试工程
% i) {, }' ]; l+ b+ z$ T& Q6 B0 N- m

3 K1 d0 K# @: Y2 X$ B  S* `7 y+ m, L& l+ l2 r
4.6.2 设置通信变量
- C, x7 u% p0 T8 P# h) p: X" q0 p" }
我们新建完调试工程后,需要先进行通信设置。实际就是将我们手机APP与单片机通信时需要的变量配置好。+ V' X. G( s+ h$ G5 b- D
) w* @, P' \3 r% C
首先选中新建的调试工程,选择“通信设置”
* ~$ T  O) U) }5 f1 u& q, d- G# K
1 v) e8 Q- y7 \! {/ S3 R
微信图片_20231023235822.png
  d, P- u) o4 H
通信设置
# y% g5 A" ~- a* J% i2 h3 r1 E
; S. C, N' _& u, v. U) P9 X/ x# b! O" y
0 O1 s( J% J; u4 r. x. l) C
进入之后可以看到如下页面
3 V1 X# Z% S$ W% s+ b: R5 h+ _% l; `2 \6 j
微信图片_20231023235825.jpg

4 v: l5 Z; L; y" y
通信设置页面
* T1 @6 t& ?" Q( X9 e; _3 o
* D0 p# [( B7 W+ n- y
6 L' |# Q1 P( T3 X6 [: j& m
这里的发送接收,只针对手机APPA而言的。3 i" A6 D1 @1 I2 ~4 w2 }

) y- y0 X# ]$ |; p" }我们需要新建一个接收变量和两个发送变量。接收变量为float型,发送变量为int型。这里的顺序对应我们单片机接收时,变量在接收数组中的位置。5 P' `/ k4 d1 T, F
( f0 w+ L6 }" x7 z

' U6 z# A' Q2 i8 l& x
微信图片_20231023235828.png
7 x, u" e4 t% B$ ]
发送变量
: S( z* ?5 f9 K" x
微信图片_20231023235831.png

% |, G7 b) |) R9 I- R+ X
接收变量
) ^+ `4 W; E. L- }9 m' E

0 W! f2 g) h) S  N

, V' t. I$ y$ p) V: `5 n# {
设置完收发变量后还需要设置一下通信模式。点击最右边的通信模式。选择“仅操作控件时发送”即可。如下图
* D0 O) c& z1 C" i
& L0 H9 d& ]% z- z+ t: u, i& f
微信图片_20231023235834.png

( D, B" i0 T8 r9 N% n7 k; d
通信模式设置
4 M( ^1 \* F) \& w9 L

- H& {6 S9 Z9 U8 Z3 A
% e. }% K' U. t
至此,通信设置完成。+ ~5 {" x- N! X6 G9 ?! M
4 ^- i. u' j/ V, ~) t
4.6.3 编辑控件( @' S8 H: z6 ~5 o0 P6 [" o
选中新建的调试工程,选择“编辑控件”,即可进入编辑页面。
) @) T) e6 j2 ]  X& P: @- R! t7 f9 g9 P# x( |
微信图片_20231023235836.png

7 d" B+ s9 K2 [2 O" ^) j
编辑控件

& [" E+ i' Q$ o3 J

- k! ?- J+ t/ Y& [' I7 L- @0 M+ D" j% Q; V! ?" f3 o
4.6.4 添加LED控制开关* |/ G- @& a7 H2 i( B- D0 [
进入编辑控件页面后,点击加号,添加一个开关。添加时会弹出页面让我们设置开关的信息, I- ^" u3 V$ c0 J# Y% x# x

; g) p' {/ [: L* N: w
微信图片_20231023235840.png
( O0 [) }# j5 C$ ]# b9 o+ j* }
添加开关

: n+ Z$ u% ?7 c+ S5 G
. u( R  x9 m6 V

$ Z$ t1 z5 l2 |- W6 N
第一栏是选择该变量是接收变量还是发送变量,第二栏是选择变量类型。最后一栏是选择关联的变量。关联的变量就是我们在通信设置中添加的变量。, s$ {; _& A1 T/ v
/ P, `/ d) p8 ]+ u* T+ c) E
选择完成后需要设置开关参数,设置打开和关闭时对应的值% S6 D6 b& r# h1 V
2 h1 C9 Q( E& K0 U" |4 R" S- \& F
微信图片_20231023235843.png
& u7 k* a, B: }0 v
设置参数

: d# f8 ^  Z( P. W6 e

( e( }$ I$ g+ |/ K  R) s6 g& h% Y6 |5 m  G( N4 f
4.6.5 添加光照强度显示控件
; O* @$ j# A4 s( m) \2 h& V+ m0 V8 x光照强度显示控件我们选择文本,操作与添加LED开关类似,注意链接好我们添加的光照强度变量即可,这里就不再做详细介绍了。& _, {! d: N) v( H" x$ }: M$ j5 t0 P; t
2 S" j1 i" W+ V7 K& R
项目要求能够显示周围环境光照强度变化曲线。这里我们用Y-T一维曲线图来显示。添加之后链接我们添加的光照强度变量,设置好范围即可,这里不再展示。
" g! c( v. `! P" W
; z' k% g/ \( |. Y, W: ?/ s' @五、成果展示
8 C/ O  F/ k7 }1 }8 ^首先用蓝牙调试器搜索我们的HC-05进行配对。配对完成后,在专业调试中找到我们新建的调试工程。点击右侧的开始按钮,选择我们的蓝牙,就可以开始操作啦。9 W* i8 A: O! l1 F4 z& n, `4 C

, W  Y8 f4 O8 ?0 q
微信图片_20231023235846.jpg

/ ^9 G; Z3 M7 C2 F8 L! S
成果展示

2 W# V1 \; o: z3 i
. [. M0 x# f: V6 J0 y

6 u& M* \) k3 J, v) _% w- H$ S! p
点击开关可以控制LED的亮灭。文本框显示当前周围环境光照强度。最下面显示当前周围环境光照强度变化曲线。博主最近手边没有烙铁,买来的BH1750没有焊接排针,所以没有连接。因此,显示的光照强度值为0。" o) z- A* s+ O% U2 R

7 r; P2 a# o( }+ N

; I$ q4 e9 y# |$ y- L2 v( Q( N转载自:二土电子
8 V% ^: V7 [, c如有侵权请联系删除5 }% L+ K- P$ `: F# E8 l2 ~
. ^7 k; L8 Y( ]9 Q% c' \) d
5 H* s  F1 H% R4 l, R" f+ {
赞 收藏 评论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 手机版