1. 程式人生 > >DHT12溫溼度感測器IIC,I2C介面除錯心得和程式碼說明

DHT12溫溼度感測器IIC,I2C介面除錯心得和程式碼說明

來源:http://www.fuhome.net/bbs/forum.php?mod=viewthread&tid=2141

DHT11那個單匯流排的溫溼度感測器用的很多了,aosong推出了DHT12,這個精度更高,原來DHT11溫度誤差2°,這個12為0.5°,溫度範圍也從0-50°提高到-20-60°,這個就可以測量冬天的一般家裡的室溫了。


廢話不多說,這個DHT12主要是比DHT11多了I2C介面,我用的stm32F103,文件說頻率不超過400KHz,不過我用原子的at24c這個驅動來該,讀不出來,waitack都不對,經過跟廠家技術溝通,實驗,問題主要在與waitack時間要等待一會,否則就會出錯,而且讀取函式也要相應延時等待。

原子的程式基本是us,我實驗得出了這個資料,見程式,親測讀出了溫度 26°左右(空調壞了將就把),溼度54%


//等待應答函式很重要


u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //改變方向為輸入  (這裡原子的某版本程式碼有點不對勁,輸入了竟然還賦值)
        
        delay_us(4);           
        IIC_SCL=1;
        delay_us(4);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
                delay_us(1);
        }
        IIC_SCL=0;
  delay_us(50);        //這個是最需要的,沒有就不行了。
        return 0;  
} 








//讀取函式,延時50us,太多ms級別貌似也有問題
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();
    for(i=0;i<8;i++ )
         {
        IIC_SCL=0; 
        delay_us(50);
        IIC_SCL=1;
         delay_us(50);
        receive<<=1;
        if(READ_SDA)
        receive++;        
                                
    }                                         
    if (!ack)
        IIC_NAck();//nACK
    else
        IIC_Ack(); //ACK   
    return receive;
}

附:

DHT12文件

http://www.aosong.com/pdf/DHT12%E6%95%B0%E5%AD%97%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8%EF%BC%88V1.3-20160315%EF%BC%89.pdf

奧鬆官方DHT12 STM32例程

https://pan.baidu.com/s/1o7BUASE