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

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

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

/ _: r4 \& S+ W% E4 A# F8 e
. Z8 Z4 K$ \. b& Z: H+ C+ I" L
二、使用方法
0 R6 d* f2 A: ~# K# L6 H1 q) d. Q2.1 接线
0 F  R6 \9 Z' B2 c
HC-05供电电压为3.6V~6V。通常使用5V供电。其余的RXD接TXD,TXD接RXD,CND接GND即可。
. k( Q! U1 j' Q$ R1 Y& T+ x7 ?
( B' J3 ?" G3 c1 E3 [+ x2.2 AT指令
( o5 q' H: |  n! c- EHC-05也可以使用AT指令进行配置。在配置之前,首先需要让模块进入配置模式。博主买的HC-05有一个小按钮。按住小按钮再给蓝牙模块上电,蓝牙模块进入配置模式,此时模块上自带的LED会慢速闪烁。进入配置模式后,就可以用AT指令来配置我们的HC-05了。配置时,用USB转TTL连接HC-05,用串口调试助手发送AT指令进行配置。需要注意的是,HC-05配置模式的波特率固定为38400,如果你给HC-05发送指令,没有收到回复,记得检查一下串口调试助手的波特率是否正确。下面列举一些配置时常用的AT指令; I/ G3 `7 F" G" L- G1 B* r8 R

3 c6 m1 S: R& x4 r  S& M1 W• AT 检查HC-05模块连接是否正常,HC-05收到后会回复“OK”: o9 C8 ?9 w" z! _- i% }% y6 W
• AT+NAME=名字 配置HC-05的名字,配置成功后会返回“OK”
7 w+ I! S$ y7 ~% [( S, i, e• AT+NAME? 询问HC-05的名字。发送后会收到“+NAME:"名字"”,换行加“OK”. R$ l7 {. J# t2 D- O7 E9 A
• AT+PSWD=密码 配置HC-05密码,配对时需要用到。配置成功后,会收到“OK”! h) q' j  p' z& p1 h1 {3 W" r
• AT+PSWD? 询问HC-05配对密码。发送后会收到“+PSWD:991102”,换行加“OK”/ r) V, I: Z7 @
• AT+UART=波特率,停止位,校验 设置HC-05的波特率,其中停止位0表示一位停止位,为1表示两位停止位。校验位为0表示无校验,为1表示奇校验,为2表示偶校验。比如设置115200的波特率,一位停止位,无校验。发送“AT+UART=115200,0,0”即可。配置成功后会返回“OK”* j( ^9 _; R4 C) K6 ^% R
• AT+UART? 询问HC-05波特率。发送后会收到“+UART:波特率,停止位,校验”,换行加“OK”
! H6 h$ x9 }- s" O" o

) r& o4 H- O. r4 [  h! A  c% _配置完成功后,断电重新上电,HC-05按照配置好的名字,配对密码和波特率开始工作。此时LED快闪。( d1 X2 N3 }! I0 R$ S
0 O  `! A7 O4 Q1 \
) ?$ b3 T: n5 V' R
三、蓝牙APP
" n7 Y( h+ U$ |2 @+ r
这里介绍一个超级好用的蓝牙APP——蓝牙调试器。大概长这个样子,大家可以在应用商店下载
3 u4 G9 i/ ~, A% X, ^2 r) ^. l- z
- Y8 a' {2 N9 h  y& W2 [7 _9 t% j
微信图片_20231023235811.png
# {* s+ ~2 P+ E' N
蓝牙调试器

6 h' C& i7 S9 Q

" A& {: a  m) C. P6 ~
$ t' y' D  Y1 X1 A, h( u" R8 J( T
这个蓝牙调试器是一个大佬编写的,我这里只是介绍一下使用方法。其他的详细内容,可以到大佬的原文查看提高开发效率-蓝牙调试器。" D* `% i. \7 V+ B3 p: S) d6 K

& K. v' R: x( j4 s5 }为什么推荐这个蓝牙调试器?个人觉得,它能够在众多蓝牙调试器中脱颖而出,是因为它支持用户自己设计GUI,提供了许多控件,比如常见的按钮,文本框,可编辑文本框,以及一些滑动条,遥杆和曲线图等。支持自由设置位置,大小,功能十分强大。更重要的是,大佬提供了程序文件,对于想快速上手蓝牙模块,用手机与蓝牙交互的小伙伴来说,十分友好。7 @3 `$ l) t$ J; F9 f: Q
$ f  \2 x2 s: d% v
四、实战项目
" X) B5 z% A9 x, b2 I8 T, p  {下面我们以手机控制两个LED亮灭,同时通过BH1750检测周围环境光照强度变化,返回到手机端显示,并且能够显示光强变化曲线。
- z' X2 ]0 m- K1 \" P. Z7 r- t* |- r# i( g; v
4.1 添加文件
; }2 b! P# a2 _; ?$ f第一步,先将大佬的文件添加到工程中。大佬的工程中的初始化函数已经包含了串口的初始化,所以我们不需要再包含串口文件。
, [- k4 ~& B+ H  S) P
( R9 h( i; n0 s
微信图片_20231023235815.png
" R! o: a+ k; {5 B3 o
添加蓝牙文件

7 _( F  N8 _* v# D: E) m' H  P) y

4 c, R5 ~! C9 u2 Q  M7 d3 D9 f" O0 X+ n
除此之外还要讲BH1750相关文件添加进来,具体可见博主STM32外设系列BH1750篇,这里就不再做介绍。3 f, X8 y& _! X$ W' K. d

% u4 u/ F: J3 s6 Q% w4.2 配置需要传递的参数
% K- l8 H% {+ U+ v根据项目要求,我们需要配置三个参数,分别用来控制两个LED亮灭,传输周围环境光照强度。首先在程序中定义好这三个变量。, e$ b) N3 R1 \5 c
  1. int gLed1Flag = 0;   // LED1亮灭控制标志位* K; p0 u, _8 q+ u- E- [/ `: M
  2. int gLed2Flag = 0;   // LED2亮灭控制标志位: M& C$ q: Y) ^- J
  3. float gLingt = 0;   // 周围环境光照强度
复制代码

7 u) Q( y) ~4 w- u! Q定义好这些变量之后,我们需要配置一下文件中的接收和发送数据。打开大佬的.h文件,可以看到里面定义了许多类型的发送和接收变量。这里的发送接收是针对单片机来说的,而不是手机。
& X; x" S! ~, z# ^
  1. #define TX_BOOL_NUM  0
    + _' b* r* v: M
  2. #define TX_BYTE_NUM  02 A! M1 h+ m9 C( U! i' a1 y+ V
  3. #define TX_SHORT_NUM 0
    . L" x8 J# B6 T5 U& `! v, U* ?) I  S
  4. #define TX_INT_NUM   0' }4 o3 U# p$ c3 L: ]
  5. #define TX_FLOAT_NUM 03 j4 U$ t) R5 b7 n- V
  6. : o4 \" ^! L0 I% q8 r1 E* R$ N
  7. #define RX_BOOL_NUM  0
    $ \. O0 I  E9 v- [. o
  8. #define RX_BYTE_NUM  0
    ! Y7 r$ X/ G: {9 t
  9. #define RX_SHORT_NUM 0  E& Z4 V1 a5 f" p
  10. #define RX_INT_NUM   0- W$ ^9 T  Q; q/ ~' I$ G' r
  11. #define RX_FLOAT_NUM 0
复制代码

. f0 h& K  m( i; S& H我们需要单片机发送一个周围环境的光照强度,数据类型为浮点型。需要接收两个LED亮灭控制变量,数据类型为int型。我们在对应的位置配置好对应的变量数量,如下
& _3 @! v& q" D( x$ M
, l2 }4 V- X! `- D
  1. #define TX_BOOL_NUM  0$ l+ b. e  B7 l5 k5 n
  2. #define TX_BYTE_NUM  09 o* F5 O7 f. V) F; o6 O1 ~6 Q
  3. #define TX_SHORT_NUM 0
    ! x" R9 c3 e, ]7 U* b1 V- Z% B3 ?% k
  4. #define TX_INT_NUM   0+ m3 }  r5 b7 w7 f
  5. #define TX_FLOAT_NUM 1
    % h* H6 y8 s5 B4 _* h1 i) Y; [
  6. + R3 z# \! z2 p3 `* N
  7. #define RX_BOOL_NUM  08 U# w  q- {, P& N4 w' @7 {5 L
  8. #define RX_BYTE_NUM  0
    ' z# |- b/ B7 ~# j2 j: n0 u  O
  9. #define RX_SHORT_NUM 0% T. x( G5 j% q/ B
  10. #define RX_INT_NUM   2$ k0 Z. h$ U3 E( L, r3 `8 ]) _0 Y
  11. #define RX_FLOAT_NUM 0
复制代码

/ [# g1 {7 Q! o1 u6 B4.3 获取返回值
6 r  [& t3 f3 o在使用手机APP控制LED亮灭时,单片机需要接收到手机发送来的数值。接收程序如下) e( b7 F( q5 c" m# [
  1. // 如果接收到APP端数据% h# C  H( \- z& U
  2.         if(readValuePack(&rxpack))( f* e3 @6 x' Z- p- ~3 b9 ]
  3.         {) P% C$ S0 O( C
  4.             gLed1Flag = rxpack.integers[0];: i" w- F. b+ R6 Y! U
  5.             gLed2Flag = rxpack.integers[1];8 {) _# P/ ]) E# `4 I2 A6 ^
  6.         }
复制代码
$ S3 g* G- H3 J: O9 T7 t1 |
具体哪个值对应哪个参数,这些需要在手机端配置,放在下面介绍。
6 P; ?7 h" {/ I, u7 [
2 f* \. c; X- v! w9 S* ~0 M0 e$ r4.4 发送光照强度
% e4 g% k7 q; S) u9 J1 Z
单片机需要不断地向APP端发送周围环境光照强度数据,程序如下  E, o9 O+ ?8 ~% e3 j
  1. // 向APP发送周围环境光照强度
    : b) F& ~5 R. p8 Q& G# x" ^: k
  2.     txpack.floats[0] = gLingt;: p9 g5 V3 k% D& y" p
  3.     sendValuePack(&txpack);
    5 {8 ^4 w. E. _6 U$ X/ {) q. R$ f5 G: E
  4.     delay_ms(10);   // 防止发送过快
复制代码
# E/ e# _; X1 n; i" n3 J
需要注意的是,蓝牙发送数据时如果需要一次发送多个数据,一定要在两次发送之间加10ms延时,否则会造成发送失败。) {  h* e) m1 O& o! B
+ v$ s5 u" y; e: f- [4 D" y
+ P2 h0 ~# i+ M% l  k' H- ?
4.5 控制程序
' e' B" [1 r2 b+ _5 Y3 g包含两部分内容,一部分是通过BH1750获取周围环境光照强度,另一部分是LED亮灭控制函数。程序如下- ]5 R9 X; v. |2 N4 a
  1. // LED亮灭控制8 s# \  X1 j1 U3 b6 _/ f1 A
  2.         if (gLed1Flag == 1)2 t7 V7 [3 ^. i! {
  3.         {/ v) u; [  F2 ]$ z  a- L) J/ ]1 ?! \
  4.             Med_Led_StateCtrl(LED1,LED_ON);   // 点亮LED1  G- L, }5 R$ K
  5.         }( f  ~' L# j; M' [2 c  O) Z# N
  6.         if (gLed2Flag == 1)1 {; d9 f* H! c% A" s) P
  7.         {" }: h. j, n( Q  J: g( L
  8.             Med_Led_StateCtrl(LED2,LED_ON);   // 点亮LED2
    * R+ ]' N7 Q5 a) I' B$ _
  9.         }( w6 U5 f' M6 M/ X$ d; y7 m
  10.         if (gLed1Flag == 0)
    * L( ^1 Q, d) \: j
  11.         {  a* g3 a1 l& I
  12.             Med_Led_StateCtrl(LED1,LED_OFF);   // 熄灭LED1
    " D$ a4 y$ |) x; T$ i
  13.         }
    4 ?5 e, Y* D& C+ X; d
  14.         if (gLed2Flag == 0)" g4 h0 |: U1 X( G# {+ t
  15.         {
    # b  {9 U1 n6 E* l
  16.             Med_Led_StateCtrl(LED2,LED_OFF);   // 熄灭LED2- \0 X& W7 |" g# m$ z# J
  17.         }8 J* H1 I3 a6 @8 j1 c4 d& |1 _0 f
  18.         
    7 E  ~- K6 S) O0 [  {  E, {
  19.         gLingt = Med_Bh1750_GetLightIntensity();   // 获取周围环境光照强度
    , i0 Q& ?; t  K5 k  {2 @8 R
  20. 4.6 手机端页面设计
复制代码

* c. l+ }, @) ?" r; @: j4.6 手机端页面设计
) o& V% i" G' c, F3 \* M根据项目要求,需要有两个LED开关,一个显示周围环境光照强度的文本框,还有一个波形显示框。+ r/ L; w5 ?* w: A
/ Q' c& N" L% S- ?% Y; k; s9 [. E3 A9 b, a
4.6.1 新建调试工程$ h! u% e. R# A- T" o
打开蓝牙调试助手,选择中间的“专业调试”,然后点击加号新建调试工程。# B1 W- q: x3 Z
" z4 R( M# U: e$ x9 q: M
微信图片_20231023235818.png
. T. l* F7 x5 ]4 P$ r8 v3 y) G" S
新建调试工程
# a3 }: W7 o. J( U$ L, s# X$ R# }

+ @. z& h# l  S- D
. _7 r; m% Z3 u# I; s
4.6.2 设置通信变量

" \1 }: |4 @" m3 f/ S4 T. v我们新建完调试工程后,需要先进行通信设置。实际就是将我们手机APP与单片机通信时需要的变量配置好。3 \7 @. T: ?: Y' R+ C

: l3 I" x8 C! @* w" i# u2 S& F首先选中新建的调试工程,选择“通信设置”
/ i, q8 r2 F0 \
2 K- Y# }9 V5 N' Y( o
% B5 {. @/ u0 |# v* c1 x
微信图片_20231023235822.png
+ }* D. N- @3 o
通信设置
' S/ i  M8 _) T5 ?$ O
; l) r9 Y, r+ E5 \/ X) o5 v, N
. f- h* \1 T) _1 c7 p0 n2 I
进入之后可以看到如下页面  f0 V! t  i+ T' v# a  @5 J" i
* {2 Q$ \' W3 Z. g
微信图片_20231023235825.jpg
9 {) ^2 e- c" y( V# |: u
通信设置页面

8 d; O+ J! T( T9 [

1 ~/ e3 i# g6 P- t8 \! ~- J
9 K- w) s6 u7 F) N6 d
这里的发送接收,只针对手机APPA而言的。
8 |) y) j8 O6 B/ Q% m1 Y" i
5 }, [% U$ W1 F# s* H6 T5 r我们需要新建一个接收变量和两个发送变量。接收变量为float型,发送变量为int型。这里的顺序对应我们单片机接收时,变量在接收数组中的位置。
: E" p" w9 ]7 k
! V% F2 p- c. N

( y* k) T3 M9 S  [1 O4 d/ F; k
微信图片_20231023235828.png
- _" F# }3 M, b& |% B* s
发送变量

8 v1 n4 L6 a* ]
微信图片_20231023235831.png

: r& H& T. f1 p
接收变量
: q9 l( U+ D3 g
( B4 q2 M$ Z% T8 |) }7 F/ S
- x3 m5 e. r' ]1 b6 z% u
设置完收发变量后还需要设置一下通信模式。点击最右边的通信模式。选择“仅操作控件时发送”即可。如下图
! U$ o# u/ Q9 n: e6 a& B. f: L' E$ ]& Z, j8 D% d$ B0 b0 [7 d# |) B3 E
微信图片_20231023235834.png
4 w& P% x) Q: S6 _  d- ]/ c, r1 P! c
通信模式设置
" c# [- L' C: P* e9 ~! R& D
( P5 ~) f0 p/ m" h( @

+ U2 z% z! j0 [; ?% `6 |
至此,通信设置完成。2 g1 C8 r% S& @" b1 }* S5 Y# I

( V4 p" @3 |* j4.6.3 编辑控件
' d# q/ P& Y! s# F; S! j选中新建的调试工程,选择“编辑控件”,即可进入编辑页面。+ m) v: p7 n. u' R
" g- a, N+ o* l& P* O1 C$ e
微信图片_20231023235836.png

  I  r" v7 k' e8 @4 _; k5 n
编辑控件
) z0 c8 k" A: E
8 F$ j5 j! ]' X- X/ c: H5 T9 D
- Z/ N) [9 c& c2 [. Q4 |
4.6.4 添加LED控制开关4 \! t' j) U( Y  L
进入编辑控件页面后,点击加号,添加一个开关。添加时会弹出页面让我们设置开关的信息. J) m. x. N" n/ \

6 Y  k# Y) R8 O% t
微信图片_20231023235840.png

' F- T6 ~0 n/ Y
添加开关

& s8 M( o8 W. V! J( \
& `6 f& ^8 A" d8 y* ]" v8 m

/ W0 h$ D1 G0 `) a+ W
第一栏是选择该变量是接收变量还是发送变量,第二栏是选择变量类型。最后一栏是选择关联的变量。关联的变量就是我们在通信设置中添加的变量。3 x5 D3 G; M$ a4 \

/ o6 R( V) L9 ]" A) w选择完成后需要设置开关参数,设置打开和关闭时对应的值
- j7 d9 t; ~( _5 Q& P
2 W1 f, i/ m7 {. |/ Z
微信图片_20231023235843.png

. V5 F  [9 Y1 \3 n  [1 n& w
设置参数

1 z6 p3 w, S$ j/ y2 b; p, L( a
9 Q' G, Z4 f& W: Z6 K

/ J+ A( O  o2 E
4.6.5 添加光照强度显示控件
% `) N3 C- l3 ?" i# }" e4 t光照强度显示控件我们选择文本,操作与添加LED开关类似,注意链接好我们添加的光照强度变量即可,这里就不再做详细介绍了。
# ?1 V9 A& v8 ?0 q2 F# J7 K. U

3 B* X. T, s; o0 B" q项目要求能够显示周围环境光照强度变化曲线。这里我们用Y-T一维曲线图来显示。添加之后链接我们添加的光照强度变量,设置好范围即可,这里不再展示。# H6 A1 Y" `& H
7 h( k/ ?2 ?) |; Z* a
五、成果展示
( R) u1 b* v  B1 b' G首先用蓝牙调试器搜索我们的HC-05进行配对。配对完成后,在专业调试中找到我们新建的调试工程。点击右侧的开始按钮,选择我们的蓝牙,就可以开始操作啦。' }9 K4 a8 M+ m2 q
& @; l/ i% f0 b& Z1 r
微信图片_20231023235846.jpg
7 t# `+ D2 m3 E1 |4 H
成果展示
0 c8 G0 ^: k+ O8 T
; ?  i7 o7 S, G( H' v% t+ }. h. V- f

0 s' ~/ L( r) _1 Y
点击开关可以控制LED的亮灭。文本框显示当前周围环境光照强度。最下面显示当前周围环境光照强度变化曲线。博主最近手边没有烙铁,买来的BH1750没有焊接排针,所以没有连接。因此,显示的光照强度值为0。
* u- O  q. j9 i; m8 V3 G8 C7 a6 a. E* c6 D7 _' t8 W! e
* l7 w5 C. ~, i' X+ a
转载自:二土电子6 x, s. G% d1 `6 n1 r. F8 w
如有侵权请联系删除
* u/ J7 }/ I0 z2 c4 j3 |5 A
+ [2 b6 e  z+ C4 J- i

. P: f0 L4 O  |3 k
收藏 评论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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版