2016-04-16 17 views
1

私はarduino unoでDHT11センサーを使用しています。 8ビット積分RHデータ+ 8ビット小数点RHデータ+ 8ビット積分Tデータ+ 8ビット10進数Tデータ+ 8ビットチェックサム。 のデータ形式は次のとおりです。DHT11 - 整数データと小数データの差

私が使用したコードは次のとおりです。

//KY015 DHT11 Temperature and humidity sensor 
    int DHpin = 8; 
    byte dat [5]; 
    byte read_data() { 
    byte data; 
    for (int i = 0; i < 8; i ++) { 
if (digitalRead (DHpin) == LOW) { 
    while (digitalRead (DHpin) == LOW); // wait for 50us 
    delayMicroseconds (30); // determine the duration of the high level to determine the data is '0 'or '1' 
    if (digitalRead (DHpin) == HIGH) 
    data |= (1 << (7-i)); // high front and low in the post 
    while (digitalRead (DHpin) == HIGH); // data '1 ', wait for the next one receiver 
} 
    } 
    return data; 
    } 

    void start_test() { 
    digitalWrite (DHpin, LOW); // bus down, send start signal 
    delay (30); // delay greater than 18ms, so DHT11 start signal can be detected 

    digitalWrite (DHpin, HIGH); 
    delayMicroseconds (40); // Wait for DHT11 response 

    pinMode (DHpin, INPUT); 
    while (digitalRead (DHpin) == HIGH); 
    delayMicroseconds (80); // DHT11 response, pulled the bus 80us 
    if (digitalRead (DHpin) == LOW); 
    delayMicroseconds (80); // DHT11 80us after the bus pulled to start sending data 

    for (int i = 0; i < 4; i ++) // receive temperature and humidity data, the parity bit is not considered 
dat[i] = read_data(); 

    pinMode (DHpin, OUTPUT); 
    digitalWrite (DHpin, HIGH); // send data once after releasing the bus, wait for the host to open the next Start signal 
    } 

    void setup() { 
    Serial.begin (9600); 
    pinMode (DHpin, OUTPUT); 
    } 

    void loop() { 
    start_test(); 
    Serial.print ("Current humdity ="); 
    Serial.print (dat [0], DEC); // display the humidity-bit integer; 
    Serial.print ('.'); 
    Serial.print (dat [1], DEC); // display the humidity decimal places; 
    Serial.println ('%'); 
    Serial.print ("Current temperature ="); 
    Serial.print (dat [2], DEC); // display the temperature of integer bits; 
    Serial.print ('.'); 
    Serial.print (dat [3], DEC); // display the temperature of decimal places; 
    Serial.println ('C'); 
    delay (700); 
    } 

このコードはおそらく文句を言わない私の最後の一つであるが、私はセンサーのデータで何が起こっているかについて把握を取得しようとしています。 私はintegearデータと小数データの両方がDECとして印刷されていない理由を理解していないし、なぜ "。"そこ 。 このコードはセンサーのwikiページから取得したものです。 また、私は湿度と温度の両方のdecmialデータセクションで0を得るalwayesです。

答えて

0

データ変換はこの湿度 、温度に対する

Humidity Value = ((float)((integral RH data << 8) + 8bit decimal RH data)/(float)10.0) 

、例えば

Temperature Value = ((float)((8bit integral T data << 8) + 8bit decimal T data)/(float)10.0) 

のようである:また、湿度

8bit integral T data = 0x01 and 8bit decimal T data = 0x32 

The real measured temperature value = ((0x01 << 8) + 0x32) /10 
            = (256 + 50)/10 = 30.6 degree c 

同様表現されます%にあります。 DHT22の場合、ステップサイズ(解像度は.1度)がDHT11の場合は1度と思われますのでご注意ください。私は、変換が欠落しているとして、それは正しい値が表示されないだろうと思い、あなたのコード

Serial.print ("Current humdity ="); 
Serial.print (dat [0], DEC); // display the humidity-bit integer; 
Serial.print ('.'); 
Serial.print (dat [1], DEC); // display the humidity decimal places; 
Serial.println ('%'); 
Serial.print ("Current temperature ="); 
Serial.print (dat [2], DEC); // display the temperature of integer bits; 
Serial.print ('.'); 
Serial.print (dat [3], DEC); // display the temperature of decimal places; 
Serial.println ('C'); 

を参照して

関連する問題