SpresenseでLチカから始める (14) Wireライブラリ 温湿度SI7006-A20
温湿度センサSI7006は、確度±5%RH(最大)で0~90%RHの湿度と、確度±1.0℃(最大)で -10〜+85℃の温度が測定できるセンサです。結露する状況では加熱するためのヒータが内蔵されています。それぞれの測定で、より確度の高いSI7020があり、インターフェースは同じI2Cです。
●SI7006-A20 のおもな特徴
- 動作電圧 1.9~3.6V
- 動作電流 スタンバイ時0.06uA、湿度測定時150uA、温度測定時90uA、I2Cデータ転送時3.5mA(いずれもtypical値)
- インターフェース I2C(データ転送速度最大400kHz)
- 温度 -40~+120℃ 11/12/13/14ビット分解能
- 湿度 0~90%(100%)RH 8/10/11/12ビット分解能
データは16ビットで読み出されます。スタンバイ時の消費電流は大変少なく、たとえばSHT31は平均220uAなので、動作時の電流も少ないのが特徴です。I2Cの通信時の電流は大きいので、消費電力を下げるにはプルアップ抵抗の値も考慮する必要があるかもしれません。
●接続
実験をするのに便利な変換基板に搭載されたものが見つからなかったので、Digi-Keyからデバイスを購入しました。1mm厚のプリント基板に約3.5mmの穴をあけ、3×3mmのデバイスをそこにはめ込みました。温度センサの一端が接続されている広いパッドをまずはんだ付けし、信号と電源の4本を0.3mmのはんだメッキ線ではんだ付けしました。
パッケージは6ピンのDFNですが、2か所は電気的には何もつながっていません。
はんだ付けが終わったあと、はんだ面の反対側にある保護シートをはがしました。
Spresenseは3.3Vで動作させました。I2Cインターフェースのプルアップは拡張ボードに1kΩが取り付けられているので、配線は4本だけで済みます。
●スケッチ
I2Cスレーブ・アドレスは0x40です。おもなコマンドです。
コード | 内容 |
0xe5 | 湿度の測定、マスタ・モードに保持 |
0xf5 | 湿度の測定、マスタ・モードに保持しない |
0xe3 | 温度の測定、マスタ・モードに保持 |
0xf3 | 温度の測定、マスタ・モードに保持しない |
0xe0 | 前の湿度測定値から温度値を読み取る |
0xfe | リセット |
0xe6 | RH/Tユーザ・レジスタの書き込み |
0xe7 | RH/Tユーザ・レジスタの読み出し |
0x51 | ヒータ制御レジスタの書き込み |
0x11 | ヒータ制御レジスタの読み出し |
(※)マスタ・モードの保持は、クロック・ストレッチをして測定中だということをマスタに知らせるために使われる。
検索するとSI7020のArduinoのサンプルが見つかったので、修正して利用します。Arduino IDEは 1.8.7を使いました。
#include <Wire.h>
#define Addr 0x40
void setup() {
Wire.begin();
Serial.begin(9600);
Wire.beginTransmission(Addr);
Wire.endTransmission();
delay(300);
}
void loop() {
unsigned int data[2];
Wire.beginTransmission(Addr);
// Send humidity measurement command, NO HOLD MASTER
Wire.write(0xF5);
Wire.endTransmission();
delay(500);
// Request 2 bytes of data
Wire.requestFrom(Addr, 2);
// Read 2 bytes of data humidity msb, humidity lsb
if(Wire.available() == 2) {
data[0] = Wire.read();
data[1] = Wire.read();
}
// Convert the data
float humidity = ((data[0] * 256.0) + data[1]);
humidity = ((125 * humidity) / 65536.0) - 6;
Wire.beginTransmission(Addr);
// Send temperature measurement command, NO HOLD MASTER
Wire.write(0xF3);
Wire.endTransmission();
delay(500);
// Request 2 bytes of data
Wire.requestFrom(Addr, 2);
// Read 2 bytes of data temp msb, temp lsb
if(Wire.available() == 2) {
data[0] = Wire.read();
data[1] = Wire.read();
}
// Convert the data
float temp = ((data[0] * 256.0) + data[1]);
float ctemp = ((175.72 * temp) / 65536.0) - 46.85;
// Output data to serial monitor
Serial.print("Relative humidity : ");
Serial.print(humidity,0);
Serial.println(" % RH");
Serial.print("Temperature in Celsius : ");
Serial.print(ctemp,1);
Serial.println(" C");
delay(1000);
}
実行結果です。センサに指を近づけたので、湿度と温度の値か急変しています。