Raspberry Pi Pico W で気象環境データを記録
Raspberry Pi Pico W で室内環境を記録するというのは、ネットに情報が結構ありますね。データの記録と可視化をクラウドでサービスしてくれる Ambient を使っている例も散見しますが、本家の mycropython ライブラリを使用した例が見つかりませんでしたので、自作したものを公開します。
改善点などご指摘いただければ嬉しい。
Ambient
Ambient は IoT データの可視化サービスです。
フリーミアムサービスで、制限内であれば無償で利用できるので、愛用させていただいております。
Anbient公式の micro python 用ライブラリー
API が公開されていますので、HTTPリクエストでも使えますが、ライブラリーを使うと簡単に利用できます。下のリンクに解説とライブラリーへのリンクがあります。
「MicroPythonからAmbientにデーター送信できるようにしました」
作成したアプリのソース
Raspberry Pi Pico W に BME280 と 0.96インチOLEDディスプレイ(SSD1306)を繋いで送信データを確認できるようにしています。
【2024/2/7 追記】公開していたソースでは、5回くらいAmbientに送信した後、エラーで終了する現象が発生して、原因を調査しておりました。
Ambient の中の人から助言をいただき、送信後に毎回ガベージコレクションをするようにしたところ、エラーが発生せず長時間稼働し続けるようになりました。
ということで、以下のソースはその修正後のものです。
import network
import WIFI_CONFIG
import machine
import ssd1306
import time
import sys
from bme280 import BME280
import math
import ambient
import gc
sda = machine.Pin(0)
scl = machine.Pin(1)
i2c = machine.I2C(0,sda=sda, scl=scl, freq=400000)
bme = BME280(i2c = i2c)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
ssid = WIFI_CONFIG.SSID
password = WIFI_CONFIG.PSK
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
oled.init_display()
oled.text("WiFi NOT connect.",0,5)
oled.show()
break
max_wait -= 1
oled.init_display()
oled.text("WiFi connecting.",0,5)
oled.show()
time.sleep(1)
# setup AMBIENT
chID = <<チャネルID>>
writeKey = <<書き込み用キー>>
am = ambient.Ambient(chID, writeKey)
def sensor_read():
oled.init_display()
t, p, h = bme.read_compensated_data()
t = math.floor((t / 100.0 + 0.5) * 10) / 10
p = math.floor((p / 256.0 / 100 + 0.5) * 10) / 10
h = math.floor((h / 1024.0 + 0.5) * 10) / 10
oled.text("Temp: ", 0, 1)
oled.text(str(t)+"C", 40, 1)
oled.text("Pres: ", 0, 16)
oled.text(str(p) + "hPa", 40, 16)
oled.text("Hum: ", 0, 31)
oled.text(str(h) + "%", 40, 31)
# upload data to AMBIENT
r = am.send({'d1': t, 'd2': p, 'd3':h})
oled.text("sent: "+str(r.status_code),0,46)
oled.show()
# garbage collection
gc.collect()
if __name__ == '__main__':
while True:
try:
sensor_read()
except KeyboardInterrupt:
sys.exit()
time.sleep(60 * 10)
Ambientでダッシュボードを見ると、ちゃんと記録されていますね。
参考になれば幸いです。
【2024.02.26 追記】
BME280 から取り込んだデータの補正にバグがありましたので、訂正しました。