温湿度センサー HTU21D / 温度湿度を測る / micro:bit / mbed

#include "MicroBit.h"
MicroBit uBit;

#define HTDU21D_ADDRESS           0x40<<1
#define TRIGGER_TEMP_MEASURE_HOLD 0xE3
#define TRIGGER_HUMD_MEASURE_HOLD 0xE5

float getTemp(){
    // Hold master モード (測定の済むまでクロックをストレッチする) にして、
    // MSB、LSB、CRC の順番に読み出す (ここでは CRC は使わない)。
    char buf[] = {TRIGGER_TEMP_MEASURE_HOLD};
    uBit.i2c.write(HTDU21D_ADDRESS, buf, 1); 
    uBit.i2c.read (HTDU21D_ADDRESS, buf, 3);
    
    // 2 つの 8 ビットデータを 16 ビットデータに並べ換えて、
    // 下 2 ビット (ここでは使わない STATUS ビット) を 0 にして、
    // データシートの計算式で摂氏に変換して返す。
    // 0xfffc = 0b 1111 1111 1111 1100
    // 65536 = 2^16
    unsigned int raw = (buf[0]<<8 | buf[1]) & 0xfffc;
    return -46.85F + 175.72F * (float)raw / 65536.0F;
}

float getHumidity(){
    // Hold master モード (測定の済むまでクロックをストレッチする) にして、
    // MSB、LSB、CRC の順番に読み出す (ここでは CRC は使わない)。
    char buf[] = {TRIGGER_HUMD_MEASURE_HOLD};
    uBit.i2c.write(HTDU21D_ADDRESS, buf, 1); 
    uBit.i2c.read (HTDU21D_ADDRESS, buf, 3);
    
    // 2 つの 8 ビットデータを 16 ビットデータに並べ換えて、
    // 下 2 ビット (ここでは使わない STATUS ビット) を 0 にして、
    // データシートの計算式で相対湿度〔%〕に変換して返す。
    // 0xfffc = 0b 1111 1111 1111 1100
    // 65536 = 2^16
    unsigned int raw = (buf[0]<<8 | buf[1]) & 0xfffc;
    return -6.0F + 125.0F * (float)raw / 65536.0F;
}

int main(void){
    uBit.init();
    
    while(1){
        printf("%0.1f\n", getTemp());
        printf("%0.1f %%\n", getHumidity());
        printf("\n");
        wait(1);
    }

    release_fiber();
    return 0;
}

実行結果:
f:id:ti-nspire:20180605154325p:plain