2016-05-19 4 views
0

私はadafruitセンサー(sht31d)からデータを取得するライブラリを構築しています。センサーが故障しています。 ArduinoのWireライブラリを置き換える際の問題

温度の読みは正確ですが、湿度は変わりません。

私のデバッグ:

temp: 23.36 humid: 0.39 

次のような方法がmain.cの

(sht31.cから法)に呼び出されます。おかげで

bool readTempHum(void) 
{ 
    uint8_t readbuffer[6]; 
    writeCommand(SHT31_MEAS_HIGHREP); 
    _delay_ms(500); 

    for (uint8_t i=0; i<6; i++) 
    { 
    readbuffer[i] = read8(SHT31_DEFAULT_ADDR); 
    } 

    uint16_t ST, SRH; 
    ST = readbuffer[0]; 
    ST <<= 8; 
    ST |= readbuffer[1]; 

    SRH = readbuffer[3]; 
    SRH <<= 8; 
    SRH |= readbuffer[4]; 

    double stemp = ST; 
    stemp *= 175; 
    stemp /= 0xffff; 
    stemp = -45 + stemp; 

    temp = stemp; 

    double shum = SRH; 
    shum *= 100; 
    shum /= 0xFFFF; 

    humidity = shum; 

    return true; 
} 

To view the full implementation please click here

+0

"正しいと一致する_ _"、予想される出力は何ですか? – Linus

+0

'sht31'のピン2は' VSS'に接続されていますか? – LPs

+0

@Linus時間の経過とともに変化しています。私がセンサーを暖かくするために指に置くと、値に変わるのではなく値が突然変化します。これはセンサーに関する私の経験からは珍しいことです。 – SensationSama

答えて

1

実際に正しく見えます。温度と湿度の両方が2バイトでエンコードされ、あなたが手ですべての計算を行う場合には(この場合のみ温度に)OKになります。

ST = readbuffer[0]; // 100 
ST <<= 100; // 100 << 8 = 25600 
ST |= readbuffer[1]; // 25600 | 1 = 25601 

double stemp = ST; // 25601 
stemp *= 175; // 25601 * 175 = 4480000 
stemp /= 0xffff; // 4480000/65535 = 68,36 
stemp = -45 + stemp; // -45 + 68,36 = 23,36 

だから、ASCIIエンコーディングとは何の関係もありません。あなたのセンサーにちょっとした時間を与えてください。

また、sensor datasheetを見ると、応答時間が2〜8秒であることがわかります。

+0

センサーデータを読み取り可能な形式で表示しようとすると、ASCIIの問題が発生します。私は温度が正しいかもしれないと思っていますが、湿度は常に同じ値を報告しますが、それは間違いです。 – SensationSama

+0

その場合、16進数で表示してみてください。 'sprintf(buf、"%x "、readbuffer [i]);' – DennisS

+0

私は正しいと思います。 3番目のバイトはCRC8でなければならず、値として1になることはできません。 – LPs

関連する問題