バッテリの充電をしても直ぐに止まってしまうので、止む無く回収修理することにしました。しかし、5年前の物で入手できるものは既になく、今更ESP8266でもないのでESP32-S3,SHT45で作り直してみることにしました。 ESP32と言っても色々あるので、deep sleep 時の消費電力を比較するために、ESP32-S3,Xiao ESP32-S3,ESP32-C3,XiaoESP32-C3 を入手して、いくつか動作試験をしてみました。
最初に、ExampleにあるWiFiScanにdeep sleep testのコードを足して比較してみました。最初に5V電源を供給して比較してみると、ESP32-S3(ESP32-S3 Dev moduleで動かしたもの)でdeep sleep時に350μAとなる結果で、Xiao -S3,-C3共に上手く結果が出ませんでした。 deep sleepするとUSBportが切れてしまい、動作状態がわからなくなるので、TX/RXを使ってシリアルで動作をモニターする必要があるのですが、、、、
最初これがうまくいかず、ググって之を見つけ、Arduinoの設定を左のように変更。再コンパイル、インストール。
これで、動作状況を確認できるので、3.7VのLiPo電池で温度と湿度をサーバにリポートする実際のプログラムを走らせて、deep sleep時の消費電流を測定してみました。 技適認証の問題がありますのでXiao ESP32-S3とXiao ESP32-C3、ESP32-S3を測定してみました。結果、右のようにXiaoESP32-S3が一番消費電流が少なかったので、これを使うことにしました。(Xiao ESP32-C3の消費電流についてはWEBに記載のあるものと殆ど一緒なので、問題はないと思いますが、、、)
ここにはESP32-S3のdeep sleep時の電流値が3.8V/14μAとありますので、大きくは間違っていない、と思います。 なお、仕事中の電流値は動きが激しく時間も短いので、肉眼で見た時の凡その最大値です。 また、最近のESP32には3V3の定電圧電源回路(バッテリ充電の為の制御回路も)とか、USB・Serialとか色々なペリフェラルが入っているので、細かく電源制御するために、より内部に精通している必要があり、全部端折って、手っ取り早く実機に仕立てて消費電流を見て判断するのが早道かもしれません。
Weather monitorのソースコード
// FILE: SHT4x_demo.ino
// AUTHOR: Rob Tillaart
// PURPOSE: demo
// URL: https://github.com/RobTillaart/SHT4x
/*
For async call:
requestData(measurementType = SHT4x_MEASUREMENT_SLOW);
For sync call:
read(uint8_t measurementType = SHT4x_MEASUREMENT_SLOW, bool errorCheck = true);
| measurement type | duration | heater | power | notes |
|:-----------------------------------:|:----------:|:--------:|:--------:|:-------:|
| SHT4x_MEASUREMENT_SLOW | 9 ms | N | - | default |
| SHT4x_MEASUREMENT_MEDIUM | 5 ms | N | - |
| SHT4x_MEASUREMENT_FAST | 2 ms | N | - |
| SHT4x_MEASUREMENT_LONG_HIGH_HEAT | 1100 ms | Y | 200 mW |
| SHT4x_MEASUREMENT_LONG_MEDIUM_HEAT | 1100 ms | Y | 110 mW |
| SHT4x_MEASUREMENT_LONG_LOW_HEAT | 1100 ms | Y | 20 mW |
| SHT4x_MEASUREMENT_SHORT_HIGH_HEAT | 110 ms | Y | 200 mW |
| SHT4x_MEASUREMENT_SHORT_MEDIUM_HEAT | 110 ms | Y | 110 mW |
| SHT4x_MEASUREMENT_SHORT_LOW_HEAT | 110 ms | Y | 20 mW |
Ken Yamada 2025/10/04
Extended to sending the data every determined period to the server thru WiFi
This is for ESP32-S3-zero, Seeed Studio Xiao esp32s3, expecting less than 14uA at sleeping time.
*/
#include "WiFi.h"
#include "Wire.h"
#include "SHT4x.h"
#define uS_TO_S_FACTOR 1000000ULL // Conversion factor for micro seconds to seconds
#define TIME_TO_SLEEP 60 * 15 // Time ESP32 will go to sleep (in seconds) 15 minutes.
#define SHT_DEFAULT_ADDRESS 0x44
#define SHT_PW 4
#define SDA 5
#define SCL 6
#ifndef STASSID
#define STASSID "XXXXXXXX"
#define STAPSK "***********"
//#define IDENTIFIER "TEST"
//#define IDENTIFIER "GardenCenter"
#define IDENTIFIER "GardenEast"
//#define IDENTIFIER "GardenWest"
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
const char* Identifier = IDENTIFIER;
const char* host = "your host address";
const uint16_t port = 80;
SHT4x sht;
// Method to print the reason by which ESP32 has been awaken from sleep
void print_wakeup_reason() {
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch (wakeup_reason) {
case ESP_SLEEP_WAKEUP_EXT0: Serial.println("Wakeup caused by external signal using RTC_IO"); break;
case ESP_SLEEP_WAKEUP_EXT1: Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
case ESP_SLEEP_WAKEUP_TIMER: Serial.println("Wakeup caused by timer"); break;
case ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println("Wakeup caused by touchpad"); break;
case ESP_SLEEP_WAKEUP_ULP: Serial.println("Wakeup caused by ULP program"); break;
default: Serial.printf("Wakeup was not caused by deep sleep: %d\n", wakeup_reason); break;
}
}
void setup() {
esp_log_level_set("i2c.master", ESP_LOG_NONE); //Patch work, don't know if it is ok to ignore.
//esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
//esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
//esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
pinMode(SHT_PW, OUTPUT); // For SHT powering
Serial.begin(115200);
while (!Serial)
; // uncomment if needed
print_wakeup_reason();
//WiFi setup
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// wire setup, SHT start
digitalWrite(SHT_PW, HIGH); // turn on SHT power
delay(100);
Wire.begin(SDA, SCL); //Define(SDA,SCL)
Wire.setClock(100000);
sht.begin();
// deep sleep setup
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
// Summary of setup
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) + " Seconds");
}
void loop() {
WiFiClient client;
if (!client.connect(host, port)) {
Serial.println("connection failed");
delay(5000);
return;
}
sht.read(); // default SHT4x_MEASUREMENT_SLOW and true for CRC check
delay(100);
digitalWrite(SHT_PW, LOW); //Switch off SHT
String url = "/weather/weather_log.php";
url += "?location=" + String(Identifier); // ID to identify location
url += "&temperature=" + String(sht.getTemperature());
url += "&humidity=" + String(sht.getHumidity());
url += "&pressure=" + String("-----");
Serial.print("Requesting URL: ");
Serial.println("GET " + url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
delay(500);
// Read all the lines of the reply from server and print them to Serial
Serial.println("Returned message from server: ");
delay(500);
while (client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println("Closing connection.");
client.stop();
delay(1000);
WiFi.mode(WIFI_OFF); //
Serial.flush();
esp_deep_sleep_start(); // Start sleep!!
}
// -- END OF FILE --


0 件のコメント:
コメントを投稿