今から始める電子工作 ⑱ I2Cバス その2-2 温湿度センサSHT45、Wireライブラリ
前々回、温湿度センサSHT45を各種ライブラリを利用して値を読み出しました。
ここでは、Wireライブラリを使うことで温湿度センサSHT45のデータの読みだしを実現します。
●環境
- Arduino IDE;2.3.4
- Windows11;23H2
- Arduino UNO R4 WiFi
●ArduinoのWireライブラリ
ドキュメント Inter-Integrated Circuit (I2C) Protocol
- begin() - I2Cバスの初期化
- end() - I2Cバスを閉じる
- requestFrom() - 周辺機器からバイトを要求する
- beginTransmission() - 送信のキューイングを開始する
- endTransmission() - キューに入れられたバイトを送信し、送信を終了する
- write() - 周辺機器からコントローラへ、またはその逆へデータを書き込む
- available() - 取得可能なバイト数を返す
- read() - 周辺機器からコントローラに送信されたバイトを読み取る
- setClock() - クロック周波数を変更する
- onReceive() - ペリフェラルが送信を受信した際に呼び出される関数を登録する
- onRequest() - コントローラがデータを要求したときに呼び出される関数を登録する
- setWireTimeout() - コントローラ・モードでの送信のタイムアウトを設定する
- clearWireTimeoutFlag() - タイムアウトフラグをクリアする
- getWireTimeoutFlag() - フラグが最後にクリアされてからタイムアウトが発生したかどうかを確認する
●基本的な使い方
デバイスの接続にQWIICコネクタを利用しているので、WireではなくWire1を使います。
setup()内で、Wire1.begin();を実行します。
loop()内では、書き込みと読み出しを行います。
<書き込み>
Wire1.beginTransmission(アクセスするデバイスのスレーブ・アドレス);
Wire1.write(書き込むデータ);
Wire1.endTransmission();
<読み出し>
Wire1.requestFrom(スレーブ・アドレス, 読みだすデータのバイト数);
readbuffer[0] = Wire1.read();
... バイト数分読みだして、バッファに入れる
●SHT45で動かす
読みだした温度と湿度のそれぞれ2バイトのデータは16ビット・データに直し、データシートにある変換式に従って摂氏とRH%の値を得ています。
#include <Wire.h> const uint8_t SHT45_address = 0x44; uint8_t readbuffer[6]; void setup() { Wire1.begin(); Serial.begin(9600); delay(1000); Serial.println("start "); } void loop() { Wire1.beginTransmission(SHT45_address); Wire1.write(0xfd); Wire1.endTransmission(); delay(10); Wire1.requestFrom(SHT45_address, 6); readbuffer[0] = Wire1.read(); readbuffer[1] = Wire1.read(); readbuffer[2] = Wire1.read(); // CRC readbuffer[3] = Wire1.read(); readbuffer[4] = Wire1.read(); readbuffer[5] = Wire1.read(); // CRC int temp = readbuffer[0] * 256 + readbuffer[1]; int humi = readbuffer[3] * 256 + readbuffer[4]; float temperature = -45 + 175 * temp / 65535; float humidity = -6 + 125 * humi / 65535; Serial.println(" temperature= "+String(temperature,1)+"'C"); Serial.println(" RH%= "+String(humidity,0)); delay(2000); }
実行します。
波形を見ます。
書き込み時です。
読みだし時です。
アドレス0x44を送った後、2バイトは温度データ、3バイト目は温度データのCRCデータ、そのあとの2バイトは湿度データで、最後のバイトは湿度データのCRCデータです。上記のスケッチでは、CRCデータは無視しています。
●書き込み時の別の事例
SHT45では書き込み時には1バイトのデータでした。2バイトでも同様に書けます。
Wire1.beginTransmission(アクセスするデバイスのスレーブ・アドレス);
Wire1.write(書き込むデータ);
Wire1.write(書き込むデータ);
Wire1.endTransmission();
setup()内で、初期設定やソフト・リセットを行った後、読み出しレジスタを設定するようなときは、2回に分けてデータを書き込むこともあります。
Wire1.beginTransmission(アクセスするデバイスのスレーブ・アドレス);
Wire1.write(書き込むレジスタのアドレス);
Wire1.write(書き込む設定データ);
Wire1.endTransmission();
Wire1.beginTransmission(アクセスするデバイスのスレーブ・アドレス);
Wire1.write(書き込むデータ);
Wire1.endTransmission();
●読み出し時の別の事例
SHT45の場合、アドレスを出した後に、6バイト読み込んでいますが、多くのデバイスでは、読み出しレジスタのアドレスを送ってから読みだすことが多いです。
Wire1.beginTransmission(アクセスするデバイスのスレーブ・アドレス);
Wire1.write(読みだすレジスタのアドレス);
Wire1.endTransmission();
Wire1.requestFrom(スレーブ・アドレス, 読みだすデータのバイト数);
readbuffer[0] = Wire1.read();
... バイト数分読みだして、バッファに入れる