返回首页

SHT11和DHT11的区别

来源:www.ahlulin.com   时间:2023-04-08 14:48   点击:300  编辑:华善   手机版

SHT11和DHT11的区别

SHT11和DHT11的区别为:湿敏部件不同、包含不同、功能不同。

一、湿敏部件不同

1、SHT11:SHT11核心部件采用湿敏电容,成本高,稳定性好。

2、DHT11:DHT11核心部件采用湿敏电阻,其成本低,贺野咐稳定性差。

二、包含不同

1、SHT11:SHT11包括一个湿敏元件和一个用能隙材料制成的温度敏感元件。

2、DHT11:DHT11包括一个湿敏元件和一个脊烂NTC测温元件,并与一个高性能8位单片机相连接。

三、功能不同

1、SHT11:SHT11可禅纯以提供温度补偿的湿度测量值和高质量的露点计算功能。

2、DHT11:DHT11可以提供温度补偿的湿度测量值,但不能提供高质量的露点计算功能。

我只用过DHT11,接线只用3根辩手,VCC、GND、DATA,通信过程开始由主机通过DATA线向DHT11发送启动信号,DHT11接到信号后返回一个应答信号,主机接受到应答信号便可开始接受40位的温湿度数据(8bit湿度整数+8bit湿度小数+8bit温度整数携前嫌+8bit温度小数+8bit校验和),详细过程参考datasheet吧。SHT11好像还需要一根SCK时钟悔迅线,通信过程应该差不多,通信的高低电平持续时间需要准确的控制。你看看datasheet就知道了。

STM32-DHT11温湿度传感器寄存器版本

#include <stm32f4xx.h>

#include DHT11.h

#include TIM6.h

/*

函数功能:GPIO输出配置

函数参数:

返 回 值:

说    明:PC0 -DATA

*/

void DHT11_OUT1()

{

//时钟使能

RCC->AHB1ENR |= (1 << 2);

//设置GPIO工作模式

GPIOC->MODER &= ~(3 << 0);

GPIOC->MODER |=  (1 <散饥< 0);

//设置输出模式(TW)

GPIOC->OTYPER &= ~(1 << 0);

//速度(50MHZ)

GPIOC->OSPEEDR &= ~(0x3 << 0);

GPIOC->OSPEEDR |=  (0x2 << 0);

//设置上下拉(上)

GPIOC->PUPDR &= ~(0x3 << 0);

GPIOC->PUPDR |=  (0x1 << 0);

TIM6_delayms(1000);

//设置初始状态(空闲状态)

GPIOC ->ODR |=  (1 << 0);

}

/*

函数功能:GPIO输入配置

函数参数:

返 回 值:

说    明:PC0 -DATA

*/

void DHT11_IN()

{

RCC->AHB1ENR |= (1 << 2);

//设置GPIO工作模式

GPIOC->MODER &= ~(3 << 0);

GPIOC->PUPDR &= ~(0x3 << 0);

GPIOC->PUPDR |=  (0x1 << 0);

}

/*

函数功能:DHT11 开始信号 & 接收应答

函数参数:

返 回 值:0:有应答 1:无应答

说    明:

*/

u8 DHT11_Start_ACK()

{

u8 overtime = 0;

//设置GPIO为输出模式

DHT11_OUT1();

//拉低总线

DHT11_DATA_L;

// (GPIOC->ODR &= ~(1 << 0));

//延时18ms以上

TIM6_delayms(20);

//拉高总线

DHT11_DATA_H;

// (GPIOC->ODR |=  (1 << 0));

//切换为输入模式

DHT11_IN();

//等待应答

while(DHT11_DATA)

{

TIM6_delayus(1);

overtime ++;

if(overtime > 50)

return 1;

}

//等待应答结束

overtime = 0;

while(!DHT11_DATA)

{

TIM6_delayus(1);

overtime ++;

if(overtime > 90)

return 1;

}

return 0;

}

/*

函数功能:DHT11 接收一个字节

函数参数:

返 回 值:接收到的数据

说早岁    明:

*/

u8 DHT11_Read_byte()

{

u8 data = 0;

u8 i;//循环变量

for(i=0;i<陆掘睁8; i++)

{

//等待时隙结束

while(!DHT11_DATA);

//判断当前位是0还是1

TIM6_delayus(40);

if(DHT11_DATA)

{

data |= (0x80 >> i);

// TIM6_delayus(30);

}

while(DHT11_DATA);

}

return data;

}

/*

函数功能:DHT11 读取温湿度数据

函数参数:double *temp:温度存储单元

double *humi:湿度存储单元

返 回 值:0:采集成功 1:采集失败

说    明:

*/

u8 DHT11_Read_data(double *temp,double *humi)

{

u8 data[5];

  u8 ack;

ack = DHT11_Start_ACK();

//发送开始信号并接收应答

if(ack != 0)

{

return 1;//应答错误

}

//等待接收数据

while(DHT11_DATA);

//接收5个数据

data[0] = DHT11_Read_byte();

data[1] = DHT11_Read_byte();

data[2] = DHT11_Read_byte();

data[3] = DHT11_Read_byte();

data[4] = DHT11_Read_byte();

//校验数据

if(data[4] != ((data[0]+data[1]+data[2]+data[3]) & 0xFF))

return 1;//

//计算温湿度值

*temp = data[2] + data[3] / 10.0;

*humi = data[0] + data[1] / 10.0;

return 0;

}

需要声明头文件

通过串口打印出温度和湿度值

if(DHT11_Read_data(&humi_val,&temp_val) == 0)

{

printf(humi = %5.2f temp=%5.2f\r\n,humi_val,temp_val);

}

else

{

printf(humi temp read error\r\n);

}

S

顶一下
(0)
0%
踩一下
(0)
0%