温湿度センサー HTU21D / ソフトリセットをかけてみる / micro:bit / mbed
ソフトリセットをかけると heater ビット (ユーザーレジスタのビット 1 ) 以外は全部デフォルト (全部 0) になるとの由。
#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; }
実行結果: