STM32蓝牙插座项目(hal)

这是一个非常简单的蓝牙小项目

项目要求,能够在手机上发送开启闸门时,继电器相应的打开,在手机上发送关闭闸门时,继电器相应关闭,且在开始时,发送“hello,帅气的雷先生”

使用PIN脚:

蓝牙:

RX2TXD
TX2RXD
GNDGND
5V5V

继电器:

PB6IN
GNDGND
3.3VVCC

 代码实现:
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、实现效果

当在手机蓝牙助手上发送“开启闸门”时,继电器开启,相应的,继电器上的绿色灯亮起。同理,在手机蓝牙助手上发送“关闭闸门”时,继电器关闭,绿灯灭掉。这样我们就实现了初步的手机通过蓝牙控制单片机的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值