stm32连接DHT11温湿度传感器

2023-05-16

目录

1. DHT11简介

1.1. 连接电路 

1.2. 串行接口 (单线双向)

 2. cubeMX设置

3. 代码开发

 3.1. 实现定时函数

3.2. 打开串口调试

3.4. 测试代码实现

4. 运行效果


1. DHT11简介

1.1. 连接电路 

信息如下:

建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使
用合适的上拉电阻

 DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此
期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去
耦滤波。

1.2. 串行接口 (单线双向)

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次
通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数
部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

 

 

 

 2. cubeMX设置

  1. GPIOE,GPIO_PIN_6,作为DATA接口。推挽输出,上拉电阻。
  2. 打开定时器TIM6。
  3. 开启USART1。

3. 代码开发

 3.1. 实现定时函数

time.c文件:

/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE END 0 */

/* USER CODE BEGIN 1 */
void delay_us(uint16_t delayValue)
{
	uint16_t delayCount=0;
	HAL_TIM_Base_Start(&htim6);
	__HAL_TIM_SetCounter(&htim6,delayCount);
	while(delayCount<delayValue)
	{
		delayCount=__HAL_TIM_GetCounter(&htim6);
	}
	HAL_TIM_Base_Stop(&htim6);
}

void delay_ms(uint16_t delayValue)
{
	for(int i=0;i<delayValue;i++)
	{
		delay_us(1000);
	}
}

/* USER CODE END 1 */

3.2. 打开串口调试

 usart.h文件:

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

 usart.c文件:

/* USER CODE BEGIN 1 */
int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,1000);
	return ch;
}
/* USER CODE END 1 */

3.3. 实现DHT11协议

gpio.h文件:

/* USER CODE BEGIN Private defines */
typedef enum
{
	INPUT=0,OUTPUT
}IOMODE;
#define DHT_GPIO_H    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET)
#define DHT_GPIO_L    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_RESET)
/* USER CODE END Private defines */

/* USER CODE BEGIN Prototypes */
_Bool readDht11(void);
/* USER CODE END Prototypes */

gpio.c文件:

/* USER CODE BEGIN 0 */
#include "tim.h"
#include <stdio.h>
#include "main.h"
/* USER CODE END 0 */

/* USER CODE BEGIN 1 */
uint8_t humiAndTemp[5];
_Bool status=1;
/* USER CODE END 1 */

/* USER CODE BEGIN 2 */

void dht11IOMode(IOMODE ioMode)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Pin = GPIO_PIN_6;
	if(ioMode==INPUT)
	{
		GPIO_InitStruct.Mode=GPIO_MODE_INPUT;
		GPIO_InitStruct.Pull=GPIO_PULLUP;
		HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
	}else if(ioMode==OUTPUT)
	{
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_6, GPIO_PIN_SET);
		GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
		GPIO_InitStruct.Pull=GPIO_PULLUP;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
		HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
	}
}

_Bool dht11Start(void)
{
	dht11IOMode(OUTPUT);
	DHT_GPIO_L;
	delay_ms(20);
	dht11IOMode(INPUT);
	delay_us(30);
	
	uint16_t count;
	for(count=0;count<60;count++)
	{
		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_RESET)
			break;
		delay_us(2);
	}
	if(count>=59)
	{
		LOG("dht11 start fail\n");
		return 0;
	}
	while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_RESET);
	while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_SET);
	return 1;
}

uint8_t readDht11Byte(void)
{
	uint8_t value=0;
	uint8_t count=0;
	for(uint8_t i=0;i<8;i++)
	{
		value<<=1;
		count=0;
		while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_RESET)
		{
			count++;
			if(count>=35)
			{
				status=0;
				return 0;
			}
			delay_us(2);
		}
		delay_us(38);
		if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_SET)
		{
			value|=1;
		}else{
			value|=0;
		}
		count=0;
		while(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6)==GPIO_PIN_SET)
		{
			count++;
			if(count>=35)
			{
				status=0;
				return 0;
			}
			delay_us(2);
		}
	}
	status=1;
	return value;
}

_Bool readDht11(void)
{
	uint8_t check_value=0;
	if(dht11Start()==0)
	{
		LOG("dht11 start fail\n");
		return 0;
		
	}
	for(uint8_t i=0;i<5;i++)
	{
		humiAndTemp[i]=readDht11Byte();
		if(status==0)
		{
			LOG("humiAndTemp[%d] fail\n",i);
			return 0;
			
		}
		status=1;
		if(i!=4)
		{
			check_value+=humiAndTemp[i];
		}
	}
	
	if(check_value==humiAndTemp[4])
	{
		LOG("check_value success,check_value:%d,humiAndTemp[4]:%d\n",check_value,humiAndTemp[4]);
		return 1;
	}else{
		LOG("check_value fail,check_value:%d,humiAndTemp[4]:%d\n",check_value,humiAndTemp[4]);
		return 0;
		
	}
}

/* USER CODE END 2 */

3.4. 测试代码实现

main.h文件:

/* USER CODE BEGIN Private defines */
#define OPENLOG
#ifdef OPENLOG
#define LOG(fmt, ...)          printf("<%s:%s>:"fmt"\r\n", __FILE__, __FUNCTION__, ##__VA_ARGS__)
#else
#define LOG(fmt, ...)
#endif
/* USER CODE END Private defines */

main.c文件:

  /* USER CODE BEGIN 2 */
	HAL_Delay(1000);
  /* USER CODE END 2 */

/* USER CODE BEGIN WHILE */
  while (1)
  {
		printf("hello world\n");
		if(readDht11())
		{
			printf("readDht11 success\n");
			printf("humiAndTemp[0]:%d\n",humiAndTemp[0]);
			printf("humiAndTemp[1]:%d\n",humiAndTemp[1]);
			printf("humiAndTemp[2]:%d\n",humiAndTemp[2]);
			printf("humiAndTemp[3]:%d\n",humiAndTemp[3]);
			printf("humiAndTemp[4]:%d\n",humiAndTemp[4]);

			uint16_t humi=(humiAndTemp[0]<<8) + humiAndTemp[1];
			uint16_t temp=(humiAndTemp[2]<<8) + humiAndTemp[3];
			printf("temp:%d.%d\n",temp>>8,temp&0xff);
			printf("humi:%d.%d\n",humi>>8,humi&0xff);
		}
		else
		{
			printf("readDht11 fail\n");
		}

		delay_ms(5000);
    /* USER CODE END WHILE */
    }

4. 运行效果

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32连接DHT11温湿度传感器 的相关文章

  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • linux安装llvm

    先装cmake xff0c 可以用sudo apt get install cmake或者去官网下载源码编译安装 下载llvm git clone https github com llvm llvm project git 3 Build
  • Makefile中的MAKECMDGOALS

    make 在执行时会设置一个特殊变量 xff1a 34 MAKECMDGOALS 34 xff0c 该变量记录了命令行参数指定的终极目标列表 xff0c 没有通过参数指定终极目标时此变量为空 该变量仅限于用在特殊场合 比如判断 xff0c
  • Docker切换存放目录踩坑

    因为 var 目录下的磁盘空间不足 xff0c 故把docker的存放目录切换到 data 下面 xff0c 具体步骤 xff1a 1 编辑docker配置文件 etc docker daemon json xff0c 修改data roo
  • 关于Modelsim SE-64 2020.4取消优化后不显示波形问题

    Modelsim取消优化后报错 Error suppressible vsim 12110 All optimizations are disabled because the novopt option is in effect This
  • 关于串口调试助手XCOM点击发送后卡住问题

    未成功安装CH340驱动 USB串口驱动 安装前先重启电脑 xff0c 再点击安装 串口选择错误 打开设备管理器 xff0c 查看USB连接的端口 xff08 COM xff09 号 xff0c 选择正确的端口 xff08 COM xff0
  • Makefile中Linux转Windows执行知识点

    makefile 是一个自动化编译工具 xff0c 可以简化编译过程 xff0c 自动化处理依赖关系和编译顺序 xff0c 提高了代码的可维护性 makefile 通常由一些规则和命令组成 xff0c 规则由目标 依赖和命令构成 xff0c
  • darknet2ncnn编译中 libopencv 库文件找不到

    问题描述 没有直接从 github 上下载 darknet2ncnn 包 xff0c 用的是他人提供的包 xff0c 包已经编译好 解压已经有 convert verify 文件 执行该文件 xff0c 问题描述如下 xff1a root
  • linux usb设备如何和u盘对应

    已知 usb 的 pid vid 如何对加载的u盘进行管理 思路 xff0c 找到 U盘的厂商信息中的pid和 vid 对应关系 xff0c 然后控制 U盘的加载 但是 U盘信息中没有pid 和 vid root 64 li PC sys
  • CV面试题(持续更新!!!)

    CV面试题 1 反卷积 反卷积又叫做转置卷积 xff0c 在计算机中计算的时候 xff0c 转置卷积先将卷积核转为稀疏矩阵C的形式 xff0c 然后计算的时候正向传播的时候左乘这个稀疏矩阵C的转置 xff0c 反向传播的时候左乘这个稀疏矩阵
  • 程序运行时数据保存位置

    程序运行时 xff0c 内存中有六个地方可以保存数据 1 寄存器 这是最快的保存区域 xff0c 寄存器位于处理器内部 然而寄存器的数量很有限 xff0c 所以寄存器是根据需要由编译器的分配的 我们对此没有直接的控制权限 也不可能在我们的程
  • ESP-Drone无人机控制板设计的第一个任务---绘制ESP32-S2-WROVER模块及周边电路

    第1步 xff0c 查看官方ESP Drone无人机ESP32 S2 WROVER模块的参考设计原理图 第二步 xff0c 用KiCAD绘制ESP32 S2 WROVER模块及周边电路 1 如图2 1所示 xff0c 从KiCAD的原理图符
  • ROS学习——读取摄像头数据image

    在ROS工作空间的src文件夹下创建read camera功能包 xff0c 并在包内创建include launch src cfg四个文件夹 在cfg文件夹中创建param yaml文件 xff0c 并写入以下内容 xff1a imag
  • ROS学习——控制小车转向

    给定一个旋转的角度 xff0c 让小车进行顺时针或逆时针旋转 span class token macro property span class token directive keyword include span span clas
  • PID参数设定

    在电机的控制领域 xff0c 不同的电机有不同的驱动方式 xff0c 其中应用最广泛的就是PID proportion integration differentiation 控制 P I和D分别指比例控制 xff0c 积分控制和微分控制
  • 系统编程__2__父子进程的创建和回收

    系统编程 这里写的是对于小白来说更多的了解系统编程的文章 xff0c 有写的不对的地方还恳请各位大佬指出错误 xff0c 小编一定会多多采纳 手动多谢 那么 xff0c 上一次我们稍微了解了一下关于系统编程的一些主要内容 没有看到的童鞋还请
  • php解决跨域访问

    php跨域问题解决判断 参考文章 xff1a php跨域 xff1a https blog csdn net ouxiaoxian article details 89332027 预检请求是什么 xff1a https www jians
  • 动态库与静态库的区别是什么

    区别 xff1a 1 静态库的扩展名一般为 a 或 lib xff1b 动态库的扩展名一般为 so 或 dll 2 静态库在编译时会直接整合到目标程序中 xff0c 编译成功的可执行文件可独立运行 xff1b 动态库在编译时不会放到连接的目
  • Ubuntu 使用 du 查看某个文件夹大小

    在 Ubuntu 系统中 xff0c 你可以使用 du 命令来查看文件夹的大小 例如 xff0c 如果你想查看文件夹 var log 的大小 xff0c 你可以使用如下的命令 xff1a du sh var log 其中 xff0c s 选
  • 无人机六旋翼数学建模[matlab-simulink]

    写在前面 xff0c 这篇文章是借鉴Drexel University 的Senior Design project的matlab simulink四旋翼模型 xff0c 在此基础上针对六旋翼进行的基本改进 xff0c 这里只对 43 型模
  • stm32连接DHT11温湿度传感器

    目录 1 DHT11简介 1 1 连接电路 1 2 串行接口 单线双向 2 cubeMX设置 3 代码开发 3 1 实现定时函数 3 2 打开串口调试 3 4 测试代码实现 4 运行效果 1 DHT11简介 1 1 连接电路 信息如下 xf