電池で駆動する「温湿度計」を作ります。
屋外などで測定したデータを、WIFI経由でサーバー(SQLite)に送るのが最終目的です。
キモは、ESP32の消費電流を抑え、駆動時間を出来るだけ伸ばすこと。
1.部品
主要部品は、秋月電子で調達しました。
- マイコン :ESP32 DevC(Arduino)https://akizukidenshi.com/catalog/g/gM-11819/
- センサー :SHT-31モジュール https://akizukidenshi.com/catalog/g/gK-12125/
- OLCD :SSD1306 https://akizukidenshi.com/catalog/g/gP-12031/
2.動作フロー
- 温湿度測定
- 電池電圧測定
- WIFI接続
- 測定データをサーバーに送信(POST)
- Deep Sleep
- 1に戻る
3.ESP32
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); }
続く