云计算百科
云计算领域专业知识百科平台

蓝牙模块HC-05、AT命令、手机通过蓝牙控制LED灯

目录

  • 蓝牙模块HC-05
  • 1. 硬件接线
  • 2. AT设置工作模式
  • 3. 基本配置 (所有AT命令后必须加上回车换行符 \\r\\n)
  • 4. AT命令的详细说明
  • 5. 手机通过蓝牙控制LED灯

蓝牙模块HC-05

在这里插入图片描述

1. 硬件接线

标号PIN引脚说明
1 START 状态引出引脚(未连接时输出低电平,连接时输出高电平)
2 RXE 接收端
3 TXE 发送端
4 GND 模块供电负极
5 VCC 模块供电正极
6 EN 使能端,需要进入命令模式时接3.3V

说明: START:用于指示模块是否处于连接状态。未连接时为低电平,连接后变为高电平。 RXE / TXE:标准串口通信接口,分别对应接收和发送数据。 EN:使能控制引脚,当需要进入“命令模式”时需拉高至 3.3V。

2. AT设置工作模式

1、自动连接模式,又称为透传模式。 2、AT 模式,用于通过串口发送 AT 命令配置模块参数 (如配对、名称、波特率等)。(蓝牙模块通过转串口模块接到电脑,串口调试助手发送 AT+ 指令为 AT模式)

进入 AT 模式的两种方法: 1、按住引脚或 EN 引脚拉高 (接入 3.3V),此时灯是慢闪,进入 AT 模式,波特率默认是 38400; 这个模式我们叫做原始模式,原始模式下一直处于 AT 命令模式状态。

2、HC-05 上电开机,红灯快闪,按住按键或 EN 引脚拉高 (接入 3.3V),HC-05 进入 AT 命令模式,默认波特率是 9600 (更常用); 这种模式下是正常模式,正常模式下只有按住按键或拉高 EN 引脚才处于 AT 命令状态。

注意:如果波特率没有设置正确,AT 命令是执行无效的。

3. 基本配置 (所有AT命令后必须加上回车换行符 \\r\\n)

所有 AT 命令后必须加上回车换行符 \\r\\n (即 ASCII 码 0x0D 0x0A),否则模块不会执行。

正常模式下是 9600,AT 模式波特率固定为 38400,8 位数据位,1 位停止位,无奇偶校验的通信方式。

  • 发送 AT + \\r\\n,回复 OK
  • 发送 AT+UART? + \\r\\n,回复 +UART9600,0,0
  • 发送 AT+UART=115200,0,0 + \\r\\n,将通信波特率设为 115200,8 数据位,1 停止位,无校验。 回复 OK

✅ 通过上述步骤波特率即配置成功。

  • 发送 AT+NAME=“XXXX”,修改蓝牙模块名称为 XXXX
  • 发送 AT+ROLE=0,蓝牙模式即为从机 (Slave),用于接收连接; 若设为 1 则为主机(Master)。
  • 发送 AT+CMODE=1,蓝牙连接模式为任意地址连接模式,也就是说该模块可以被任意蓝牙设备连接 (广播模式),适用于通用串口透传场景。
  • 发送 AT+PSWD=1234,蓝牙配对密码为 1234
  • 发送 AT+UART=9600,0,0 ,蓝牙通信串口波特率为 9600,停止位1位,无校验位

配置完成需要重启一次

4. AT命令的详细说明

  • AT+ROLE:设置主从模式
    • AT+ROLE?:查询当前主从状态
    • AT+ROLE=1:设置为主机(Master)
    • AT+ROLE=0:设置为从机(Slave)
    • AT+ROLE=2:设置为回环角色(Slave-Loop),即被动连接,接收远程蓝牙主设备数据并原样返回给远程蓝牙。
  • AT+RESET:HC-05 复位
  • AT+VERSION?:获取 HC-05 的软件版本号,只能获取,不能修改。
  • AT+ORGL:恢复出厂默认设置。当模块配置混乱时,使用此命令可恢复默认值。
  • AT+ADDR?:获取 HC-05 的蓝牙地址码,只能获取,不能修改。
  • AT+NAME?:获取 HC-05 的名字;
    • AT+NAME=BSP-06:修改模块名称为 BSP-06,具体名称可自行修改。
  • AT+CLASS?:设置或查询设备类型,尽量不要修改此参数。默认值是 1F00。
  • AT+IAC?:查询或设置查询访问码,默认是 9E8B33,建议不要修改。
  • AT+PSWD?:查询或设置配对密码
    • AT+PSWD=“0000”:设置配对密码为 “0000”,密码需用双引号包围,且为四位数字。
  • AT+UART:
    • AT+UART?:查询当前模块的波特率
    • AT+UART=XXXX,0,0:设置波特率(如 115200),参数格式为:波特率, 数据位, 停止位(默认 8N1)
  • AT+CMODE:
    • AT+CMODE?:查询当前连接模式
    • AT+CMODE=0,1,2:指定蓝牙地址连接模式
      • 0:默认连接模式(绑定地址连接)
      • 1:任意蓝牙地址连接模式(不受绑定地址限制)
      • 2:回环角色(Slave-Loop)
  • AT+BIND:
    • AT+BIND?:查询当前绑定地址
    • AT+BIND=NAP,UAP,LAP:绑定指定设备(NAP、UAP、LAP 用逗号分隔)
  • AT+RMADD:从蓝牙配对列表中删除所有已认证设备。
  • AT+STATE?:获取蓝牙模块当前工作状态。
  • AT+LINK=NAP,UAP,LAP:与远程蓝牙设备建立连接。
  • AT+DISC:断开当前连接。
  • AT+RNAME? NAP, UAP, LAP:获取远程蓝牙设备的名称。
  • AT+ADCN?:获取蓝牙配对列表中已认证设备的数量。
  • AT+MRAD?:获取最近使用过的蓝牙认证设备地址。
  • AT+INQM=设置查询模式
    • AT+INQM=1, 9, 48 1:带 RSSI(信号强度)指示 9:超过 9 个蓝牙设备响应时终止查询 48:设定超时时间为 48 * 1.28 = 61.44 秒 ✅ 该命令用于配置蓝牙扫描查询的行为参数。

5. 手机通过蓝牙控制LED灯

  • 蓝牙模块 AT 模式基础配置
    • 蓝牙连接 ch340 模块接线 TX、RX、VCC、GND、EN 五引脚
    • AT 命令配置波特率、蓝牙名称、从模式、配对密码
  • 蓝牙硬件连接stm32单片机 TX、RX、VCC、GND
  • 初始化蓝牙连接串口的时钟、引脚和外设配置
  • 串口接收中断服务函数实现数据的接收和发送 在这里插入图片描述 STM32F1xx手册第120页 在这里插入图片描述 USART2 负责接收蓝牙数据(手机 → 单片机) USART1 负责向电脑打印调试信息(单片机 → 电脑)

// USATR.h 头文件
#ifndef USART_H
#define USART_H
void My_Usart1_Init(void);
void My_Usart2_Init(void);

#endif

// USATR.c 源文件
// USATR.c 源文件
#include "stm32f10x.h"
#include "USART.h"
#include "stdio.h"

// 定义 USART2 串口函数
void My_Usart2_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;// 定义 GPIO 结构体
USART_InitTypeDef USART_InitStruct;// 定义 USART 结构体
NVIC_InitTypeDef NVIC_InitStruct;// 定义 NVIC 结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 优先级分组配置

// GPIOA2 TX 输出 数据发送
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);

// GPIOA3 RX 输入 数据接收
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);

// 串口 USART2 初始化
USART_InitStruct.USART_BaudRate = 9600;// 波特率
USART_InitStruct.USART_WordLength = USART_WordLength_8b; // 串口数据的字节长度
USART_InitStruct.USART_StopBits = USART_StopBits_1;// 停止位
USART_InitStruct.USART_Parity = USART_Parity_No;// 奇偶校验位
USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 发送 接收模式
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 硬件流控制
USART_Init(USART2, &USART_InitStruct);// 初始化 USART2 结构体
USART_Cmd(USART2, ENABLE);// 串口时钟使能
// 串行通信中断配置
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);// 接收数据寄存器不为空发生中断

// NVIC 初始化
NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;// 初始化串口中断线2
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}

// 定义 USART1 串口函数
void My_Usart1_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;// 定义 GPIO 结构体
USART_InitTypeDef USART_InitStruct;// 定义 USART 结构体
NVIC_InitTypeDef NVIC_InitStruct;// 定义 NVIC 结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 优先级分组配置

// GPIOA9 TX 输出 数据发送
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);

// GPIOA10 RX 输入 数据接收
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);

// 串口 USART1 初始化
USART_InitStruct.USART_BaudRate = 115200;// 波特率
USART_InitStruct.USART_WordLength = USART_WordLength_8b; // 串口数据的字节长度
USART_InitStruct.USART_StopBits = USART_StopBits_1;// 停止位
USART_InitStruct.USART_Parity = USART_Parity_No;// 奇偶校验位
USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 发送 接收模式
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 硬件流控制
USART_Init(USART1, &USART_InitStruct);// 初始化 USART1 结构体
USART_Cmd(USART1, ENABLE);// 串口时钟使能
// 串行通信中断配置
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 接收数据寄存器不为空发生中断

// NVIC 初始化
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;// 初始化串口中断线1
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}

// printf 重定向
int fputc(int ch, FILE *p){
USART_SendData(USART1, (u8)ch);
// 等待整个帧发送完成 (包括停止位)
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

return ch;
}

// 串口中断函数, 只要满足完整中断条件, 自动执行函数
void USART2_IRQHandler(void){
char str = 0;

// 判断是否发生中断
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){
str = USART_ReceiveData(USART2);// 串口数据接收
printf("receive date: %c \\r\\n", str);

if(str == '0'){
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
printf("LED IS ON \\r\\n");
}

if(str == '1'){
GPIO_SetBits(GPIOA, GPIO_Pin_1);
printf("LED IS OFF \\r\\n");
}

// 清除串口中断线的挂起标志位, 方便函数下次运行
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
}

// main.c
#include "stm32f10x.h"
#include "main.h"
#include "USART.h"
#include "LED.h"

int main()
{
My_Usart1_Init();
My_Usart2_Init();

LED_Init();
while(1)
{

}
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » 蓝牙模块HC-05、AT命令、手机通过蓝牙控制LED灯
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!