
概要
- ESP8266 で、フィカス・ウンベラータの鉢の水分を監視してみたので紹介
- 最近は ESP32 を使ってるので、余ってる ESP8266 を有効活用したくて作ってみた
わかったこと
- Amazon とかにある センサ は直流測定で錆びそう(未確認)
- 最近、静電容量式のが出てたのを知った。自分が作り始めた後の発売だが。
なので錆びなさそうなステンレスの棒を使ってみた(100均のおたまの柄の部分)
元々はステンレスの針金を使おうと思ってた単純にテスターであたると直流だからなのか値が安定しなかった
DE-5000 で 1KHz とかで測るとそこそこ安定する
値的には 200Ω~2KΩぐらいが検出できればよさげなので、GPIO を2本使って+-を交互に与えて、真ん中を ADC で測ることにした。真ん中というか電源が 3.3V で ADCが 1V までなので片方に寄らせる。
試した限りでは、高周波の方が差が出やすい。(ESP8266 の ADC の速度的に連続して読んでも 2.5KHz が最速みたいなので、これ以上は試してないが)
でも、接地面積が少ないらしく、少し動かすだけで値が大きく変動するので、接地面積を広げるべきかも?根の邪魔になりそうだけど。
あたりまえだけど成長してるときは乾くのが早い
HW
上記の2本のステンレス棒を鉢に刺す
Sensor Probe
Sensor Probe を埋めた
Breakout 基板に直接チップ部品で配線
電源周り、Enable pin、Reset pin 周りの回路は既に覚えていない。。 チップ部品で容量とかわからず。。
エネループ4本を NJM2845DL1-33 で 3.3V に落として、100μF + 2.2μF なコンデンサを付けて安定している。容量不足な気もするが。
センサー周りは以下で合ってるはず(ここはチップ部品使ってないので見える)
Schematic
SW
ADC 読むのは、最初を4回捨てて、10回平均を取る、ぐらいが安定する感じだった
+- を同じ時間にするために片方(GPO4が+の時)は読むだけで捨てるint readAdc() { pinMode(4, OUTPUT); pinMode(5, OUTPUT); int sum = 0; int sum2 = 0; int n = 0; for (int i = 0; i < 14; ++i) { // Ignore 4 times and then capture 10 times digitalWrite(4, 1); digitalWrite(5, 0); n = analogRead(A0); // A0 = 17 if (i > 3) sum += n; digitalWrite(4, 0); digitalWrite(5, 1); n = analogRead(A0); // A0 = 17 if (i > 3) sum2 += n; } digitalWrite(4, 0); digitalWrite(5, 0); pinMode(4, INPUT); pinMode(5, INPUT); return sum2; }
RTC memory に保存して、30分後に起きるようにして deep sleep に入る
あとで code を貼る
24 回 = 12 時間 に 1 回はメールで履歴を送る
あとで code を貼る
ADC で取得した値が閾値以上だったらメールを送る
あとで code を貼る
ESP8266 的なハマりどころ
RF Disable で寝て起こすと、ADC は不安定
- 不安定というのか大きな値が安定して読める状態になることがある
以下で寝ると、起きた後 ADC は不安定
ESP.deepSleep(t, RF_DISABLED);
以下で寝ると、起きた後 ADC は安定する
ESP.deepSleep(t, RF_DEFAULT);
https://github.com/esp8266/Arduino/issues/2070#issuecomment-244152778
ここのFirst results wih my analog CO2 meter on a ‘heavy loaded’ esp, polling once every minute:
NONE_SLEEP_T = looks stable
MODEM_SLEEP_T = spikesと同じ結果。
MODEM_SLEEP_T = spikes と書かれている通り、消費電力減らそうと modem を寝かすと ADC が不安定。
ただ、逆に MODEM_SLEEP_T で安定すると書いている人もいるからどっちが正しいかは不明。
起きた直後に Wi-Fi 接続は安定するが、ADC 読んでから Wi-Fi 接続は不安定
https://github.com/esp8266/Arduino/issues/2070#issuecomment-244152778
ここの通り、以下3行を WiFi.begin(ssid, password) する前に追加すると安定するWiFi.persistent(false); WiFi.mode(WIFI_OFF); // this is a temporary line, to be removed after SDK update to 1.5.4 WiFi.mode(WIFI_STA);
Sleep のタイマーは精度悪すぎ
- まぁ期待してた訳でもないけど。RTCという名前だから、そこそこ精度いいかと思ったら、そうでもなかった。
- ここが詳しい
- 実測
設定時間:30min * 48 * 5 = 120h
実際:2018/06/06 11:34:00 ~ 2018/06/11 8:43:00 = 117:09:00 = 117.15h
比率:120 / 117.15 = 1.024(2^10な値に見えるが、たまたまのはず)
消費電力
- Ambientさんの記事 によると、ピークで 300mA、安定したところで 75mA ぐらい、Deep Sleep 中は 0.5mA ぐらい
- 今回は10秒程度で寝るので、300(300*1)mAsec + 675(75*9)mAsec = 975mAsec、1日48回起きて 48*975=46800 [mAsec / day] = 46.8 [mAh / day]
- Deep Sleep で 0.5mA * 60sec * 60min * 24hour = 86400 [mAsec / day] = 24 [mAh / day]
- 足して、70.8 [mAh / day]
- eneloop が 2000 [mA * hour] とすると、2000 / 70.8 = 28.2 [day] は保つ
- 実際は、24 回に 1 回しか Wi-Fi 接続しないので、平均した消費電力はもっと低いはず
結果
6/5に始めて8/26でまだ動作中
Graph
9/19のメール送信後、息絶えた。。3か月と14日もった。
Graph (電源切れるまで)
- メール止まってから24時間ぐらいで eneloop を抜いたのだが、0.9V, 0.7V, 0.03V, 0.02V まで下がっていてやばい感じだった。ニッケル水素は 0.9V ぐらいが限界で 1.1V ぐらいでやめるべきなはず。
