一、项目功能概述
二、材料选择
三、程序设计
四、实物
数据下载地址:基于STM32风向风速检测设计
一、项目功能概述
2、通过DHT11获取温湿度
3、OLED液晶显示测量数据
四、串口传输数据
二、材料选择
1.风速风向传感器
选择风速风向传感器输出方式RS485
2、DHT11温湿度传感器
3、4线OLED液晶屏
4、RS485模块
三、程序设计
RS485数据收发
#include "./usart/bsp_debug_usart.h" #include "oled.h" #include "string.h" UART_HandleTypeDef UartHandle; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; UART_HandleTypeDef huart3; uint32_t mWindSpeed = 0; uint32_t mWindDirec = 0; _DEF_UART RS485_Uart1,RS485_Uart2,RS485_Uart3; 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(); } huart2.Instance = USART2; huart2.Init.BaudRate = 4800; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { // Error_Handler(); } huart3.Instance = USART3; huart3.Init.BaudRate = 4800; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart3) != HAL_OK) { // Error_Handler(); } __HAL_UART_DISABLE_IT(&huart1,UART_IT_TC); __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);//使接收中断 __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//让空闲中断 HAL_NVIC_SetPriority(USART1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); __HAL_UART_CLEAR_IDLEFLAG(&huart1); __HAL_UART_DISABLE_IT(&huart2,UART_IT_TC); __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);//使接收中断 __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);//让空闲中断 HAL_NVIC_SetPriority(USART2_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); __HAL_UART_CLEAR_IDLEFLAG(&huart2); __HAL_UART_DISABLE_IT(&huart3,UART_IT_TC); __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);//使接收中断 __HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE);//让空闲中断 HAL_NVIC_SetPriority(USART3_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART3_IRQn); __HAL_UART_CLEAR_IDLEFLAG(&huart3); } void Main_Uart1(void) { uint16_t CRCVal = 0; memset(RS485_Uart1.Buf,0,50); RS485_Uart1.Buf[0] = 0x01; RS485_Uart.Buf[1] = 0x03;
RS485_Uart1.Buf[2] = 0x03;
RS485_Uart1.Buf[3] = mWindDirec >> 8;
RS485_Uart1.Buf[4] = mWindDirec;
RS485_Uart1.Buf[5] = mWindSpeed >> 8;
RS485_Uart1.Buf[6] = mWindSpeed;
CRCVal = CRC16(RS485_Uart1.Buf,7);
RS485_Uart1.Buf[7] = CRCVal;
RS485_Uart1.Buf[8] = CRCVal >> 8;
HAL_UART_Transmit(&huart1,RS485_Uart1.Buf,9,1000);
delay_ms(10);
}
void Main_Uart2(void)
{
if(RS485_Uart2.RcvFinish == 0) return;
RS485_Uart2.RcvFinish = 0;
Decode_Recv_Usart2(&RS485_Uart2);
RS485_Uart2.Cnt = 0;
memset(RS485_Uart2.Buf,0,50);
delay_ms(10);
HAL_UART_Transmit(&huart2,Wind_Direc_Str,8,1000);
}
void Main_Uart3(void)
{
if(RS485_Uart3.RcvFinish == 0) return;
RS485_Uart3.RcvFinish = 0;
Decode_Recv_Usart3(&RS485_Uart3);
RS485_Uart3.Cnt = 0;
memset(RS485_Uart3.Buf,0,50);
delay_ms(10);
HAL_UART_Transmit(&huart3,Wind_Speed_Str,8,1000);
}
unsigned short CRC16(unsigned char* data,int count)
{
unsigned char CRC16Lo = 0xFF;
unsigned char CRC16Hi = 0xFF; //CRC???
unsigned char SaveHi;
unsigned char SaveLo;
unsigned char Flag = 0;
int i = 0;
for (; i < count; i++)
{
CRC16Lo = CRC16Lo ^ data[i]; //??????CRC???????
for (Flag = 0; Flag <= 7; Flag++)
{
SaveHi = CRC16Hi;
SaveLo = CRC16Lo;
CRC16Hi = CRC16Hi >> 1; //??????
CRC16Lo = CRC16Lo >> 1; //??????
if ((SaveHi & 0x01) == 0x01) //???????????1
{
CRC16Lo = CRC16Lo | 0x80; //???????????1
} //?????0
if ((SaveLo & 0x01) == 0x01) //??LSB?1,??????????
{
CRC16Hi = CRC16Hi ^ 0xA0;//???&HA001
CRC16Lo = CRC16Lo ^ 0x01;
}
}
}
return (CRC16Lo<<8)|CRC16Hi;
}
main.c
int main(void)
{
char ch = 0;
HAL_Init();
SystemClock_Config();/* 配置系统时钟为72 MHz */
RTC_CalendarConfig();
MX_USART1_UART_Init();
BASIC_TIMx_Init();
I2C_GPIO_Config();
DHT12_Init();
OLED_init();
OLED_full();
OLED_clear();
display();
delay_ms(2000);//
Get_Wind_Direct();
while (1)
{
Main_Uart1();
Main_Uart2();
Main_Uart3();
display();
sensor_read();
Get_Time();
delay_ms(1000);//
}
}