(第三次培训)基于stm32f103的HC-05蓝牙模块控制舵机及led灯的亮度

该文介绍了如何使用STM32F103微控制器通过HC-05蓝牙模块来控制舵机和调节LED灯亮度。主要步骤包括选择蓝牙模块、配置串口通信、设置定时器和PWM、编写蓝牙函数以及使用手机蓝牙调试器进行测试。文中详细讲解了单片机蓝牙通讯的基本原理和配置过程。
摘要由CSDN通过智能技术生成

基于stm32f103令HC-05蓝牙模块控制舵机及led灯的亮度

1. 基本介绍

单片机蓝牙通讯的原理是通过蓝牙模块实现无线数据传输。以下是一般的单片机蓝牙通讯原理:

选择合适的蓝牙模块:蓝牙模块通常是一种带有蓝牙通讯功能的芯片,它可以接收和发送与蓝牙标准兼容的无线信号。在选择蓝牙模块时,需要考虑通讯距离、功耗、通讯速率等参数。

串口通信:蓝牙模块通常与单片机通过串口进行通信,实现数据的收发。通常情况下,蓝牙模块的TX(发送)引脚连接到单片机的RX(接收)引脚,蓝牙模块的RX(接收)引脚连接到单片机的TX(发送)引脚。通过串口通信,单片机可以向蓝牙模块发送指令和数据,同时从蓝牙模块接收数据。

配置蓝牙模块:在单片机中,需要按照蓝牙模块的规格和文档,通过串口发送适当的指令来配置蓝牙模块的参数,例如波特率、工作模式、配对码等。

通信协议:单片机与蓝牙模块之间需要定义一种通信协议,以确保数据的正确传输和解析。通常情况下,可以定义一个简单的协议,例如先发送固定长度的数据帧头,然后发送实际的数据,最后发送一个校验和。蓝牙模块在接收数据时,根据协议进行解析和处理。

数据传输:在单片机中,可以通过串口的发送和接收函数,将数据发送到蓝牙模块或从蓝牙模块接收数据。通过发送和接收数据,实现与其他蓝牙设备的数据交换。

软件开发:通过在单片机上编写适当的软件代码,可以实现蓝牙通讯的功能。根据单片机的类型和编程语言,可以使用相应的串口通信函数或库函数来实现与蓝牙模块的通信。

总的来说,单片机蓝牙通讯的原理是通过串口通信,利用蓝牙模块进行无线数据传输。单片机向蓝牙模块发送数据或指令,蓝牙模块接收并解析数据,然后将其发送到其他蓝牙设备,或者通过蓝牙接收其他蓝牙设备发送的数据。这样,就实现了单片机与其他蓝牙设备之间的无线通信。
以下是利用uart串口通信令HC-05蓝牙模块控制舵机及led灯的亮度的简单配置和程序

2. 基础配置

打开cubamx,因为需要控制led和舵机,我们需要设置两个定时器,控制两个舵机,可以给定时器设置两个通道
定时器和PWM通道设置非常简单,还有时钟树选择最大的72MHZ,定时器1给led使用,通道一设置成PWMgeneration ch,psc设置为72-1,preload设置为2000-1,同理定时器2,但preload需设置成20000-1,设置两个pwm通道(一个舵机一个通道)
还需要蓝牙控制,设置串口usart1,异步通信,中断优先级为0,定时器与串口,配置引脚如下。
生成工程定时器串口

3.配置bluetooth函数

在工程目录下新建一个文件夹bluetooth,存放bluetooth的c和h文件
在工程里新加空白文本,保存后选择bluetooth下的路径,分别有建c和.h文件
在这里插入图片描述
右键project中的子文件在manage project items里添加bluetooth及其c和h文件
在这里插入图片描述
最后点击魔术棒添加文件路径即可
接下来是写bluetooth的函数了
bluetooth.c

#include "bluetooth.h"

uint8_t USART1_RX_BUFF[USART1_REC_LENGTH];//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART1_RX_ST=0;//接收状态标记//bit15:接收完成标志,bit14~0:接收到的有效字节数目
uint8_t USART1_Data;//当前串口中断接收的1个字节数据的缓存

void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)//串口中断回调函数
{
    if(huart ==&huart1)
    {
        if((USART1_RX_ST&0x8000)==0)//接收未完成
        {
            if(USART1_Data==0x5A)//接收到了0x5A
            {
                 USART1_RX_ST|=0x8000;   //接收完成了,将USART1_RX_STA中的bit15(15位)置1
            }
            else
            {
                   USART1_RX_BUFF[USART1_RX_ST&0X7FFF]=USART1_Data; //将收到的数据放入数组,
                   USART1_RX_ST++;  //数据长度计数加1
                   if(USART1_RX_ST>(USART1_REC_LENGTH-1))USART1_RX_ST=0;//接收数据错误,重新开始接收

            }
        }
        HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_Data,1); //因为每执行完一次中断回调函数会将接收中断功能关闭,所以最后需要再开启接收中断


    }
}

bluetooth.h

#ifndef __BLUETOOTH_H__
#define __BLUETOOTH_H__

#include "main.h" 

extern UART_HandleTypeDef huart1;//声明USART2的HAL库结构体

#define USART1_REC_LENGTH  20//定义USART2最大接收字节数

extern uint8_t  USART1_RX_BUFF[USART1_REC_LENGTH];//接收缓冲,最大USART_REC_LEN个字节.末字节为校验和
extern uint16_t USART1_RX_ST;//接收状态标记
extern uint8_t USART1_Data;//当前串口中断接收的1个字节数据的缓存


void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart);//串口中断回调函数声明

#endif 

4.配置主程序

回到mian.c,在main函数之前begin0中定义变量

int pwmval,servo1,servo2;

main函数中代码如下

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);   //开启TIM1通道1的PWM
	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);   //开启TIM2通道1的PWM
	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);   //开启TIM2通道1的PWM
	HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_Data,1); //开启串口1的接收中断
	__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,1500);//初始化舵机角度90度
	__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,1500);//初始化舵机角度90度
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  if(USART1_RX_ST&0x8000)              //判断中断接收标志位(蓝牙模块使用USART1)
		{
		 if((USART1_RX_ST&0x7FFF) ==6 	//判断接收数量6个                    
				&& USART1_RX_BUFF[0]==0xA5 	//判断接收第1个数据是不是包头0xA5
				&& USART1_RX_BUFF[5]==(USART1_RX_BUFF[1]+(USART1_RX_BUFF[2])+(USART1_RX_BUFF[3])+(USART1_RX_BUFF[4]))%0x100)	//判断接收校验码是不是原数据之和的低8位

		{
			pwmval=2000-5*USART1_RX_BUFF[2];
			servo1=500+20*USART1_RX_BUFF[3];
			servo2=500+20*USART1_RX_BUFF[4];
			
			if(USART1_RX_BUFF[1]==1)//判断调节led开关是否打开
			__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwmval);//开关打开,可调节led亮度
			__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,servo1);//调节舵机角度
			__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,servo2);//调节舵机角度
//			 switch(USART1_RX_BUF[?])      
//			 {
//				 case(0x01): 
//				 case(0x02):  
//				 case(0x03):
//				 case(0x04):
//				 case(0x00):
//				 default:break;

//			 }留着以后做其他用
		 }
			
		 
		 USART1_RX_ST=0;//标志位清0,准备下次接收
		 
		}
    /* USER CODE END WHILE */
	
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

5.手机蓝牙调试器的使用

在这里插入图片描述
打开调试器,连接HC-05后进入专业调试
添加后退出,进入编辑控件,添加如下3个控键
在这里插入图片描述

添加控件时会有如下的选项选择
设置完成后退出即可,进入运行模式,可对舵机led进行控制。
在这里插入图片描述
完成,pefect!
个人笔记,没有技术含量,用来训练写博客

测试视频

### 回答1: 要使用STM32 HAL库实现手机蓝牙点功能,首先需要将蓝牙模块STM32微控制器相连接。可以通过UART串口通信方式将蓝牙模块STM32相连。 接下来,需要使用STM32 HAL库中提供的蓝牙通信函数来实现与手机之间的蓝牙通信。通过蓝牙协议栈可以实现手机与STM32之间的数据交互。 在STM32的应用程序中,需要配置蓝牙模块的相应参数,例如蓝牙模块的波特率以及通信模式等。可以使用HAL库中提供的函数来配置蓝牙模块。 当手机发送控制指令给STM32时,STM32通过蓝牙模块接收指令。接收到指令后,STM32根据指令来控制LED的状态。可以使用HAL库中提供的GPIO控制函数来控制LED的点亮与熄灭。 在STM32的中断服务程序中,需要编写相应的代码来解析手机发送的指令。需要根据指令来判断是要点亮LED还是熄灭LED。在收到指令后,再通过GPIO控制函数来控制LED的状态。 最后,通过蓝牙模块STM32的控制结果反馈给手机,手机可以通过接收到的数据来判断LED是否成功点亮或熄灭。 总之,通过STM32 HAL库的蓝牙功能以及GPIO控制函数,可以实现手机蓝牙点的功能。具体的实现步骤包括配置蓝牙模块、接收解析手机指令、控制LED状态以及反馈控制结果给手机等。 ### 回答2: 要使用STM32 HAL库来控制手机蓝牙点,首先需要确保你的STM32芯片支持蓝牙功能。在开始之前,确保你已经安装好了HAL库和相关的开发环境。 接下来,你需要创建一个HAL工程,并添加蓝牙相关的库。在主函数中,初始化蓝牙模块,并设置相应的参数。你可以使用HAL库提供的函数来初始化并配置蓝牙。 为了点亮手机上的LED,你需要通过蓝牙连接手机,并发送一个特定的命令给手机。你可以在HAL库中使用蓝牙通信函数,与手机进行数据通信。 首先,通过蓝牙进行设备搜索,找到你的手机并连接到它。一旦连接成功,你可以使用HAL库提供的函数来发送一个命令给手机,以点亮手机上的LED。例如,你可以发送一个特定的字符串“LED ON”给手机,告诉它要点亮LED。 手机接收到命令后,你需要在手机端编写一个蓝牙应用程序来接收并处理这个命令。当手机接收到“LED ON”这个命令后,它就会执行相应的操作来点亮LED。 总体来说,使用STM32 HAL库来控制手机蓝牙点的过程分为两部分:在STM32端初始化并配置蓝牙,通过蓝牙与手机进行数据通信;然后在手机端编写一个应用程序来接收和处理来自STM32的命令,从而控制手机上的LED。 ### 回答3: 要实现手机蓝牙点的功能,可以使用STM32 HAL库来控制蓝牙模块LED。首先需要在STM32开发环境中导入HAL库,并配置蓝牙模块LED的硬件相关参数。 在代码中,首先需要进行蓝牙模块的初始化设置。通过HAL库提供的函数,可以配置蓝牙模块为主模式或从模式,并设置蓝牙名称和其他相关参数。在初始化之后,可以通过HAL库提供的蓝牙发送函数,与手机进行通信。 然后,需要配置LED的硬件相关参数。使用HAL库提供的GPIO初始化函数,将LED连接到特定引脚上,并设置引脚的模式和状态。 接下来,在蓝牙通信的代码中,可以设置一个特定的指令,用于控制LED的开关状态。当手机收到这个指令后,通过蓝牙模块发送给STM32控制器。 在STM32控制器的代码中,通过接收到的指令来控制LED的开关状态。使用HAL库提供的GPIO输出函数,可以将引脚设置为高电平或低电平,从而点亮或关闭LED。 最后,需要在主函数中进行一些初始化操作和循环检测蓝牙接收情况。通过HAL库提供的蓝牙接收函数,可以获取手机发送的指令。根据不同的指令,通过调用LED控制函数,实现点或熄灭。 总之,通过STM32 HAL库,我们可以实现手机蓝牙点的功能。使用蓝牙模块与手机通信,通过控制LED的开关状态,实现点或熄灭的效果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值