智能家居:温湿度传感器
–
前言
此模块用于智能家居项目中
项目中含有模块:
- 温湿度传感器
- 光照强度传感器
- ONENET-MQTT服务器
一、DHT11
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性
与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件,并
与一个高性能 8 位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰
能力强、性价比极高等优点。
二、步骤
1.初始化
代码如下(示例):
void DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_GPIO, &GPIO_InitStructure);
}
其中DHT11_GPIO 、DHT11_PIN 可根据自己需求定,方便移植
#define DHT11_GPIO GPIOA
#define DHT11_PIN GPIO_Pin_0
#define DHT11_High GPIO_SetBits(DHT11_GPIO,DHT11_PIN)
#define DHT11_Low GPIO_ResetBits(DHT11_GPIO,DHT11_PIN)
#define DHT11_Input GPIO_ReadInputDataBit(DHT11_GPIO,DHT11_PIN)
2.数据读取配置
DHT11 需要主机发送开始信号过后,才能接收DHT11的相应。所以需要对IO口输入输出进行切换。
代码如下:
/*
1: 输出 0:输入
*/
void DHT11_Read_OUT_Intput(u8 cmd)
{
GPIO_InitTypeDef GPIO_InitStructure;
if(cmd)
{
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_GPIO, &GPIO_InitStructure);
}else{
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(DHT11_GPIO, &GPIO_InitStructure);
}
}
总线空闲状态为高电平。主机发送开始信号,先把总线拉低,拉低必须大于18毫秒,保证DHT11能检测到起始信号。主机发送开始信号结束后,把总线电平拉高,延时等待20-40us后,读取DHT11的响应信号。DHT11接收到主机的开始信号后,然后发送80us低电平响应信号,然后发送80us高电平响应信号。结束后开始发送数据。
数据格式:
8bit湿度整数数据 8bit湿度小数数据 8bi温度整数数据 8bit温度小数数据 8bit校验和
相关配置代码如下(示例):
u8 DHT11_Read_Huim_Temp(u8* HuimH,u8* HuimL,u8* TempH,u8* TempL)
{
u8 Data[5];
u8 i=0;
//主机信号
DHT11_Read_OUT_Intput(1);
DHT11_Low;
delay_ms(20); //先拉低18ms
DHT11_High;
delay_us(40);
DHT11_Read_OUT_Intput(0);
//DHT11信号
while((DHT11_Input == Bit_RESET) && ( Time<1000)); //低电平是否过去
Time = 0;
while((DHT11_Input == Bit_SET) && ( Time <1000)); //高电平是否过去
Time = 0;
for (i=0;i<5;i )
{
Data[i] = DHT11_Read_Byte();
}
delay_ms(500);
if((Data[0] Data[1] Data[2] Data[3])==Data[4])
{
*HuimH = Data[0];
*HuimL = Data[1];
*TempH = Data[2];
*TempL = Data[3];
}
else{
return 1;
}
return 0;
}
每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。
数字0:高电平为26-28us
数字1:高电平70us
代码如下:
u8 DHT11_Read_Byte(void)
{
u8 n;
u8 Data = 0;
for(n=0;n<8;n )
{
DHT11_Read_OUT_Intput(0);
while((DHT11_Input == Bit_RESET) && ( Time <1000)); //等待高电平 1ms 超时
Time = 0;
Data<<=1;
delay_us(40); // 0 26-28us 40us 70us
if(DHT11_Input == Bit_SET)
{
Data |= 0x01;
while((DHT11_Input == Bit_SET) && ( Time <1000)); //等待高电平 1ms 超时
Time = 0;
}
}
return Data;
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhhabjgi
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13