这是一个非常简单的蓝牙小项目
项目要求,能够在手机上发送开启闸门时,继电器相应的打开,在手机上发送关闭闸门时,继电器相应关闭,且在开始时,发送“hello,帅气的雷先生”
使用PIN脚:
蓝牙:
RX2 | TXD |
TX2 | RXD |
GND | GND |
5V | 5V |
继电器:
PB6 | IN |
GND | GND |
3.3V | VCC |
代码实现:
1、串口蓝牙通信
我们这里的蓝牙使用到了单片机上的串口2,所以我们要初始化串口2
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()会使能UART1 */
}
串口2的中断服务函数
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("btrecv: %s\r\n", uart2_rx_buf); /* 将接收到的数据打印出来 */
if(strstr((char *)uart2_rx_buf,"开启闸门") != NULL)
{
plug_on();
}
else if(strstr((char *)uart2_rx_buf,"关闭闸门") != NULL)
{
plug_off();
}
uart2_rx_clear();
__HAL_UART_CLEAR_IDLEFLAG(&uart2_handle); /* 清除UART总线空闲中断 */
}
}
发送数据函数
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);
}
2、继电器初始化
void plug_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);
plug_off();
}
3、主函数
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init(); /* 初始化LED灯 */
uart1_init(115200);
printf("hello world!\r\n");
bt_init(115200);
plug_init();
bt_send("hello,帅气的雷先生\r\n");
4、实现效果
当在手机蓝牙助手上发送“开启闸门”时,继电器开启,相应的,继电器上的绿色灯亮起。同理,在手机蓝牙助手上发送“关闭闸门”时,继电器关闭,绿灯灭掉。这样我们就实现了初步的手机通过蓝牙控制单片机的过程。
标签:HAL,handle,UART,rx,STM32,Init,插座,hal,uart2 From: https://blog.csdn.net/ljhlovezyx/article/details/143187164