当前位置: 首页 > news >正文

【STM32单片机_(HAL库)】6-6-2【串口通信UART、USART】【蓝牙遥控插座项目】项目实现

1.项目需求

手机通过蓝牙模块远程遥控风扇。

2.硬件

  • STM32单片机最小系统
  • 继电器模块
  • 蓝牙模块

硬件接线

STM32蓝牙模块继电器
PA2RX
PA3TX
PB6I/O
3V3VCC
5VVCC
GNDGNDGND
  • 项目框图
    在这里插入图片描述

3.软件

  • bluetooth、plugin驱动文件添加
  • main.c程序
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "bluetooth.h"
#include "plugin.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */led_init();                         /* 初始化LED灯 */uart1_init(115200);bt_init(115200);plugin_init();printf("hello world!\r\n");//    uint8_t i = 0;while(1){ 
//        bt_send("hello, bt%d\r\n", i++);
//        delay_ms(500);
//        led1_on();
//        led2_off();
//        delay_ms(500);
//        led1_off();
//        led2_on();
//        delay_ms(500);}
}
  • bluetooth.c程序
#include "sys.h"
#include "bluetooth.h"
#include "string.h"
#include "stdarg.h"
#include "plugin.h"UART_HandleTypeDef uart2_handle;                                            /* uart2句柄 */uint8_t uart2_rx_buf[UART2_RX_BUF_SIZE];                                    /* uart2接收缓冲区 */
uint16_t uart2_rx_len = 0;                                                  /* uart2接收字符长度 *//*** @brief       串口1初始化函数* @param       baudrate: 波特率, 根据自己需要设置波特率值* @retval      无*/
void bt_init(uint32_t baudrate)
{/*uart2 初始化设置*/uart2_handle.Instance = USART2;                                         /* USART1 */uart2_handle.Init.BaudRate = baudrate;                                  /* 波特率 */uart2_handle.Init.WordLength = UART_WORDLENGTH_8B;                      /* 字长为8位数据格式 */uart2_handle.Init.StopBits = UART_STOPBITS_1;                           /* 一个停止位 */uart2_handle.Init.Parity = UART_PARITY_NONE;                            /* 无奇偶校验位 */uart2_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;                      /* 无硬件流控 */uart2_handle.Init.Mode = UART_MODE_TX_RX;                               /* 收发模式 */HAL_UART_Init(&uart2_handle);                                           /* HAL_UART_Init()会使能uart2 */
}/*** @brief       uart2接收缓冲区清除* @param       无* @retval      无*/
void uart2_rx_clear(void)
{memset(uart2_rx_buf, 0, sizeof(uart2_rx_buf));                          /* 清空接收缓冲区 */uart2_rx_len = 0;                                                       /* 接收计数器清零 */
}/*** @brief       串口2中断服务函数* @note        在此使用接收中断及空闲中断,实现不定长数据收发* @param       无* @retval      无*/
void USART2_IRQHandler(void)
{uint8_t receive_data = 0;   if(__HAL_UART_GET_FLAG(&uart2_handle, UART_FLAG_RXNE) != RESET){        /* 获取接收RXNE标志位是否被置位 */if(uart2_rx_len >= sizeof(uart2_rx_buf))                            /* 如果接收的字符数大于接收缓冲区大小, */uart2_rx_len = 0;                                               /* 则将接收计数器清零 */HAL_UART_Receive(&uart2_handle, &receive_data, 1, 1000);            /* 接收一个字符 */uart2_rx_buf[uart2_rx_len++] = receive_data;                        /* 将接收到的字符保存在接收缓冲区 */}if (__HAL_UART_GET_FLAG(&uart2_handle, UART_FLAG_IDLE) != RESET)        /* 获取接收空闲中断标志位是否被置位 */{printf("bt recv: %s\r\n", uart2_rx_buf);                               /* 将接收到的数据打印出来 */if(strstr((char *)uart2_rx_buf, "on") != NULL)//on不等于NULL,接收到"on"plugin_on(); //继电器打开else if(strstr((char *)uart2_rx_buf, "off") != NULL)//接收到"off"plugin_off();//继电器闭合uart2_rx_clear();__HAL_UART_CLEAR_IDLEFLAG(&uart2_handle);                           /* 清除UART总线空闲中断 */}
}//void bt_send(char *send_buf, uint8_t size)
//{
//    HAL_UART_Transmit(&uart2_handle, (uint8_t *)send_buf, size, 100);
//}void bt_send(char * format, ...)
{uint8_t send_buf[128] ={0};va_list arg;va_start(arg, format);vsprintf((char *)send_buf, format, arg);va_end(arg);HAL_UART_Transmit(&uart2_handle, send_buf, sizeof(send_buf), 100);
}
  • bluetooth.h程序
#ifndef __BLUETOOTH_H__
#define __BLUETOOTH_H__#include "stdio.h"
#include "sys.h"/* UART收发缓冲大小 */
#define UART2_RX_BUF_SIZE            128
#define UART2_TX_BUF_SIZE            64void bt_init(uint32_t bound);            /* 串口初始化函数 */
//void bt_send(char *send_buf, uint8_t size);
void bt_send(char * format, ...);#endif
  • plugin.c
#include "plugin.h"
#include "sys.h"//初始化GPIO函数
void plugin_init(void)
{GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟//调用GPIO初始化函数gpio_initstruct.Pin = GPIO_PIN_6;                       // 继电器对应的引脚gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速HAL_GPIO_Init(GPIOB, &gpio_initstruct);//关闭LEDplugin_off();
}//闭合继电器的函数
void plugin_on(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);   // 拉低LED1引脚,点亮LED1
}//松开继电器的函数
void plugin_off(void)
{HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);     // 拉高LED1引脚,熄灭LED1
}//获取继电器状态的函数
uint8_t plugin_status_get(void)
{return (uint8_t)HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6);
}
  • plugin.h
#ifndef __PLUGIN_H__
#define __PLUGIN_H__#include "stdint.h"#define PLUGIN_STATUS_ON     0
#define PLUGIN_STATUS_OFF    1void plugin_init(void);
void plugin_on(void);
void plugin_off(void);
uint8_t plugin_status_get(void);#endif

4.实物效果

ST-Link下载方式

蓝牙遥控插座项目keil源文件


http://www.mrgr.cn/news/51658.html

相关文章:

  • pandas 数据分析实战
  • 字典树 计数问题(含 2022 icpc杭州 K)
  • awk工具的基本使用
  • 十二、Python基础语法(字符串str-上)
  • k8s系列-Rancher 上操作的k8s容器网络配置总结
  • Leetcode——数组:螺旋矩阵59.螺旋矩阵
  • 什么是领域驱动设计(DDD)?为什么需要领域驱动设计?
  • BAT脚本修改指定文件夹的图标,文件夹图标不变
  • 自定义树形结构转换,Hutool的TreeUtil工具
  • 算法之排序
  • 我只是一个不务正业的程序媛
  • 怎么给PPT文件设置文字动画效果,提高美观度
  • 选择排序,插入排序,快速排序的java简单实现
  • 宇宙之外的生命存在性探究
  • 常用分布的数学期望、方差、特征函数
  • Dos下编译环境搭建和C运行程序生成
  • 2024年第九届数维杯大学生数学建模挑战赛赛题和数维杯国际数学建模 LaTeX 模板
  • 谈Sobel算子的数学推导——原来是四个方向的相加
  • Linux驱动 --- AP3216C三合一环境光传感器驱动
  • 邻接矩阵表示法创建无向图