资讯详情

STM32项目设计:基于STM32的风向风速测量仪

一、项目功能概述

二、材料选择

三、程序设计

四、实物

数据下载地址:基于STM32风向风速检测设计

一、项目功能概述

1.通过风向和风速传感器获得当前风向和风速

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);//
  }
}

四、实物

标签: usregal风速风向传感器020c型风向传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台