單片機
返回首頁

STM32入門篇之DHT11溫濕度傳感器

2021-09-10 來源:eefocus

前言

一、項目介紹

本項目作為入門STM32的入門項目,也是我初次接觸STM系列的單片機,在此記錄一下。


1.1 項目名稱

名稱:基于STM32的室內溫濕度檢測


1.2 項目設計思路

思路:本項目采用ARM結構中最為代表的Cortex-M4系列的芯片,選用STM32F407ZGT6開發板進行項目開發,選用的傳感器為常見通用的DHT11溫濕度傳感器。傳感器將采集到的數據傳輸到STM32(MCU)主控進行數據處理,最后通過串口打印出來。


二、硬件準備

2.1 STM32F407ZGT6

購買鏈接:https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-22466574672.18.4cc84163K894AJ&id=565218048000

在這里插入圖片描述

2.4 DHT11溫濕度傳感器


購買鏈接如下:https://detail.tmall.com/item.htm?id=15598344236

在這里插入圖片描述

三、軟件準備

全部資料的下載鏈接:https://pan.baidu.com/s/1p0LfRRw54vqTtx1yKDsQwA

密碼為:f22d

注:里面包括了keil5安裝的步驟與開發環境搭建


3.1 Keil5

官方下載鏈接如下:http://www.keil.com/demo/eval/arm.htm


3.2 STM32f407固件庫

官方下載鏈接如下:http://www.keil.com/dd2/pack


3.3 STM32CudeMx

官方下載鏈接如下:http://www.st.com/web/en/catalog/tools/PF259242


3.4 STM32CudeMx的f407軟件包

官方下載鏈接如下:http://www.st.com/web/en/catalog/tools/PF259243


四、項目實施

4.1 硬件平臺開發

4.1.1 keil5安裝

請按照本人共享的鏈接里面的開發環境文件夾里面word文檔進行操作,提取文件密碼為:f22d


4.1.2 STM32CudeMx安裝

(https://pan.baidu.com/s/1p0LfRRw54vqTtx1yKDsQwA)里面的STM32CudeMX文件夾里面word文檔進行操作,提取文件密碼為:f22d


4.1.3 BSP工程項目創建

①打開STM32CudeMX

在這里插入圖片描述

②點擊創建工程

在這里插入圖片描述

③搜索STM32F407ZGT6,雙擊黃色區域

在這里插入圖片描述

④點擊Categories——》System Core ——》GPIO,選擇PF9和PF10,各自點擊為GPIO_OutPut

在這里插入圖片描述

⑤對GPIO進行具體配置

在這里插入圖片描述

⑥配置RCC時鐘

在這里插入圖片描述

⑦配置系統時鐘

在這里插入圖片描述

⑧這里以串口1為例 我們可以選擇串口的模式(異步,同步,半雙工) 串口接收中斷


a)點擊USATR1

b)設置MODE為異步通信(Asynchronous)

c)基礎參數:波特率為115200 Bits/s。傳輸數據長度為8 Bit。奇偶檢驗無,停止位1 接收和發送都使能

d)GPIO引腳設置 USART1_RX/USART_TX

e) NVIC Settings 一欄使能接收中斷在這里插入圖片描述

在這里插入圖片描述

⑨配置STM32F407ZGT6的時鐘樹,由于是外部8M的晶振,所以得出一下的時鐘樹


a)選擇外部時鐘HSE 8MHz

b)PLL鎖相環倍頻168倍

c)系統時鐘來源選擇為PLL

d)設置APB1分頻器為 /4


32的時鐘樹框圖 如果不懂的話請看《【STM32】系統時鐘RCC詳解(超詳細,超全面)》

在這里插入圖片描述

⑩建立工程

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

4.1.4 BSP工程項目開發

(1)用keil5打開此工程

在這里插入圖片描述

(2)點擊option(錘子),然后進行主頻配置,修改為8.0或者12.0,然后重新打開該工程進行檢查,最后進行編譯。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

(3)在keil5上面創建SYSTEM和HARDWAVE兩個文件夾

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

(4)回到本人創建的test工程目錄,添加這兩個文件夾,本人已經整理好了鏈接(STM32課程資料庫文件),復制庫文件里面SYSTEM和HARDWAVE兩個文件夾到test工程目錄下。

在這里插入圖片描述

在這里插入圖片描述在這里插入圖片描述

(5)回到keil5里面,繼續點擊那個文件管理,然后根據對應的文件夾添加文件,一個都不要漏。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

注:HARDWAVE也是這樣添加工程文件進去。

在這里插入圖片描述


(6)配置頭文件路徑,選擇為第4步已經復制的兩個文件夾(SYSTEM和HARDWAVE)

在這里插入圖片描述

完成圖如下:

在這里插入圖片描述

(7)編程開發

main.c


#include "main.h"

#include "usart.h"

#include "gpio.h"

#include "stdio.h"

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "dht11.h"



void SystemClock_Config(void);


int main(void)

{

  u8 t=0;      

u8 temperature;      

u8 humidity; 

  int times;

  HAL_Init();

 

  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

delay_init(168);                           

  SystemClock_Config();

DHT11_Init();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE);

  while (1)

  {

if(t%10==0)//?100ms????

{          

DHT11_Read_Data(&temperature,&humidity);

printf("2018A14122 WuXiaoXianrn");

printf("Tem:%drn",temperature);

printf("Hum:%drn",humidity);

printf("rnn");

}    

delay_ms(100);

t++;  

}

}

/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


  /** Configure the main internal regulator output voltage

  */

  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLM = 4;

  RCC_OscInitStruct.PLL.PLLN = 168;

  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

  RCC_OscInitStruct.PLL.PLLQ = 4; 

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

  /** Initializes the CPU, AHB and APB buses clocks

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;


  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)

  {

    Error_Handler();

  }

}


void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  __disable_irq();

  while (1)

  {

  }

  /* USER CODE END Error_Handler_Debug */

}


#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %drn", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


uart.c


#include "usart.h"

#include "stdio.h"


/* USER CODE BEGIN 0 */

uint8_t USART_RX_BUF[USART_REC_LEN];

uint16_t USART_RX_STA=0; //??????

uint8_t aRxBuffer[RXBUFFERSIZE];//HAL??????????



/* USER CODE END 0 */


UART_HandleTypeDef huart1;


/* USART1 init function */

int fputc(int ch, FILE *f)

{

HAL_UART_Transmit(&huart1,(uint8_t *)&ch, 1, 0XFFFF);

  return ch;


}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

if(huart->Instance==USART1)//?????1

{

if((USART_RX_STA&0x8000)==0)//?????

{

if(USART_RX_STA&0x4000)   //????0x0d

{

if(aRxBuffer[0]!= 0x0a)

{

USART_RX_STA=0;         //????,????

}

  else

  {

  USART_RX_STA|=0x8000;  //?????

  }

}

else //????0x0D

{

if(aRxBuffer[0] == 0x0d)

{

USART_RX_STA|=0x4000;

}

else

{

USART_RX_BUF[USART_RX_STA&0x3FFF]=aRxBuffer[0];

USART_RX_STA++;

if(USART_RX_STA>(USART_REC_LEN-1))

{

USART_RX_STA=0;    //??????,??????

}

}

}

}

   }

   }


void MX_USART1_UART_Init(void)

{


  /* USER CODE BEGIN USART1_Init 0 */


  /* USER CODE END USART1_Init 0 */


  /* USER CODE BEGIN USART1_Init 1 */


  /* USER CODE END USART1_Init 1 */

  huart1.Instance = USART1;

  huart1.Init.BaudRate = 115200;

  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();

  }

  /* USER CODE BEGIN USART1_Init 2 */


  /* USER CODE END USART1_Init 2 */


}


void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)

{


  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(uartHandle->Instance==USART1)

  {

  /* USER CODE BEGIN USART1_MspInit 0 */


  /* USER CODE END USART1_MspInit 0 */

    /* USART1 clock enable */

    __HAL_RCC_USART1_CLK_ENABLE();


    __HAL_RCC_GPIOA_CLK_ENABLE();

    /**USART1 GPIO Configuration

    PA9     ------> USART1_TX

    PA10     ------> USART1_RX

    */

    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


    /* USART1 interrupt Init */

    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(USART1_IRQn);

  /* USER CODE BEGIN USART1_MspInit 1 */


  /* USER CODE END USART1_MspInit 1 */

  }

}


void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)

{


  if(uartHandle->Instance==USART1)

  {

  /* USER CODE BEGIN USART1_MspDeInit 0 */


  /* USER CODE END USART1_MspDeInit 0 */

    /* Peripheral clock disable */

    __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 interrupt Deinit */

    HAL_NVIC_DisableIRQ(USART1_IRQn);

  /* USER CODE BEGIN USART1_MspDeInit 1 */


  /* USER CODE END USART1_MspDeInit 1 */

  }

}


/* USER CODE BEGIN 1 */


/* USER CODE END 1 */


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


uart.h


/**

  ******************************************************************************

  * @file    usart.h

  * @brief   This file contains all the function prototypes for

  *          the usart.c file

  ******************************************************************************

  * @attention

  *

  *

© Copyright (c) 2021 STMicroelectronics.

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

  ******************************************************************************

  */

/* Define to prevent recursive inclusion -------------------------------------*/

#ifndef __USART_H__

#define __USART_H__


#ifdef __cplusplus

extern "C" {

#endif


/* Includes ------------------------------------------------------------------*/

#include "main.h"


/* USER CODE BEGIN Includes */

#define USART_REC_LEN 500

#define   RXBUFFERSIZE  1

extern uint8_t USART_RX_BUF[USART_REC_LEN];

extern uint16_t USART_RX_STA;

extern UART_HandleTypeDef UART1_Handler; //UART??

extern uint8_t aRxBuffer[RXBUFFERSIZE];//HAL??????????



/* USER CODE END Includes */


extern UART_HandleTypeDef huart1;


/* USER CODE BEGIN Private defines */


/* USER CODE END Private defines */


void MX_USART1_UART_Init(void);


/* USER CODE BEGIN Prototypes */


/* USER CODE END Prototypes */


#ifdef __cplusplus

}

#endif


#endif /* __USART_H__ */


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


(8)檢查配置,編譯下載


(9)打開串口助手進行查看



4.2 硬件平臺接線

DHT11 ———————————————— STM32

data ————————————————— PG9

vcc —————————————————— 5v

GND —————————————————— GND


五、項目總結

本此項目不難,但是很繁瑣,請大家耐心點

進入單片機查看更多內容>>
相關視頻
  • TI 新一代 C2000? 微控制器:全方位助力伺服及馬達驅動應用

  • MSP430電容觸摸技術 - 防水Demo演示

  • 直播回放: Microchip Timberwolf? 音頻處理器在線研討會

  • 新唐 8051單片機教程

  • 基于靈動MM32W0系列MCU的指夾血氧儀控制及OTA升級應用方案分享

  • 基于靈動MM32SPIN系列MCU的無感FOC便攜冰箱應用方案分享

    相關電子頭條文章
萝卜大香蕉