練習11 温湿度計を作る 1 ESP32,SHT31

電池で駆動する「温湿度計」を作ります。
屋外などで測定したデータを、WIFI経由でサーバー(SQLite)に送るのが最終目的です。
キモは、ESP32の消費電流を抑え、駆動時間を出来るだけ伸ばすこと。

1.部品

主要部品は、秋月電子で調達しました。

2.動作フロー

  1. 温湿度測定
  2. 電池電圧測定
  3. WIFI接続
  4. 測定データをサーバーに送信(POST)
  5. Deep Sleep
  6. 1に戻る

4.温湿度測定

SDAをESP32のPin=21、SCLをPin=22に接続します。

SHT-31のソースは、↓を参考にさせていただきました。
https://spiceman.jp/arduino-sht31-program/

で、できたソースがこれ。シリアルモニタに温湿度が表示されました。

#include <Wire.h>
float  temp_31;
float  humid_31;

//アドレス指定
  #define SHT31_ADDR 0x45
  #define SOFT_RESET_MSB 0x30
  #define SOFT_RESET_LSB 0xA2
  #define CLEAR_STATUS_REGISTER_MSB 0x30
  #define CLEAR_STATUS_REGISTER_LSB 0x41
  #define SINGLE_SHOT_HIGH_MSB 0x24
  #define SINGLE_SHOT_HIGH_LSB 0x00

void setup() {
  Serial.begin(115200);
}

void loop(){
  read_SHT31();
  delay(1000);
}

void read_SHT31(){
  //変数宣言
  unsigned int dac[6];
  unsigned int i, t ,h;

  Wire.beginTransmission(SHT31_ADDR);//I2Cスレーブ データ送信開始
  Wire.write(SINGLE_SHOT_HIGH_MSB);  //単発測定・繰返精度レベル高・クロックストレッチ無効 MSB
  Wire.write(SINGLE_SHOT_HIGH_LSB);  //単発測定・繰返精度レベル高・クロックストレッチ無効 MSB
  Wire.endTransmission();                //I2Cスレーブ「Arduino Uno」のデータ送信終了
  delay(300);

  Wire.requestFrom(SHT31_ADDR, 6);    //dI2Cデバイス「SHT31」に6Byteのデータ要求
  for (i=0; i<6; i++){
      dac[i] = Wire.read();        //dacにI2Cデバイス「SHT31」のデータ読み込み
  }
  Wire.endTransmission();     //I2Cスレーブ「Arduino Uno」のデータ送信終了

  t = (dac[0] << 8) | dac[1];                           
      //1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、tに代入
  temp_31 = (float)(t) * 175 / 65535.0 - 45.0;  //温度の計算
  h = (dac[3] << 8) | dac[4];                          
       ////4Byte目のデータを8bit左にシフト、OR演算子で5Byte目のデータを結合して、hに代入
  humid_31 = (float)(h) / 65535.0 * 100.0;    //湿度の計算、humidityに代入
  
  Serial.print("温度:"); Serial.print(temp_31);  Serial.print("℃ , ");
  Serial.print("湿度:"); Serial.print(humid_31); Serial.println("%");
  delay(1000);
}

続く