基于STM32F103C8T6单片机的DHT11温湿度传感器与OLED显示屏实时动态数据监测系统设计

news2024/11/16 21:50:40

标题:

摘要:
本文提出了一种利用STM32F103C8T6微控制器,结合DHT11数字温湿度传感器和OLED显示屏实现环境温湿度实时、直观显示的方法。该系统通过低功耗且精确的DHT11传感器获取环境温湿度信息,并借助于STM32F103C8T6强大的处理能力和I/O资源进行数据读取、解析以及控制OLED屏幕显示。研究内容包括硬件接口设计、软件程序开发以及实际应用测试。

一、引言
随着物联网技术的发展和智能设备的需求增长,对环境参数(如温度和湿度)的实时监控显得尤为重要。本研究旨在设计并实现一个以STM32F103C8T6为核心,搭配DHT11温湿度传感器和OLED显示屏的低成本、高效率实时温湿度监测系统。

二、系统设计与实现
1. 硬件设计:阐述了如何将DHT11温湿度传感器与STM32F103C8T6的GPIO端口连接,以及采用何种通信协议进行数据交互。同时描述了OLED显示屏的选型、接口设计及其与STM32F103C8T6的I2C或SPI连接方式。

2. 软件设计与算法实现:详细介绍了STM32F103C8T6下驱动DHT11读取温湿度数据的具体流程,包括数据包的接收、解码及错误检测机制;同时,说明了如何编写OLED显示屏驱动程序,实现数据显示格式的定制与刷新操作。

三、实验结果与分析
进行了系统的功能验证和性能测试,展示了系统在不同环境条件下的温湿度采集精度和响应速度,并对比分析了显示效果和系统稳定性。

四、结论
总结了基于STM32F103C8T6的DHT11-OLED温湿度监测系统的设计成果,强调其在智能家居、环境监测等领域的广泛应用前景,同时讨论了未来可能的技术优化方向。

关键词:STM32F103C8T6;DHT11温湿度传感器;OLED显示屏;实时监测;嵌入式系统设计

注意:由于论文写作需配合实际项目进展和实验数据,上述提纲仅供参考,具体撰写时需根据实际工作细节和实验数据来填充和完善。

#include "dht11.h"
#include "delay.h"

void DHT11_IO_OUT(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE);	 
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 
	
	
 	GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;				 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);				 
}

void DHT11_IO_IN(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE);	 
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);     
	
 	GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;				 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 		 
 	GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);				 
}


void DHT11_Rst(void)	   
{                 
	DHT11_IO_OUT(); 	
  DHT11_DQ_OUT=0; 	
  delay_ms(20);    	
  DHT11_DQ_OUT=1; 	
	delay_us(30);     	
}

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

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);//等待40us
	if(DHT11_DQ_IN)return 1;
	else return 0;		   
}

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

uint8_t Read_DHT_Data(uint8_t *temp,uint8_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];
						*(humi + 1)=buf[1];
						*temp=buf[2];
						*(temp + 1)=buf[3];
				}
		}
		else
		{
				return 1;
		}			
		return 0;	    
}
   	 
uint8_t DHT11_INIT(void)
{	 		    
		DHT11_Rst();  
		return DHT11_Check();
} 







#ifndef __DHT11_H
#define __DHT11_H 
#include "sys.h"   
										   
#define	DHT11_DQ_OUT PAout(7) //数据端口	PA15 
#define	DHT11_DQ_IN  PAin(7)  //数据端口	PA15

#define DHT11_GPIO_PORT    	GPIOA			              //GPIO端口
#define DHT11_GPIO_CLK 	    RCC_APB2Periph_GPIOA		//GPIO端口时钟
#define DHT11_GPIO_PIN		GPIO_Pin_7			        //连接到SCL时钟线的GPIO

uint8_t DHT11_INIT(void);//初始化DHT11
uint8_t Read_DHT_Data(u8 *temp,u8 *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















main

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "oled.h"

#include "string.h"

#include "DHT11.h" 

int main(void)
{
		uint8_t wendu[2] = {0};																		//wendu[0]:存储温度数据整数,wendu[1]:存储温度数据小数	
		uint8_t shidu[2] = {0};	
	
		delay_init();
	
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);						//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
		
		
		
		
		
		
		
		
		
		
		
		DHT11_INIT();
		
		OLED_Init();			//初始化OLED  
		
		OLED_Clear();
		
		OLED_ShowCHinese(0,0,0);//温
		OLED_ShowCHinese(18,0,1);//度
		OLED_ShowString(36,0,":",16);
		OLED_ShowCHinese(92,0,4);//摄氏度符号
		
		OLED_ShowCHinese(0,2,3);//湿
		OLED_ShowCHinese(18,2,1);//度
		OLED_ShowString(36,2,":",16);
		OLED_ShowString(93,2,"%",16);
		OLED_ShowString(105,2,"RH",16); 
		
		while(1)
		{
				Read_DHT_Data(wendu, shidu);	
			
				OLED_ShowNum(54,0,wendu[0],2,16);//温度整数
				OLED_ShowString(72,0,".",16);	 	 //小数点
				OLED_ShowNum(74,0,wendu[1],2,16);//温度小数
			
				OLED_ShowNum(54,2,shidu[0],2,16);//湿度整数
				OLED_ShowString(72,2,".",16);		 //小数点
				OLED_ShowNum(74,2,shidu[1],2,16);//湿度小数
			
				delay_ms(1000);
		}
}


 后续会更新连接阿里云平台的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1377628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从“唯分论”到“过程评价” 助力教育高质量发展

近日,为推动教育评价改革工作高质量发展,山东省委办公厅、省政府办公厅印发《关于进一步推进教育评价改革工作的若干措施》,从学校评价改革、学生评价改革等6方面共提出25条举措,对教育评价改革进行了全面部署。 教育评价改革是教育改革的“牛鼻子”,为教育发展提供了明确的方…

Spring事务失效场景之类内部方法调用及解决方案

一、背景 在日常开发中&#xff0c;经常有需要使用事务来保证数据一致性的情况。简单点的话直接在方法上面加Transactional注解就可以了。 但这样存在一个问题&#xff0c;在整个业务方法层面加注解会把很多并不需要归入事务的操作也归入到了事务里面&#xff0c;这样会可能会…

Linux反向、分离解析与主从复制

前言 上篇介绍了DNS正向解析&#xff0c;本文将继续介绍反向解析与主从复制等内容。域名反向解析即从IP地址到域名的映射。为了完成逆向域名解析&#xff0c;系统提供一个特别域&#xff0c;该特别域称为逆向解析域。 目录 前言 一、反向解析 1. 配置bind服务 2. 修改区…

【linux】tcpdump 使用

tcpdump 是一个强大的网络分析工具&#xff0c;可以在 UNIX 和类 UNIX 系统上使用&#xff0c;用于捕获和分析网络流量。它允许用户截取和显示发送或接收过网络的 TCP/IP 和其他数据包。 一、安装 tcpdump 通常是默认安装在大多数 Linux 发行版中的。如果未安装&#xff0c;可…

【MATLAB源码-第108期】基于matlab的OFDM-OQAM系统仿真,包含PHYDYAS滤波器模块和PNN结构,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM/OQAM&#xff08;正交频分复用/正交四分之一幅度调制&#xff09;是一种高效的无线通信系统&#xff0c;采用PHYDYAS&#xff08;物理层动态接入&#xff09;滤波器来优化性能。这种系统的设计主要目的是提高频谱效率、…

【工具栏】Rainbow Brackets(彩虹括号) 插件的安装和使用

使用前 这一段代码里有这么多括号&#xff0c;找到相匹配的括号需要花点时间 &#xff0c;但是安装Rainbow Brackets插件后&#xff0c;代码在括号方面多一份美观 安装 效果如下&#xff1a;

Cmake 中的list介绍

这个链接非常好&#xff0c;都有例子。 https://www.jianshu.com/p/89fb01752d6f

考研英语高频打卡

高频词汇13——15抽背答案 1、colleague /ˈkɒliːɡ/ 考频20&#xff08;英一12 次&#xff0c;英二8 次&#xff09; n. 同事&#xff0c;同僚 2、despite /dɪˈspaɪt/ 考频19&#xff08;英一12 次&#xff0c;英二7 次&#xff09; prep. 不管&#xff0c;不顾 3、overa…

数字化新时代,智慧社区再升级:低代码平台助您轻松打造

随着科技的飞速发展&#xff0c;社区的数字化转型已成为大势所趋。党的二十大报告提出&#xff0c;要“完善网格化管理、精细化服务、信息化支撑的基层治理平台&#xff0c;健全城乡社区治理体系”&#xff0c;更是为社区数字化建设&#xff0c;打造智慧社区指明了方向和路径。…

软件测试|如何使用pycharm实现批量替换

简介 PyCharm是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了许多实用的功能来提高开发效率。其中&#xff0c;替换功能是一个非常有用的工具&#xff0c;它可以帮助开发者快速地在代码中查找并替换特定的文本。本文将详细介绍PyCharm的替换…

腾讯NUS推出下一代多模态智能,支持2/3D视觉、听觉、触觉、脑电

多模态感知一直是通用人工智能发展的关键领域。理想中的智能体能像人类一样感知多种模态信息&#xff0c;如视觉、听觉、嗅觉、触觉等&#xff0c;并与用户进行自然交互。然而&#xff0c;现有的大型模型虽然在图像和文字上表现出色&#xff0c;但对其他模态&#xff08;如3D点…

韩国LG集团在 CES2024 消费电子展上发布的的无线透明OLED屏幕

国际消费类电子产品展览会&#xff08;International Consumer Electronics Show&#xff0c;简称CES&#xff09;&#xff0c;由美国电子消费品制造商协会&#xff08;简称CTA&#xff09;主办&#xff0c;旨在促进尖端电子技术和现代生活的紧密结合。该展始于1967年&#xff…

超维空间M1无人机使用说明书——61、ROS无人机物体识别与精准投放

引言&#xff1a;基于空中物流的项目背景。我们提供了使用基于诗句的物体识别和精准投放、降落。实现原理如下&#xff1a; 1、在ROS下使用机载电脑实现物体识别 2、记载电脑根据反馈的位置发布运动控制指令 3、PX4解析机载电脑发布的命令&#xff0c;作出运动控制 4、设置…

PHP在线考试平台管理系统源码带文字搭建教程和操作手册

PHP在线考试平台管理系统源码带文字搭建教程和操作手册 技术架构 PHP7.2 Thinkphp6 React UmiJs nginx mysql5.7 cnetos7以上 宝塔面板 系统功能特性与介绍 采用PHP7强类型&#xff08;严格模式&#xff09;。 题库管理 支持多种试题类型和录题方式。 考生管理 快速导入考…

Maven的pom文件引用以及下载失败

背景&#xff1a;项目中使用到新版本的aspose-words组件&#xff0c;但是引用失败&#xff1b; pom.xml中引用,但是maven 仓库没有aspose-words 后续版本&#xff0c;所以需要在pom中配置 aspose-words的官网。 <dependencies><dependency><groupId>com.as…

x-cmd pkg | czg - git commit 智能生成工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 czg 源于 commitizen/cz-cli 交互插件中 cz-git 的延伸项目&#xff0c;重新使用 TypeScript 编写的零依赖独立的 Node.js 命令行工具。旨在使用交互友好的方式&#xff0c;辅助用户生成规范的 git commit message 约…

性能监控软件选择攻略

随着企业对应用程序性能的关注度不断增加&#xff0c;选择适当的性能监控软件变得至关重要。性能监控软件能够帮助企业实时追踪应用程序的性能指标&#xff0c;识别潜在问题并提高系统的稳定性。在选择性能监控软件时&#xff0c;以下攻略将有助于确保您的选择符合业务需求并能…

C#超市管理系统源码

C#超市管理系统源码 功能齐全的超市管理系统&#xff0c;专门美化过UI 请先附加数据库&#xff0c;否则无法进入系统 默认拥有最高权限账户为经理&#xff0c;密码为admin 压缩包内有使用说明

【c++】入门4

内联函数声明和定义不能分开 inline不建议声明和定义分离&#xff0c;分离会导致链接错误。因为inline被展开&#xff0c;就没有函数地址 了&#xff0c;链接就会找不到。 auto关键字 随着程序越来越复杂&#xff0c;程序中用到的类型也越来越复杂&#xff0c;经常体现在&…

依赖注入的优缺点与最佳实践

1 什么是依赖注入 依赖注入&#xff0c;全称Dependency Injection&#xff0c;简称DI。 在我们深入探讨之前&#xff0c;先来聊聊“依赖”和“注入”这两个比较术语的词。打个比方&#xff0c;你可以把“依赖”想象成电器设备的外接电线&#xff0c;而“注入”就像是把这根电…