経緯
初めて家庭菜園でマルチを張りました。土が直接見えないため乾き具合が分かりにくく、土壌湿度センサーを使って記録する方法を考えています。
ESP32-C3からGoogleスプレッドシートへ湿度データを記録:その1」では、湿度センサーの値をGoogleスプレッドシートへ記録する方法を、手動(エディタ実行)で試してみました。yshigu.net
「ESP32-C3からGoogleスプレッドシートへ湿度データを記録:その2」では、使用する湿度センサーとマイコンの選定を行い、マイコンからGoogleスプレッドシートへデータを登録してみました。yshigu.net
今回の「ESP32-C3からGoogleスプレッドシートへ湿度データを記録:その3」では、土壌湿度センサーに防水加工を施し、実際に記録を取り始めました。
工作
- PIN I/O
- A0:バッテリー電圧計測用AD変換
- A1:リザーブ(温度計測用)
- A2:土壌湿度値
- D3:土壌センサー電源
- D4:リザーブ(温度計電源)
- 回路図と実装

マイコン プログラミング
- 注記
- 土壌湿度の暫定値として、MINを315、MAXを2200とし、0~100%に換算しています。
- 先駆者の記事によると、読み取り値はチップ温度の影響を受けて変動するとのことでした。そのため、現時点では補正を行わず、読み出した値をそのまま記録して様子を見ることにします。
- バッテリー電圧の測定回路は、「Seeed Wiki」の情報を参考にしました。変更点として、分圧抵抗の値を220kΩから750kΩへ変更しています。
- 6月4日改修:土壌センサー値習得のForループを4回から3回に変更
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "SS ID";
const char* password = "PassWD";
const String url = "https://script.google.com/macros/s/A######################################################################################YIjg/exec";
float set_sleep_sec = 1 * 60 * 60;
#define MIN_MIST 315
#define MAX_MIST 2200
#define VOLT_PIN A0
#define HUMI_PIN A2
#define HUMI_SW_PIN D3
void setup() {
Serial.begin(115200);
pinMode( VOLT_PIN, INPUT);
pinMode( HUMI_PIN, INPUT);
pinMode( D3, OUTPUT)
WiFi.mode(WIFI_STA);
WiFi.disconnect();
if ( WiFi.begin(ssid, password) != WL_DISCONNECTED){
ESP.restart();
}
while( WiFi.status() != WL_CONNECTED){
delay(1000);
Serial.print(".");
}
Serial.println("Connected to the WiFi network!");
moist_send();
esp_sleep_enable_timer_wakeup( set_sleep_sec * 1000000LL * 1.006);
esp_deep_sleep_start();
}
void loop() {
}
void moist_send(){
char voltStr[8];
uint32_t Vbatt = 0;
for(int i = 0; i < 4; i++) {
Vbatt = Vbatt + analogReadMilliVolts(A0);
}
float Vbattf = 2.0 * Vbatt / 4.0 / 1000.0 ;
analogSetAttenuation(ADC_11db);
digitalWrite(HUMI_SW_PIN, HIGH);
delay(1000);
int valu = analogRead(HUMI_PIN);
for ( int lopCun = 0; lopCun < 3 ; lopCun ++ ){
delay(500);
valu = valu + analogRead(HUMI_PIN);
}
valu = valu / 4;
int humidity = map( valu, MIN_MIST, MAX_MIST, 0, 100);
digitalWrite(HUMI_SW_PIN, LOW);
String urlFinal = url + "?humidity=" + String(humidity)+ "&humi=" + String(valu)+ "&volt=" + String(Vbattf) ;
HTTPClient http;
http.begin(urlFinal.c_str());
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
int httpCode = http.GET();
Serial.printf( "valu: %d volt: %s\n", humidity, String(Vbattf) );
if (httpCode == HTTP_CODE_OK) {
String body = http.getString();
Serial.print("HTTP_CODE_OK: ");
Serial.println(body);
} else if (httpCode <= 0) {
Serial.println(http.errorToString(httpCode));
}
http.end();
delay(5000);
}
Googleスプレットシート
- スクリプト
- リポバッテリーの電圧を追加しました。
- 土壌湿度はパーセントと百分の1(センチボルト)に2つを記録します
function doGet(e) {
const url = "https://docs.google.com/spreadsheets/d/1h2h98NdJ-HfWDlRHsKu6osUmajUAgOoGHKgm8bZempY/edit?gid=0#gid=0";
const ss = SpreadsheetApp.openByUrl(url);
const sheet = ss.getSheets()[0];
const params = {
"timestamp": new Date(),
"humidity": e.parameter.humidity,
"humi": e.parameter.humi,
"volt": e.parameter.volt
};
sheet.appendRow(Object.values(params));
return ContentService.createTextOutput('sccess');
}
試行途中結果
- グラフに表示しているのは、土壌湿度センサーの読み取り値(百分の1ボルト:センチボルト)とリポバッテリーの電圧値(ボルト)です。
- 記録間隔を1時間としているため、水やり直後でも土壌が乾き始めており、100%(2200センチボルト)まで上昇していません。
- 今後は記録間隔をもう少し短くし、土壌湿度の変化を詳しく観察したいと考えています。
- あわせてバッテリー電圧の推移も確認し、どの程度の期間連続運用できるかを観察したいと思います。

今後の進めかた
- しばらくはこの試作機で測定を続け、データを蓄積していきます。
- 現在困っている「鉢植えキュウリがすぐに萎れる問題」の原因調査のため、温度測定機能の追加も検討しています。
以上。ここまでとなります