#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; }
実行結果: