赞
踩
蓝牙模块部分
1.硬件部分与初始设置
使用的是HC-05,或者随便哪一种都行,按照个人需求配置AT指令,一般波特率9600就行了,也不是什么需要高精度的东西。配置AT指令时需要一个USB转TTL模块。
连接:TXD → RXD RXD → TXD GND ↔ GND 5V ↔ VCC
USB部分与电脑连接即可,长按按钮再上电,再然后用串口调试程序进行配置
1.1.AT指令配置:先按住HC05蓝牙模块上面的按键,再给蓝牙模块通电。蓝牙模块上面的LED进入慢闪模式,继续进行AT配置
1.2.修改蓝牙模块名称:
输入AT+NAME=STM之后按一下回车键发送,蓝牙返回OK,表示蓝牙名字修改为STM
1.3.蓝牙模块配对密码:
输入AT+PSWD="1234"之后按一下回车键发送,蓝牙返回OK,表示蓝牙配对密码修改为1234
1.4.修改波特率:
输入AT+UART=9600,0,0之后按一下回车键发送,蓝牙返回OK,表示蓝牙通信波特率修改为9600
1.5.返回蓝牙模块的地址:
键入AT + ADDR?,将返回蓝牙模块的地址,因为是和手机软件配对使用,就不用进行主机从机的配置了。配置好在蓝牙模块通电时就可以手机端搜索连接该蓝牙。
2.软件部分通信设置
初始化配置STM32的USART1串口通信功能。
USART1是一种通用异步收发器,可以用于实现串行数据通信。
该代码确保了USART1的初始化和相关外设的配置正确完成。 在函数`MX_USART1_UART_Init`中,通过`HAL_UART_Init`函数初始化了USART1串口的设置,并指定了波特率(要和前面蓝牙硬件部分设置的波特率相同,不然数据传输不了)、数据长度、停止位、校验位等参数。
在函数`HAL_UART_MspInit`中,进行外设GPIO端口的初始化设置,将USART1的TX引脚和RX引脚配置成对应的功能,并通过`HAL_GPIO_Init`函数进行初始化。 同时还进行了DMA的初始化和设置,通过DMA实现了USART1的数据传输。分别配置了接收数据的DMA和发送数据的DMA,并将其与USART1串口相关联。 在最后通过`HAL_NVIC_SetPriority`函数和`HAL_NVIC_EnableIRQ`函数设置了USART1的中断优先级和使能。
函数`HAL_UART_MspDeInit`是对USART1串口和相关外设进行反初始化的函数,在函数内部将与USART1相关的外设和中断进行了禁用和反初始化的操作。
总结就是代码是由STMicroelectronics提供的HAL库生成的,用于快速配置和使用USART1。可读性有点差劲但是用起来方便。
- #include "usart.h"
-
-
-
- UART_HandleTypeDef huart1;
- DMA_HandleTypeDef hdma_usart1_rx;
- DMA_HandleTypeDef hdma_usart1_tx;
-
-
-
- void MX_USART1_UART_Init(void)
- {
-
- huart1.Instance = USART1;
- huart1.Init.BaudRate = 9600;
- huart1.Init.WordLength = UART_WORDLENGTH_8B;
- huart1.Init.StopBits = UART_STOPBITS_1;
- huart1.Init.Parity = UART_PARITY_NONE;
- huart1.Init.Mode = UART_MODE_TX_RX;
- huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- huart1.Init.OverSampling = UART_OVERSAMPLING_16;
- if (HAL_UART_Init(&huart1) != HAL_OK)
- {
- Error_Handler();
- }
-
- }
-
- void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
- {
-
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- if(uartHandle->Instance==USART1)
- {
-
- __HAL_RCC_USART1_CLK_ENABLE();
-
- __HAL_RCC_GPIOA_CLK_ENABLE();
-
- GPIO_InitStruct.Pin = GPIO_PIN_9;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- GPIO_InitStruct.Pin = GPIO_PIN_10;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
-
- hdma_usart1_rx.Instance = DMA1_Channel5;
- hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
- hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
- hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
- hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
- hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
- hdma_usart1_rx.Init.Mode = DMA_NORMAL;
- hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
- if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK)
- {
- Error_Handler();
- }
-
- __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);
-
-
- hdma_usart1_tx.Instance = DMA1_Channel4;
- hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
- hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
- hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
- hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
- hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
- hdma_usart1_tx.Init.Mode = DMA_NORMAL;
- hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
- if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
- {
- Error_Handler();
- }
-
- __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);
-
-
- HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(USART1_IRQn);
- }
- }
-
- void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
- {
-
- if(uartHandle->Instance==USART1)
- {
-
- __HAL_RCC_USART1_CLK_DISABLE();
-
- /**USART1 GPIO Configuration
- PA9 ------> USART1_TX
- PA10 ------> USART1_RX
- */
- HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
-
- /* USART1 DMA DeInit */
- HAL_DMA_DeInit(uartHandle->hdmarx);
- HAL_DMA_DeInit(uartHandle->hdmatx);
-
- /* USART1 interrupt Deinit */
- HAL_NVIC_DisableIRQ(USART1_IRQn);
- /* USER CODE BEGIN USART1_MspDeInit 1 */
-
- /* USER CODE END USART1_MspDeInit 1 */
- }
- }
手机软件部分
一开始想自己写一个app,不过还是太懒了,还是现成的好,手机端下载的是一个叫蓝牙调试器的软件。
该软件通信协议简单,界面设置简单,以下简单介绍数据包协议。
根据数据包协议设置数据包结构,设置界面并链接设置变量。为了简单变量全部设置为byte型。
两模块连接及功能实现代码
- uint8_t data[50]; //数据包
- uint8_t per; //湿度
- uint32_t top = 75; //湿度报警阈值
- uint32_t bot = 15;
-
-
- void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
-
- {
-
- char extracted1[10];
- char extracted2[10];
- char jiaoyan;//校验位
-
- uint8_t hum[4];
- int number1;
- const unsigned char constper;
- int number2;
-
-
- {
-
- //根据软件描述,校验位为数据和的低八位
- jiaoyan=data[1]+data[2]+data[3]+data[4];
- //data的1234位分别是阈值上下限,湿度接收,浇水控制
- hum[0]=0xa5;//包头
- hum[1]=per;
- hum[2]=per;
- hum[3]=0x5a;//包尾
- if(data[4]==0x01)
- {
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,0);
- //如果按下浇水按键, 则GPIO操作对应继电器进行浇水,即手动模式
-
- }
- else if(data[4]==0x00)
- {
-
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,1);
- //浇水手动关闭
- }
-
-
- if(data[3]==0x01)
- {
-
- HAL_UART_Transmit_DMA(&huart1, hum, 4);
- //接收按键点击立即给软件发送当前土壤湿度,当然也可以改为实时自动发送
-
- }
-
- if((data[0]==0xa5)&&(data[6]==0x5a)&&(data[5]==jiaoyan))
- {
- number1 = data[1];
- number2 = data[2];
-
- top = number1;
- bot = number2;
- HAL_UARTEx_ReceiveToIdle_DMA(&huart1, data, 50);
-
- //软件端设置湿度阈值上下限
- }
- }
- }
-
-
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。