概要

  • ESP8266 で、フィカス・ウンベラータの鉢の水分を監視してみたので紹介
  • 最近は ESP32 を使ってるので、余ってる ESP8266 を有効活用したくて作ってみた

わかったこと

  • Amazon とかにある センサ は直流測定で錆びそう(未確認)
    • 最近、静電容量式のが出てたのを知った。自分が作り始めた後の発売だが。
  • なので錆びなさそうなステンレスの棒を使ってみた(100均のおたまの柄の部分)
    元々はステンレスの針金を使おうと思ってた

  • 単純にテスターであたると直流だからなのか値が安定しなかった
    DE-5000 で 1KHz とかで測るとそこそこ安定する
    値的には 200Ω~2KΩぐらいが検出できればよさげ

  • なので、GPIO を2本使って+-を交互に与えて、真ん中を ADC で測ることにした。真ん中というか電源が 3.3V で ADCが 1V までなので片方に寄らせる。

  • 試した限りでは、高周波の方が差が出やすい。(ESP8266 の ADC の速度的に連続して読んでも 2.5KHz が最速みたいなので、これ以上は試してないが)

  • でも、接地面積が少ないらしく、少し動かすだけで値が大きく変動するので、接地面積を広げるべきかも?根の邪魔になりそうだけど。

  • あたりまえだけど成長してるときは乾くのが早い

HW

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 接続は不安定

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

    Graph

  • 9/19のメール送信後、息絶えた。。3か月と14日もった。 Graph (電源切れるまで)

    Graph (電源切れるまで)

    • メール止まってから24時間ぐらいで eneloop を抜いたのだが、0.9V, 0.7V, 0.03V, 0.02V まで下がっていてやばい感じだった。ニッケル水素は 0.9V ぐらいが限界で 1.1V ぐらいでやめるべきなはず。