vs Arduino UNO WiFi (3) 温湿度センサHTU21D
Arduino IDE1.8.8のボードの選択のところに、ボード名をArduino Uno Wifi Rev2の下に、Registers emulation "ATMEGA328"という項目が追加されています。この部分の動作を確認します。
●温湿度センサHTU21Dを利用
I2Cインターフェースをもつ温湿度センサHTU21Dをつなぎます。HTU21Dのおもなスペックを示します。
- 動作電圧 1.5~3.6V
- 消費電流 測定時500uA(最大)
- 測定温度範囲 -40~+125℃
- 分解能 0.01℃(14ビット)
- 確度 ±0.3℃
- 測定時間 14ビット;50ms
- 測定室度範囲 0~100%RH
- 分解能 0.04%RH(12ビット)
- 確度 ±2%RH
- 測定時間 12ビット;16ms(最大)
- インターフェース I2C(400kHz)
接続です。HTU21Dボードはアマゾンで入手し、Vinに5Vを入れると3端子レギュレータで3.3Vが作られているようです。I2Cバスのプルアップ抵抗4.7kΩが入っています。
HTU21D | Arduino Uno Wifi Rev2 |
---|---|
Vin | 5V |
GND | GND |
SCL | SCL |
SDA | SDA |
I2Cscannerを動かします。0x40に見つけてきました。0x60は、暗号化のATECC608もしくはWi-FiのNina-W102のどちらかです。ATECC608のデータシートには下記の記述があり、
Programmable I2C address after data (secret) zone lock
Nina-W102にはアドレスの記述はありませんでした。
●Adafruitのライブラリを入れる
ライブラリでHDU21Dを検索し、Adafruitのライブラリを入れます。サンプルのHDU21DFtestを動かします。実行結果です。
このときのSCLとSDA端子の信号をPicoscopeで見ます。信号のレベルは5Vです。
●ATMEGA4809モードにする
Arduino IDEのRegisters emulation "ATMEGA328"の項目を「ATMEGA328」から「None(ATMEGA4809)」に変更してコンパイルします。
同様に動きました。
●スケッチを作る
動作が確認できたので、レジスタを操作して温度と湿度を読み出します。各種設定を行うレジスタはUser registerです。デフォルトの値は0x02です。温度と湿度のビット数はMSB(bit)とLSBの2ビットで設定しますが、分解のが最大のRH;12ビット、Temp;14ビットに設定されているので変更しません。また、ビット1はDisable OTP reloadで1に設定されて連続測定になっているので、変更せずに読み出します。
- リセット 0xfe
- User register書き込み 0xe6
- User register読み出し 0xe7
- 連続測定時の温度データ 0xe3
- 連続測定時の湿度データ 0xe5
- ワンタイム測定時の温度データ 0xf3
- ワンタイム測定時の湿度データ 0xf5
データは2バイトで、MSB(byte)、LSBの順です。ほんとうは3バイト目にCRCがありますが、無視します。
読み出したデータから%RHと摂氏は、下記の式で求めます。
RH = -6 + 125 * (readRHdata / 2^16) Temp = -46.85 + 175.72 * (readTempdata / 2^16) |
スケッチです。
#include <Wire.h>
#define HTU21D_address 0x40
#define reset 0xfe
#define TempeMeasurement 0xe3
#define HumidityMeasurement 0xe5
byte readbuffer[6];
void setup() {
Serial.begin(9600);
Serial.println("\nStart");
Wire.begin();
Wire.beginTransmission(HTU21D_address);
Wire.write(reset);
Wire.endTransmission();
delay(100);
}
void loop() {
Wire.beginTransmission(HTU21D_address);
Wire.write(TempeMeasurement);
Wire.endTransmission();
delay(100);
Wire.requestFrom(HTU21D_address,3);
readbuffer[0] = Wire.read(); readbuffer[1] = Wire.read() ;readbuffer[2] = Wire.read();
int Temp0 = ( readbuffer[0] << 8 | readbuffer[1] ) ;
// Serial.print("Temp_oF ");Serial.println(String(Temp0,HEX));
float Temp = -46.85 + 175.72 * Temp0 * 0.00001525878L;
Serial.print("Temp ");Serial.println(Temp,1);
Wire.beginTransmission(HTU21D_address);
Wire.write(HumidityMeasurement);
Wire.endTransmission();
delay(100);
Wire.requestFrom(HTU21D_address,3);
readbuffer[0] = Wire.read(); readbuffer[1] = Wire.read() ;readbuffer[2] = Wire.read();
uint16_t RH0 = readbuffer[0] << 8 | readbuffer[1] ;
// Serial.print("RH_0 ");Serial.println(String(RH0));
float RH = -6 + 125.0 * RH0 * 0.00001525878L;
Serial.print(" ");Serial.print(RH,0);Serial.println(" RH");
Serial.println("--- ");
delay(2000);
}
実行中の様子です。Registers emulationは"ATMEGA328"、"None(ATMEGA4809)" のどちらも動きました。