土壌水分計の自作 その4 Ambient使用による土の抵抗値の無線通信
はじめに
土壌水分計は最終的に外に置いてあるプランターに設置します。
一方で水分量確認は部屋の中で行えると便利です。
今回は土の抵抗値を無線で通信し、パソコンで受信することを可能にしました。
一連の動作確認方法を図で示すと下のようになります。
使用するもの
回路図
ソースコード
参考にしたプログラムはこちらです。 github.com このフォルダのZIPファイルをダウンロードして、サンプルプログラムのインストールを行います。 詳しくは下記リンクを参考にしてください。
そのうえで、土壌抵抗値の測定は下記のプログラムにて行います。
/* 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日の間に抵抗値が上がったり下がったりしていますが、温度の影響が考えられます。
まとめと課題
土壌の抵抗値を測定し、測定値を無線とAmbientを使用しパソコンで見れるようにしました。
3日程度だと、連続稼働できるのですが、それ以上だと、勝手に測定が止まってしまうのが今の課題です。