打印
[PIC®/AVR®/dsPIC®产品]

CuriosityNano测评报告】+驱动温湿度传感器DHT22

[复制链接]
2443|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dql2015|  楼主 | 2021-5-30 18:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


在上一期的测评中,使用AVR128DB48 Curiosity Nano成功驱动了温湿度传感器,
【CuriosityNano测评报告】+使用IO驱动单总线温湿度传感器DHT22
https://bbs.21ic.com/icview-3119748-1-1.html
这里就不再介绍DHT22了,这次将代码移植到PIC18F16Q40 Curiosity Nano上,有2个需要注意的地方:1是MCC生成的关于gpio设置上拉的接口不一致,MCC为AVR128DB48生成的代码gpiox_SetPullUp()而为PIC18F16Q40生成的代码是gpiox_SetPullup()呵呵哒,仅仅是一个大小写的问题,为啥api接口不一致呢???
2是PIC18F16Q40 的串口printf函数可以打印浮点数,而AVR128DB48的不行。
因此两者的驱动略有区别,稍微修改即可。
dht.h文件内容如下:
/* 
* File:   dht.h
* Author: qldeng
*
* Created on May 29, 2021, 12:17 PM
*/

#ifndef DHT_H
#define        DHT_H

#ifdef        __cplusplus
extern "C" {
#endif

#include "mcc_generated_files/mcc.h"

#define delay_ms(d)                DELAY_milliseconds(d)
#define delay_us(d) DELAY_microseconds(d)

#define  u8 uint8_t
#define  u16 uint16_t

u8 DHT22_Init(void);                       
u8 DHT22_Read_Data(float *temperature,float *humidity);   
u8 DHT22_Read_Byte(void);               
u8 DHT22_Read_Bit(void);               
u8 DHT22_Check(void);                       
void DHT22_Rst(void);


#ifdef        __cplusplus
}
#endif

#endif        /* DHT_H */

dht.c文件内容如下:

#include "dht.h"
//工作电压 :3.3V ~ 5.5 V
//复位DHT22
void DHT22_Rst(void)          
{  
    DHT22_SetDigitalOutput();
    DHT22_SetLow();        //拉低DQ
    delay_ms(30);            //拉低至少18ms
    DHT22_SetHigh();        //DQ=1
    delay_us(30);             //主机拉高20~40us
}
//等待DHT22的回应
//返回1:未检测到DHT22的存在
//返回0:存在
u8 DHT22_Check(void)           
{   
        u8 retry=100;
    DHT22_SetDigitalInput();
     DHT22_SetPullup();
           while ((DHT22_GetValue())&&retry)//DHT22会拉低40~80us
        {
                retry--;
                delay_us(1);
        };         
        if(retry<1) return 1;
        else retry=100;
    while (!DHT22_GetValue()&&retry)//DHT22拉低后会再次拉高40~80us
        {
                retry--;
                delay_us(1);
        };
        if(retry<1)
                return 1;            
        return 0;
}
//从DHT22读取一个位
//返回值:1/0
u8 DHT22_Read_Bit(void)                          
{
        u8 dat=0;
        u8 retry=100;
        while((DHT22_GetValue())&&retry)//等待变为高电平
        {
                retry--;
                delay_us(1);
        }
        retry=100;  
        while(!DHT22_GetValue()&&retry)//等待变低电平
        {
                retry--;
                delay_us(1);
        }
    delay_us(40);//wait 40us
        if(DHT22_GetValue())
                dat=1;
        else
                dat=0;               
   
        return dat;       
}
//从DHT22读取一个字节
//返回值:读到的数据
u8 DHT22_Read_Byte(void)   
{        
    u8 i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
                   dat<<=1;
            dat|=DHT22_Read_Bit();
    }                                                    
    return dat;
}
//从DHT22读取一次数据
//temp:温度值(范围:-40°C ~ 80°C 分辨率:0.1°C 精度:±0.5℃)
//humi:湿度值(范围:0%RH ~ 99.9%RH 分辨率:0.1%RH 精度:±2%RH (25°C))
//返回值:0,正常;1,读取失败
u8 DHT22_Read_Data(float *temperature,float *humidity)   
{        
        u8 buf[5];
        u8 i;
        u8 sum;
        *humidity=0;
        *temperature=0;
        DHT22_Rst();
        if(DHT22_Check()==0)
        {
                for(i=0;i<5;i++)
                {
                        buf[i]=DHT22_Read_Byte();
                }
                sum = buf[0]+buf[1]+buf[2]+buf[3];
                if(sum == buf[4])
                {
                        *humidity=(float)((buf[0]<<8)+buf[1])/10.0;
                        *temperature=(float)((buf[2]<<8)+buf[3])/10.0;
                }
                else
                {
                        *humidity=(float)((buf[0]<<8)+buf[1])/10.0;
                        *temperature=(float)((buf[2]<<8)+buf[3])/10.0;
                }
        }
        else
        {
                return 1;
        }
        return 0;         
}
//初始化DHT22同时检测DHT22的存在
//返回1:不存在
//返回0:存在             
u8 DHT22_Init(void)
{
    DHT22_SetDigitalOutput();
    DHT22_SetHigh();
        DHT22_Rst();
        return DHT22_Check();
}

主函数调用驱动并打印结果:

接线:使用的是RC2

串口打印结果:


测试工程源码
PIC18F16Q40CuriosityNanoTest.X.rar (705.66 KB)

使用特权

评论回复
沙发
usysm| | 2021-6-4 13:35 | 只看该作者

为什么温湿度传感器dht21比dht11贵那么多

使用特权

评论回复
板凳
i1mcu| | 2021-6-4 13:36 | 只看该作者
DHT22 如何读取数据

使用特权

评论回复
地板
i1mcu| | 2021-6-4 13:36 | 只看该作者
PIC18F47Q10 Curiosity Nano评估工具包具有完整的编程和调试功能  

使用特权

评论回复
5
pmp| | 2021-6-4 13:37 | 只看该作者
DHT22和DHT11的驱动能相互移植吗

使用特权

评论回复
6
mmbs| | 2021-6-4 13:38 | 只看该作者
CuriosityNano测评  

使用特权

评论回复
7
1988020566| | 2021-6-4 13:38 | 只看该作者
通过内置电容式湿度传感器和热敏电阻来测量周围的空气  

使用特权

评论回复
8
lzbf| | 2021-6-4 13:39 | 只看该作者
DHT22的技术应用   

使用特权

评论回复
9
youtome| | 2021-6-4 13:39 | 只看该作者
大多都是使用DHT11   

使用特权

评论回复
10
jimmhu| | 2021-6-4 13:39 | 只看该作者
温湿度模块DHT11和DHT22都不错  

使用特权

评论回复
11
xiaoyaozt| | 2021-6-4 13:40 | 只看该作者
谢谢楼主的资料。     

使用特权

评论回复
12
1988020566| | 2021-6-4 13:40 | 只看该作者
AM2302吧   

使用特权

评论回复
13
mmbs| | 2021-6-4 13:40 | 只看该作者
使用Curiosity Nano板     

使用特权

评论回复
14
pmp| | 2021-6-4 13:40 | 只看该作者
SHT11目前不支持这个功能  

使用特权

评论回复
15
i1mcu| | 2021-6-4 13:40 | 只看该作者
PIC16F15244Curiosity Nano评估工具包

使用特权

评论回复
16
usysm| | 2021-6-4 13:40 | 只看该作者
DHT22 SHT11 这两种温湿度传感器哪一种好

使用特权

评论回复
17
jimmhu| | 2021-6-4 13:41 | 只看该作者
SHT10与DHT22的精度比较   

使用特权

评论回复
18
youtome| | 2021-6-4 13:41 | 只看该作者
DHT22效果不错   

使用特权

评论回复
19
lzbf| | 2021-6-4 13:41 | 只看该作者
DHT22的设计资料  

使用特权

评论回复
20
i1mcu| | 2021-6-4 13:41 | 只看该作者
DHT22单总线不支持寻址?   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

375

帖子

8

粉丝