STM32L431CubeMX使用DHT11读取环境温度与湿度并通过串口打印

  • 一、开发平台
    • 软件下载
      • 1、keil5
      • 2、CubeMx
  • 二、DHT11介绍
  • 三、新建工程步骤
    • 1、CubeMx
    • 2、Keil5
  • 四、代码部分
    • 1、dht11.h
    • 2、dht11.c
    • 3、printf重定向
    • 4、mian.c
  • 五、运行效果

一、开发平台

·小熊派(STM32L431)
·DHT11数字温湿度传感器
·keil5
·cubemx
·使用HAL库

软件下载

1、keil5

在官网下载(注意下载正确版本,STM32属于MDK-Arm):https://www.keil.com/download/product/

2、CubeMx

在官网下载:https://www.st.com/zh/development-tools/stm32cubemx.html

二、DHT11介绍

用户单片机发送一次开始信号后,DHT11从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信采集。

DHT11接线:

DHT11 STM32
VCC 5V
GND GND
DATA PC9

三、新建工程步骤

1、CubeMx

1、打开CubeMx,选择芯片类型

我这里用的是小熊派(STM32L431RCT)

配置RCC为外部高速时钟。



配置串口1,串口配置按默认来就可以了。

因为我的DHT11接在PC9引脚上,所以配置引脚PC9为GPIO_OUTPUT,并把标签改为DHT11,方便后续的编程。

对PC9引脚进行配置

配置时钟树,STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可


最后点击Genrate code

至此工程建立完毕,点击open project,自动打开keil5

2、Keil5

1、点击Build,等待工程编译完成,0 error后点击工程文件管理,添加hareware文件夹,将驱动文件添加进去。

2、点击魔术棒,添加include路径,添加dht11.h所在文件夹路径,再次编译。


添加重定向printf代码

四、代码部分

1、dht11.h

#ifndef __DHT11_H__
#define __DHT11_H__#include "main.h"
#include "tim.h"
#include "gpio.h"
#include "stm32l4xx_hal.h"#define DHT11_DQ_OUT_HIGH HAL_GPIO_WritePin(DHT11_GPIO_Port,DHT11_Pin,GPIO_PIN_SET)
#define DHT11_DQ_OUT_LOW    HAL_GPIO_WritePin(DHT11_GPIO_Port,DHT11_Pin,GPIO_PIN_RESET)
#define DHT11_DQ_IN  HAL_GPIO_ReadPin(DHT11_GPIO_Port,DHT11_Pin)extern uint16_t temperature;
extern uint16_t humidity;
extern char temp,humi;void delay_us(uint16_t us);
//IO方向设置
void DHT11_IO_IN(void);
void DHT11_IO_OUT(void);uint8_t DHT11_Init(void);//初始化DHT11
uint8_t DHT11_Read_Data(uint16_t *temp,uint16_t *humi);//读取温湿度
uint8_t DHT11_Read_Byte(void);//读出一个字节
uint8_t DHT11_Read_Bit(void);//读出一个位
uint8_t DHT11_Check(void);//检测是否存在DHT11
void DHT11_Rst(void);//复位DHT11  #endif

2、dht11.c

#include "dht11.h"uint16_t temperature;
uint16_t humidity;
char temp,humi;//微秒延时
void delay_us(uint16_t us)
{     uint16_t differ = 0xffff-us-5;               __HAL_TIM_SET_COUNTER(&htim7,differ);   //设定TIM1计数器起始值HAL_TIM_Base_Start(&htim7);       //启动定时器 while(differ < 0xffff-5){    //判断differ = __HAL_TIM_GET_COUNTER(&htim7);        //查询计数器的计数值}HAL_TIM_Base_Stop(&htim7);
}//IO方向设置
void DHT11_IO_IN(void)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = DHT11_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(DHT11_GPIO_Port, &GPIO_InitStruct);
}void DHT11_IO_OUT(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = DHT11_Pin;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DHT11_GPIO_Port,&GPIO_InitStructure);
}//复位DHT11
void DHT11_Rst(void)
{                 DHT11_IO_OUT();   //设置为输出DHT11_DQ_OUT_LOW;    //拉低DQHAL_Delay(20);        //拉低至少18msDHT11_DQ_OUT_HIGH;    //DQ=1 delay_us(30);       //主机拉高20~40us
}//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void)
{   uint8_t retry=0;DHT11_IO_IN();      //设置为输出     while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us{retry++;delay_us(1);};     if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us{retry++;delay_us(1);};if(retry>=100)return 1;      return 0;
}//从DHT11读取一个位
//返回值:1/0
uint8_t DHT11_Read_Bit(void)
{uint8_t retry=0;while(DHT11_DQ_IN&&retry<100)//等待变为低电平{retry++;delay_us(1);}retry=0;while(!DHT11_DQ_IN&&retry<100)//等待变高电平{retry++;delay_us(1);}delay_us(40);//等待40usif(DHT11_DQ_IN)return 1;else return 0;
}//从DHT11读取一个字节
//返回值:读到的数据
uint8_t DHT11_Read_Byte(void)
{        uint8_t i,dat;dat=0;for (i=0;i<8;i++) {dat<<=1; dat|=DHT11_Read_Bit();}                         return dat;
}//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
uint8_t DHT11_Read_Data(uint16_t *temp,uint16_t *humi)
{        uint8_t buf[5];uint8_t i;DHT11_Rst();if(DHT11_Check()==0){for(i=0;i<5;i++)//读取40位数据{buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){*humi=(buf[0]<<8) + buf[1];*temp=(buf[2]<<8) + buf[3];}}else return 1;return 0;
}//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
uint8_t DHT11_Init(void)
{ DHT11_Rst();return DHT11_Check();
}

3、printf重定向

添加在usart.c中

/* USER CODE BEGIN 1 */
#if 1
#include <stdio.h>int fputc(int ch, FILE *stream)
{/* 堵塞判断串口是否发送完成 */while((USART1->ISR & 0X40) == 0);/* 串口发送完成,将该字符发送 */USART1->TDR = (uint8_t) ch;return ch;
}
#endif
/* USER CODE END 1 */

4、mian.c

/* USER CODE BEGIN Includes */
#include "dht11.h"
#include "stdio.h"
/* USER CODE END Includes */
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_TIM7_Init();/* USER CODE BEGIN 2 */while(DHT11_Init())                                                  //初始化DHT11{printf("DHT11 初始化失败!\r\n");HAL_Delay(500);}printf("DHT11 初始化成功!\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */uint8_t res = DHT11_Read_Data(&temperature,&humidity);      //设置缓存区if(res == 0)   //判断是否读取到温湿度数据{DHT11_Read_Data(&temperature,&humidity);     //读取温湿度数据printf("DHT11 Temperature = %d.%d ℃\r\n",temperature>>8,temperature&0xff);printf("DHT11 Humidity = %d.%d%%\r\n",humidity>>8,humidity&0xff);}/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

五、运行效果

下载程序后通过串口助手可以看到

至此,本实验完成。

STM32L431(CubeMX)使用DHT11读取环境温度与湿度并通过串口打印相关推荐

  1. 树莓派3B Qt+dht11读取温湿度并写入数据库202005(8)

    内容 本文介绍:使用树莓派3B Qt+dht11读取温湿度,以一定时间间隔更新数据,显示于界面,并写入数据库 硬件:树莓派3B,温湿度传感器dht11,杜邦线 1.建工程 建立工程后点击mainwin ...

  2. 基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)

    一.项目介绍 当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备.设备采用IIC模拟时序通信协议,能够实时监测环境的温度和湿度,并将数据通过LCD显示屏显示出来:可以广泛应用于室 ...

  3. dht11 java_树莓派从DHT11读取温湿度

    树莓派之DHT11传感器 硬件DHT11 主要看其原理,具体的详细原理大家就搜索引擎都能搜到. 也是为了好奇心,入手一台便宜的示波器,看看具体波形,下面是我所测: 这张显示首次触发,主机至少下拉18m ...

  4. STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)

    一.环境介绍 工程编译软件:  keil5 温湿度传感器: SHT30 MCU : STM32F103ZET6 程序采用模块化编程,iic时序为一个模块(iic.c 和 iic.h),SHT30为一个 ...

  5. 通过时序图编程操作DHT11读取温湿度

    目录 一.DHT11模块 二.时序图分析 总的时序: 开始信号与响应信号: 读取数据: 停止信号: 三.程序部分 一.DHT11模块 Dht11温湿度检测模块,模块引出引脚有VCC.GND和DATA, ...

  6. 51单片机 DHT11温湿度传感器LCD显示+串口打印显示

    第一部分:DHT11详解: DHT11是一款有已校准数字信号输出的温湿度传感器. 精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~50℃. **一.电路连接分析 1.引脚图** ...

  7. STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出

    文章目录 前言 一.I2C总线通信协议 1.I2C总线 2.工作原理 3.I2C特点 4.I2C模式选择 5.软件I2C和硬件I2C 二.串口输出温湿度传感器的数据 1.核心代码分析 2.硬件实操连接 ...

  8. 从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数

    一些经验总结: 1.对于读取文件,大家要熟记BufferedReader类,他可以一次读取一行,在很多的笔试题会遇到这样的例子,但是判断读取结束的标志并不是我们平时所见的-1,而是null. 2.可以 ...

  9. linux 串口读取陀螺仪,stm32读取陀螺仪MPU6050发送数据到串口

    [实例简介] IAR环境下,stm32读取MPU6050数据,发送到串口. [实例截图] [核心代码] 6b42b05e-a094-444f-b033-eda513b6cc49 └── tly01 ├ ...

最新文章

  1. python手机版下载372-Mac下python环境的安装
  2. Linux Shell脚本实现根据进程名杀死进程
  3. 基于Linux C的socketEthereal程序和Package分析 (一个)
  4. python configparse_python中ConfigParse模块的用法
  5. c#中的DefWndProc是Control类的虚函数
  6. java set contains用法,Java TreeSet contains()用法及代码示例
  7. input和raw_input
  8. startlogging中设置setstdout=false来禁用这个功能。_Windows 10禁用USB选择性暂停设置,峰哥教你解决USB设备失灵问题...
  9. 双模sa_七句话讲清NSA单模与SA+NSA双模手机的真实区别
  10. 帮你排雷Jmeter分布式性能测试那些坑~轻轻松松去实战
  11. 数据挖掘数据的资料分享
  12. wifi各协议最高速率
  13. 《电路》邱关源 思维导图 第三章 电阻电路的一般分析
  14. 华人科学家量子计算机,华人科学家张首晟辞世 有望获得诺贝尔奖却成遗憾
  15. QT学习笔记(一)之本地播放器
  16. HDS发布视频分析软件HVA 为企业提供运营智能与安全洞察
  17. html5的技术串讲,Web前端开发职业标准串讲(初级).pdf
  18. Axure谷歌浏览器扩展程序下载及安装方法(免翻墙)
  19. JSPatch转换器:可直接将OC代码转换成JS代码
  20. 腾讯WeTest&TesterHome手游测试沙龙

热门文章

  1. php5 imap,LIV. IMAP, POP3 and NNTP Functions - PHP 5 中文文档
  2. win10分辨率不能调整_笔记本电脑如何连接投影仪?MAC OS/Win10/7笔记本和投影仪连接方法...
  3. 【个人研究】21世纪西方运用脑电(EEG)的音乐研究动向分析(二)
  4. 软件测试(三)p51-p104 软件测试用例方法、缺陷
  5. matlab 程序设计题,matlab练习题-程序设计完成
  6. Stack Overflow使用总结
  7. Html标签——table表格
  8. (预处理合集)手写数据集MNIST(2)——Spyder
  9. vue3 - ref和reactive的区别
  10. IDEA-集成VisualVM插件,启动Java VisualVM