LoginSignup
5
3

Raspberry Pi Pico/w で 環境データを AMBIENT に記録と表示

Last updated at Posted at 2024-02-04

Raspberry Pi Pico W で気象環境データを記録

 Raspberry Pi Pico W で室内環境を記録するというのは、ネットに情報が結構ありますね。データの記録と可視化をクラウドでサービスしてくれる Ambient を使っている例も散見しますが、本家の mycropython ライブラリを使用した例が見つかりませんでしたので、自作したものを公開します。
改善点などご指摘いただければ嬉しい。

Ambient

Ambient は IoT データの可視化サービスです。
フリーミアムサービスで、制限内であれば無償で利用できるので、愛用させていただいております。

Anbient公式の micro python 用ライブラリー

API が公開されていますので、HTTPリクエストでも使えますが、ライブラリーを使うと簡単に利用できます。下のリンクに解説とライブラリーへのリンクがあります。
「MicroPythonからAmbientにデーター送信できるようにしました」

IMG_9707.png

作成したアプリのソース

Raspberry Pi Pico W に BME280 と 0.96インチOLEDディスプレイ(SSD1306)を繋いで送信データを確認できるようにしています。

【2024/2/7 追記】公開していたソースでは、5回くらいAmbientに送信した後、エラーで終了する現象が発生して、原因を調査しておりました。
Ambient の中の人から助言をいただき、送信後に毎回ガベージコレクションをするようにしたところ、エラーが発生せず長時間稼働し続けるようになりました。
ということで、以下のソースはその修正後のものです。

BME280_Ambient.py
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でダッシュボードを見ると、ちゃんと記録されていますね。
Ambidata.png

参考になれば幸いです。

【2024.02.26 追記】
 BME280 から取り込んだデータの補正にバグがありましたので、訂正しました。

5
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3