土壌水分計の自作 その4 Ambient使用による土の抵抗値の無線通信

はじめに

土壌水分計は最終的に外に置いてあるプランターに設置します。
一方で水分量確認は部屋の中で行えると便利です。
今回は土の抵抗値を無線で通信し、パソコンで受信することを可能にしました。
一連の動作確認方法を図で示すと下のようになります。

f:id:GypsophilaRupi:20200113153954p:plain

使用するもの

回路図

f:id:GypsophilaRupi:20200113170034p:plain

ソースコード

参考にしたプログラムはこちらです。 github.com このフォルダのZIPファイルをダウンロードして、サンプルプログラムのインストールを行います。 詳しくは下記リンクを参考にしてください。

pages.switch-science.com

そのうえで、土壌抵抗値の測定は下記のプログラムにて行います。

/*
   esp32と土壌水分計を使って土壌抵抗値を測定しプリントアプトする
*/


#include <WiFi.h>
#include "Ambient.h"
#define PERIOD 5
#include "esp_deep_sleep.h"


WiFiClient client;
Ambient ambient;

const char* ssid = "SSID";//ご使用のWiFiに合わせて変更する
const char* password = "password";//ご使用のWiFiに合わせて変更する

unsigned int channelId = Channel_ID; // ご使用のAmbientに合わせて変更する
const char* writeKey = "LightKey"; // ご使用のAmbientに合わせて変更する

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("\r\nSoilResistance test");
}

float GetSoilResistance() {
  const int StartTime = millis();
  const int PIN_ANALOG_INPUT = A16;
  const int PIN_DIGITAL_OUTPUT1 = A18;
  const int PIN_DIGITAL_OUTPUT2 = A19;
  const float SupplyVoltage = 3.3;
  const float ShuntResistance = 10000;
  pinMode(PIN_DIGITAL_OUTPUT1, OUTPUT);
  pinMode(PIN_DIGITAL_OUTPUT2, OUTPUT);
  digitalWrite(PIN_DIGITAL_OUTPUT1, HIGH);
  digitalWrite(PIN_DIGITAL_OUTPUT2, LOW);
  delay(2900);
  float CapacitorVoltage = analogRead( PIN_ANALOG_INPUT ) * SupplyVoltage / 4096.0;
  float SoilResistance = CapacitorVoltage / (SupplyVoltage - CapacitorVoltage) * ShuntResistance;
  Serial.println(CapacitorVoltage);
  delay(100);
  digitalWrite(PIN_DIGITAL_OUTPUT1, LOW);
  digitalWrite(PIN_DIGITAL_OUTPUT2, HIGH);
  delay(3000);
  digitalWrite(PIN_DIGITAL_OUTPUT1, LOW);
  digitalWrite(PIN_DIGITAL_OUTPUT2, LOW);
  return SoilResistance;
}

void loop() {
  const int PIN_DIGITAL_OUTPUT3 = 32;
  pinMode(PIN_DIGITAL_OUTPUT3, OUTPUT);
  digitalWrite(PIN_DIGITAL_OUTPUT3, LOW);
  delay(30000);
 
  // GetResistanceで土壌抵抗値を測定する
  float SoilResistance = GetSoilResistance();
  Serial.println(SoilResistance);
  WiFi.begin(ssid, password);  //  Wi-Fi APに接続

  while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
    delay(100);
  }

  Serial.print("WiFi connected\r\nIP address: ");
  Serial.println(WiFi.localIP());

  ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
  // 土壌抵抗値の値をAmbientに送信する
  ambient.set(1, String(SoilResistance).c_str());

  ambient.send();
  digitalWrite(PIN_DIGITAL_OUTPUT3, HIGH);//esp32の再起動
  delay(30000);
}

結果と考察

3日間電源を付けっぱなしにした結果、抵抗値は5000Ω-5700Ωとなりました。
日にちが経つにつれて抵抗値が大きくなっていますが、土が乾燥して抵抗値が上がっているのと考えられます。
また、1日の間に抵抗値が上がったり下がったりしていますが、温度の影響が考えられます。 f:id:GypsophilaRupi:20200113170333p:plain

まとめと課題

土壌の抵抗値を測定し、測定値を無線とAmbientを使用しパソコンで見れるようにしました。
3日程度だと、連続稼働できるのですが、それ以上だと、勝手に測定が止まってしまうのが今の課題です。