查看: 1727|回复: 3

[原创] 【高校争霸赛】智能家居进度②——读取温湿度数据

[复制链接]
  • TA的每日心情
    开心
    2017-11-15 10:33
  • 签到天数: 79 天

    [LV.6]常住居民II

    89

    主题

    2169

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    1779
    最后登录
    2020-8-22
    发表于 2016-11-13 13:43:49 | 显示全部楼层 |阅读模式
    所属团队:济南大学 1209Lab
    继上一篇帖子,这一篇主要介绍使用LPC824lite读取温湿度传感器的过程

    首先关于温湿度的选型:市面上大致有两种温湿度模块,一种是数字式单总线的,如笔者使用的DHT11 QQ截图20161113133647.jpg

    另一种是模拟型的,我也使用过,如AM1001 QQ截图20161113133610.jpg 两者就读取上有区别,其他差别不大。但是我用LPC824的ADC读取AM1001的湿度的时候显示一个定值2.5V,用其他型号的单片机和电压表测量均正常,一直没找到原因,换了3个模块都是这样。最后还是放弃了,选用单总线数字温湿度传感器DHT11,但在移植DHT11的时候,遇到的问题主要是时序的延时要精准,否则读出的数据不对。在经历了这些问题后,笔者终于将温湿度传感器的数据读出来了。 QQ截图20161113133020.jpg

    最后附上源代码和DHT11的资料

    #include "include.h"

    #define TICKRATE_HZ    1000

    /*************************************************************************
    *                     1 2 0 9 电 机 拖 动 实 验 室
    *  函数名称:main
    *  功能说明:主函数
    *  参数说明:无
    *  函数返回:无
    *  修改时间:2016年11月10日
    *  备       注:无
    *  作    者:何昌昕
    *************************************************************************/
    int main(void)
    {
        uint8_t hum,tem;
        SystemCoreClockUpdate();
        //Board_Init();
        uart_Init(LPC_USART0,115200);
        uart_Init(LPC_USART1,115200);
        uart_Init(LPC_USART2,9600);
        IIC_Init();
        BH1750_Init();
        SysTick_Config(SystemCoreClock / TICKRATE_HZ);
        DHT11_Init();

        //IR_SendCmd(LPC_USART2,0x46);
        /*Chip_UART_IntEnable(LPC_USART0, UART_INTEN_RXRDY);
      NVIC_EnableIRQ(UART0_IRQn);
        Chip_UART_IntEnable(LPC_USART1, UART_INTEN_RXRDY);
        NVIC_EnableIRQ(UART1_IRQn);
        Chip_UART_IntEnable(LPC_USART2, UART_INTEN_RXRDY);
        NVIC_EnableIRQ(UART2_IRQn);*/
       
        while(1)
        {      
             DHT11_Read_Data(&tem,&hum);
             printf("temp:%d℃ hum:%d%%\r\n",tem,hum);
             delay_ms(100);
        //uart_ConfirmData();        
            //printf("%d\r\n",BH1750_GetData());   
            //uart_PutStr(LPC_USART2,"test\r\n");
        }
    }

    /*----------------------------end of main.c-------------------------------*/

    #include "DHT11.h"

    #define DHT11_OUT     Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 22, true)
    #define DHT11_IN      Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 22, false)
    #define DHT11_State         Chip_GPIO_PinGetState(LPC_GPIO_PORT, 0, 22)
    #define DHT11_High         Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, 22, true)
    #define DHT11_Low          Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, 22, false)

    /*************************************************************************
    *                     1 2 0 9 电 机 拖 动 实 验 室
    *  函数名称HT11_Init
    *  功能说明:初始化DHT11的IO口 DQ 同时检测DHT11的存在
    *  参数说明:无
    *  函数返回:返回1:不存在 返回0:存在
    *  修改时间:2016年5月30日
    *  备       注:无
    *  作    者:何昌昕
    *************************************************************************/        
    uint8_t DHT11_Init(void)
    {
        DHT11_OUT;
        DHT11_High;               
        DHT11_Rst();
        return DHT11_Check();
    }

    /*************************************************************************
    *                     1 2 0 9 电 机 拖 动 实 验 室
    *  函数名称HT11_Rst
    *  功能说明HT11复位函数
    *  参数说明:无
    *  函数返回:无
    *  修改时间:2016年5月30日
    *  备       注:无
    *  作    者:何昌昕
    *************************************************************************/
    void DHT11_Rst(void)      
    {                 
          DHT11_OUT;         //设置输出
        DHT11_Low;         
        delay_ms(20);   //拉低至少18ms
        DHT11_High;        
          delay_us(30);   //主机拉高20~40us
    }

    /*************************************************************************
    *                     1 2 0 9 电 机 拖 动 实 验 室
    *  函数名称HT11_Check
    *  功能说明:等待DHT11的回应
    *  参数说明:无
    *  函数返回:返回1:未检测到DHT11的存在  返回0:存在
    *  修改时间:2016年5月30日
    *  备       注:无
    *  作    者:何昌昕
    *************************************************************************/
    uint8_t DHT11_Check(void)        
    {   
        uint8_t retry=0;
        DHT11_IN;//SET INPUT     
      while (DHT11_State&&retry<100)//DHT11会拉低40~80us
        {
            retry++;
            delay_us(1);
        };     
        if(retry>=100)return 1;
        else retry=0;
        while (!DHT11_State&&retry<100)//DHT11拉低后会再次拉高40~80us
        {
            retry++;
            delay_us(1);
        };
        if(retry>=100)return 1;        
        return 0;
    }

    /*************************************************************************
    *                     1 2 0 9 电 机 拖 动 实 验 室
    *  函数名称HT11_Read_Bit
    *  功能说明:从DHT11读取一个位
    *  参数说明:无
    *  函数返回:返回1:未检测到DHT11的存在  返回0:存在
    *  修改时间:2016年5月30日
    *  备       注:无
    *  作    者:何昌昕
    *************************************************************************/
    uint8_t DHT11_Read_Bit(void)              
    {
         uint8_t retry=0;
        while(DHT11_State&&retry<100)//等待变为低电平
        {
            retry++;
            delay_us(1);
        }
        retry=0;
        while(!DHT11_State&&retry<100)//等待变高电平
        {
            retry++;
            delay_us(1);
        }
        delay_us(50);//等待40us
        if(DHT11_State)return 1;
        else return 0;           
    }

    /*************************************************************************
    *                     1 2 0 9 电 机 拖 动 实 验 室
    *  函数名称HT11_Read_Bit
    *  功能说明:从DHT11读取一个位
    *  参数说明:无
    *  函数返回:返回1:未检测到DHT11的存在  返回0:存在
    *  修改时间:2016年5月30日
    *  备       注:无
    *  作    者:何昌昕
    *************************************************************************/
    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;
    }

    /*************************************************************************
    *                     1 2 0 9 电 机 拖 动 实 验 室
    *  函数名称HT11_Read_Data
    *  功能说明:从DHT11读取一次数据
    *  参数说明:无
    *  函数返回:返回值:0,正常;1,读取失败
    *  修改时间:2016年5月30日
    *  备       注:temp:温度值(范围:0~50°) humi:湿度值(范围:20%~90%)
    *  作    者:何昌昕
    *************************************************************************/
    uint8_t DHT11_Read_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=DHT11_Read_Byte();
            }
            if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
            {
                *humi=buf[0];
                *temp=buf[2];
            }
        }else return 1;
        return 0;        
    }

    /*************************************************************************
    *                     1 2 0 9 电 机 拖 动 实 验 室
    *  函数名称:delay_us
    *  功能说明:微秒粗延时函数
    *  参数说明:time:延时时间,单位:us
    *  函数返回:无
    *  修改时间:2016年5月30日
    *  备       注:无
    *  作    者:何昌昕
    *************************************************************************/
    void delay_us(uint16_t us)
    {        
        uint16_t i=0;  
        while(us--)
        {
            i=2;  
            while(i--);   
        }
    }

    /*************************************************************************
    *                     1 2 0 9 电 机 拖 动 实 验 室
    *  函数名称:delay_ms
    *  功能说明:毫秒延时函数
    *  参数说明:time:延时时间,单位:ms
    *  函数返回:无
    *  修改时间:2016年5月30日
    *  备       注:无
    *  作    者:何昌昕
    *************************************************************************/
    void delay_ms(uint16_t ms)
    {                     
        uint16_t i=0;  
        while(ms--)
        {
            i=2000;
            while(i--);   
        }         
    }

    /*----------------------------end of DHT11.c-------------------------------*/
    DHT11模块资料.zip (3.09 MB, 下载次数: 4)
    签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    15268
    最后登录
    1970-1-1
    发表于 2016-11-13 14:17:34 | 显示全部楼层
    多谢分享
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-2-12 15:48
  • 签到天数: 47 天

    [LV.5]常住居民I

    12

    主题

    425

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1084
    最后登录
    2018-2-12
    发表于 2016-11-15 08:32:02 | 显示全部楼层
    楼主,有才
    不知道大家放假了吗
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-26 22:23
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    57
    最后登录
    2016-12-26
    发表于 2016-11-15 09:04:33 | 显示全部楼层
    很好               
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 14:09 , Processed in 0.134847 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表