記憶力が無い

プログラミングと室内園芸と何か

Raspberry Pi Pico W から Prometheus にメトリクスを送信する Part2

気が付いたら今年ももうおわりですね...

はじめに

blog.ttk1.net

前回こちらの記事で Raspberry Pi Pico W と BME680 モジュール を使って、自宅の環境(気温、湿度、気圧)を可視化する話を書きました。

今回は、せっかく Raspberry Pi Pico W を使ってるんだから、バッテリー給電で使えないか試行錯誤した話を書こうと思います。

モバイルバッテリー給電

普段使いしていない Anker の 5000mAh のモバイルバッテリーがあったので、それで給電しようとしてみたところ、しばらくすると勝手に動作が止まることが分かりました。

どうやら負荷が低いときに勝手に給電を止めてしまう機能があるらしく、その影響を受けてるようでした。 LED を取り付けて定期的に光らせるなどして消費電力を上げれば、止まることはなくなると思われますが、そこまでしてモバイルバッテリーにこだわることはないかなと思い、別の方法を探しました。

その他、以下のような装置を使うことでも対策ができるようです:

バッテリーエコキャンセル基板 — スイッチサイエンス

一般的な電池給電

Raspberry Pi Pico は 1.8V~5.5V の電源があれば、内部で 3.3V に変圧して動作するようです。 乾電池なら 2 ~ 3 本、ニッケル水素電池なら 2 ~ 4 本で駆動させることができます。

参考: 【Raspberry Pi Pico】電池駆動での動作実験 | メタエレ実験室

今回は、容量の多いニッケル水素電池である エネループプロ を使ってみることにしました。

2 本使って給電した結果... 大体 1 日で電池切れになりました。 1 本あたり 2500mAh で合計 5000mAh なのでもうちょっと持つのかなと期待しましたが、微妙な結果に終わりました。

そして、ここでモチベが尽きて数カ月放置することに...

低消費電力化

放置してる間も、ちょくちょく対策については調べていて、deepsleep なるものを使うことで、待機中の消費電力を抑えることができるという情報を見つけていました。 また Wi-Fi の電源を落とすことで、さらなる消費電力化ができるようです。

参考: ディープスリープでRaspberry Pi Pico Wを低電力化する - MSR合同会社

ということで重い腰を上げて前回紹介したコードを deepsleep 使う + Wi-Fi の電源を切るように書き直しました:

import utime
import network
import urequests
import ntptime
import machine

from bme680 import BME680
from prometheus_remote_write_payload import PrometheusRemoteWritePayload

import config


def main():
    # Wi-Fi を On にする
    wifi = machine.Pin(23, machine.Pin.OUT)
    wifi.high()

    ssid = config.wifi_ssid
    password = config.wifi_password
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    utime.sleep(5)
    if wlan.status() != 3:
        raise Exception("network connection failed")
    ntptime.settime()

    prometheus_remote_write_endpoint = config.prometheus_endpoint
    prometheus_remote_write_endpoint_basic_auth = (
        config.prometheus_user,
        config.prometheus_password,
    )
    device = BME680()
    device.measure()
    timestamp = int(utime.time() * 1000)
    labels = {"instance": config.instance}
    prometheus = PrometheusRemoteWritePayload()
    prometheus.add_data(
        "home_env_temp",
        labels,
        device.temp,
        timestamp,
    )
    prometheus.add_data(
        "home_env_press",
        labels,
        device.press / 100,
        timestamp,
    )
    prometheus.add_data(
        "home_env_hum",
        labels,
        device.hum,
        timestamp,
    )
    urequests.post(
        prometheus_remote_write_endpoint,
        data=prometheus.get_payload(),
        auth=prometheus_remote_write_endpoint_basic_auth,
    )

    # Wi-Fi を Off にする
    wlan.disconnect()
    wlan.active(False)
    wifi.low()


if __name__ == "__main__":
    try:
        main()
    except:
        pass
    # 全体でだいたい 1 分毎に実行されるように 50 秒 deepsleep
    machine.deepsleep(50 * 1000)

結果...

11/23 の 9:45 頃に電池駆動を開始し、11/28 の 12:55 頃にデータの送信が途切れていました。 5 日とちょっと持ちました (11/26 頃に急に下がってるのは、室内からベランダに移動したため)

1 週間は持って欲しかったですが、まあ許容範囲ですかね?

まとめ

4 カ月ほど放置してましたが、ようやく進捗が出ました。 deepsleep や Wi-Fi を Off にするなどで低消費電力化することで、電池給電でもある程度使い物になりそうなことがわかりました。

今後の展望:

  • 1 週間以上持つように改善
    • 実行の間隔を 1 分から 5 分程度までのばす
    • 使う電池の数を 3 か 4 に増やす(充電用に追加で購入必要ですが)、など
  • 3D プリンタでケースを自作

ちなみに Raspberry Pi Pico 2 には省電力モードというのがあるらしいですね。 Wi-Fi 使うときにも効果あるかわかりませんが気になってます。

参考: Raspberry Pi Pico 2の省電力モードを有効にして待機電力を3V・0.05mA以下に下げてみた - GIGAZINE

Copyright © 2017 ttk1