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)" のどちらも動きました。

前へ

MAKER UNO + で始めるSTEM (4) ピンヘッダの信号

次へ

vs Arduino UNO WiFi (4) Wi-Fi接続とMQTT