温湿度センサー HTU21D / 測定分解能を変えてみる / micro:bit / mbed

#include "MicroBit.h"
MicroBit uBit;

#define HTDU21D_ADDRESS 0x40<<1
#define WRITE_USER_REG  0xE6
#define READ_USER_REG   0xE7

// ユーザーレジスタを読み出すための函数
uint8_t read_user_register(void){
    char buf[] = {READ_USER_REG};
    uBit.i2c.write(HTDU21D_ADDRESS, buf, 1); 
    uBit.i2c.read (HTDU21D_ADDRESS, buf, 1);
    
    return (uint8_t)buf[0];
}

// 測定分解能を設定するための函数 (ビット 7, 0 だけを書き換える)
void setResolution(uint8_t resolution){
    
    // 現在のユーザーレジスタを読み出す。
    uint8_t userRegister = read_user_register();
    
    // 測定分解能に関係するビット (7, 0) だけを書き換える。
    // ビット 7, 0 以外を誤って書き換えてしまわないようにする。
    userRegister &= 0b01111110;
    resolution   &= 0b10000001;
    userRegister |= resolution;
    
    char buf[] = {WRITE_USER_REG, userRegister};
    uBit.i2c.write(HTDU21D_ADDRESS, buf, 2);
}

int main(void){
    uBit.init();
    
    // 湿度 12 ビット、温度 14 ビット (デフォルト) にする。0b 0000 0010 = 0x2 になるはずである。 
    setResolution(0b00000000);
    printf("User Register: 0x%X\n", read_user_register());
    
    // 湿度 8 ビット、温度 12 ビットにする。0b 0000 0011 = 0x3 になるはずである。 
    setResolution(0b00000001);
    printf("User Register: 0x%X\n", read_user_register());
    
    // 湿度 10 ビット、温度 13 ビットにする。0b 1000 0010 = 0x82 になるはずである。 
    setResolution(0b10000000);
    printf("User Register: 0x%X\n", read_user_register());

    // 湿度 11 ビット、温度 11 ビットにする。0b 1000 0011 = 0x83 になるはずである。 
    setResolution(0b10000001);
    printf("User Register: 0x%X\n", read_user_register());
    
    // デフォルトに戻す。0b 0000 0010 = 0x2 になるはずである。 
    setResolution(0b00000000);
    printf("User Register: 0x%X\n", read_user_register());
    
    release_fiber();
    return 0;
}

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