akira.kei が 2026年06月21日21時46分41秒 に編集
初版
タイトルの変更
Arduino IDEでI2C接続温湿度センサーを使う(その3):SHT31
タグの変更
Arduino
Arduino-IDE
ArduinoIDE
I2C
SHT31
記事種類の変更
セットアップや使用方法
ライセンスの変更
(MIT) The MIT License
本文の変更
[<前の記事](https://elchika.com/article/8774ff05-3369-44e4-8416-28d7db901f59/) : 次の記事> ## お次はSHT31を使ってみる AHT21B、SHT40iときて次は[SHT31](https://akizukidenshi.com/catalog/g/g112125/)だ。名前の冒頭にSHTが付いているSHT40iとほぼ同じような感じなんだが、より高精度なのかも知れない。これも機能は多いが単純な単発測定のみを使うような構成としておく。アドレスは0x44と0x45が切り替えられるので、2台を同じバスに接続できる。  これも自前ライブラリの構成を同じにしてあるので、スケッチは名前違いでほぼ同じ内容になる。 ```Arduino:SHT31libTest.ino #include "Wire.h" #include "SHT31.h" SHT31 meas=SHT31(0x45); void setup() { Serial.begin(115200); Wire.begin(); meas.begin(); } byte cnt=0; void loop() { meas.measure(); Serial.print(cnt++); Serial.print(", SHT31, MEAS-T-H. "); Serial.print(meas.temperature()); Serial.print(", "); Serial.println(meas.humidity()); delay(1000); } ``` ## ライブラリ本体「SHT31.cpp」 ヘッダファイルの内容はSHT40iやAHT21Bと同じ(名前だけ違う)ので割愛して、ライブラリ本体の特徴点だけ以下に示す。[データシート](https://akizukidenshi.com/goodsaffix/Sensirion_Humidity_Sensors_SHT3x_DIS_Datasheet_V3_J.pdf)に基づき```begin```ではソフトウェアリセットをかけている。 ```Arduino:begin void SHT31::begin(void) { delay(100); Wire.beginTransmission(_adrs); Wire.write(0x30); Wire.write(0xA2); Wire.endTransmission(); delay(5); } ``` ```measure```では繰り返し精度「高」でクロックストレッチ無効の単発測定を指示している。クロックストレッチ無効なので、測定時間を```delay```で待ってからデータ取得を行なった。CRCのチェックはやっていない。 ```Arduino:measure void SHT31::measure(void) { Wire.beginTransmission(_adrs); Wire.write(0x24); Wire.write(0x00); Wire.endTransmission(); delay(15); Wire.requestFrom((int)_adrs,(int)6); byte i=0; while(Wire.available()) data[i++]=Wire.read(); Wire.endTransmission(); } ``` ```temperature()```および```humidity()```は共に```float```型の関数だが、将来的には固定小数点+シフト演算で考え直すかも知れない。  手元の温湿度計が「29.5℃、68%」なので精度はまぁまぁといたところか。どっちが合ってるのかは分からない。 --- [<前の記事](https://elchika.com/article/8774ff05-3369-44e4-8416-28d7db901f59/) : 次の記事>