温湿度センサー HTU21D / ソフトリセットをかけてみる / micro:bit / mbed

ソフトリセットをかけると heater ビット (ユーザーレジスタのビット 1 ) 以外は全部デフォルト (全部 0) になるとの由。
f:id:ti-nspire:20180608165303p:plain:h150 f:id:ti-nspire:20180608165414p:plain:h150

#include "MicroBit.h"
MicroBit uBit;

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

// ユーザーレジスタを読み出すための函数
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);
}

// ソフトリセットをかけるための函数
void softReset(void){
    char buf[] = {SOFT_RESET};
    uBit.i2c.write(HTDU21D_ADDRESS, buf, 1);
}

int main(void){
    uBit.init();
    
    // 湿度 12 ビット、温度 14 ビット (デフォルト) にする。0b 0000 0010 = 0x2 になるはずである。 
    setResolution(0b00000000);
    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) に戻るはずである。
    softReset();
    printf("User Register: 0x%X\n", read_user_register());

    release_fiber();
    return 0;
}

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