stm32+DHT11温湿度传感器的使用

实验目标:使用DHT11温湿度传感器与stm32F103c8t6相连接,将所测得的数据显示在OLED显示屏上。

实验器材:stm32F103c8t6    DHT11   杜邦线  OLED显示屏

实验接线图:

温湿度传感器原理:

  1. 温湿度传感器内部包含一个热敏电阻和一个湿度传感器,通过测量热敏电阻的电阻值和湿度传感器的信号来获取当前的温度和湿度值。

  2. 当传感器被激活时,热敏电阻会受到外部温度的影响而改变电阻值,通过测量电阻值的变化来计算当前的温度值。

  3. 湿度传感器使用一种特殊的电容式传感器来测量周围的湿度,通过测量电容值的变化来计算当前的湿度值。

  4. 传感器内部还包含一个微处理器,用来处理测量到的温湿度值,并将其转换成数字信号输出。

在这个实验当中,我们总共有两个模块,第一个是DHT11模块,第二个是OLED显示屏模块。

接下来将演示DHT11程序部分:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "DHT11.h"


void DHT11_Config(void)
{		
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  	GPIO_Init(GPIOA, &GPIO_InitStructure);		  

	GPIO_SetBits(GPIOA, GPIO_Pin_10);	 
}

static void DHT11_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; 
	  GPIO_Init(GPIOA, &GPIO_InitStructure);	 
}

static void DHT11_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;

  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;	

  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  	GPIO_Init(GPIOA, &GPIO_InitStructure);	 	 
}

static uint8_t Read_Byte(void)
{
	uint8_t i, temp=0;

	for (i=0; i<8; i++)    
	{	 
		while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == Bit_RESET);

		Delay_us(40);    	  

		if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == Bit_SET)
		{
			while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == Bit_SET);

			temp |= (uint8_t)(0x01 << (7 - i));
		}
		else
		{			   
			temp &= (uint8_t) ~ (0x01<<(7-i)); 
		}
	}
	return temp;
}

uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data)
{  
	DHT11_Mode_Out_PP();
	DHT11_DATA_OUT(0);
	Delay_ms(18);

	DHT11_DATA_OUT(1); 

	Delay_ms(0.03);  

	DHT11_Mode_IPU();

	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == Bit_RESET)     
	{
		while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == Bit_RESET);

		while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == Bit_SET);

		DHT11_Data -> humi_int = Read_Byte();

		DHT11_Data -> humi_deci = Read_Byte();

		DHT11_Data -> temp_int = Read_Byte();

		DHT11_Data -> temp_deci = Read_Byte();

		DHT11_Data -> check_sum= Read_Byte();


		DHT11_Mode_Out_PP();
		DHT11_DATA_OUT(1);

		if (DHT11_Data -> check_sum == DHT11_Data -> humi_int + DHT11_Data -> humi_deci + DHT11_Data -> temp_int + DHT11_Data -> temp_deci)
			return SUCCESS;
		else 
			return ERROR;
	}
	else
	{		
		return ERROR;
	}   
}


主函数部分:

#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "DHT11.h"

DHT11_Data_TypeDef DHT11_Data;

int main(void)
{
	OLED_Init();
	DHT11_Config();
	
	OLED_ShowString(1, 1, "temp:");
	OLED_ShowString(2, 1, "humi:");
	
	while (1)
	{
		
		if(Read_DHT11(&DHT11_Data) == SUCCESS)
		{
			OLED_ShowNum(2, 6, DHT11_Data.humi_int, 2);
			OLED_ShowString(2, 8, ".");
			OLED_ShowNum(2, 9, DHT11_Data.humi_deci, 2);
			
			OLED_ShowNum(1, 6, DHT11_Data.temp_int, 2);
			OLED_ShowString(1, 8, ".");
			OLED_ShowNum(1, 9, DHT11_Data.temp_deci, 1);
			
		}
	}
}

执行结果如下图所示:

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值