温湿度センサー 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; }
実行結果: