【M5StickC Plus】OpenMeteoの天気予報データをMicroPythonで取得する。

Python

M5StickC Plusとは

M5StickC PLUSは ESP32-PICO-D4 と Wi-Fi を搭載している、オープンソースの IoT 開発ボードです。

M5StickCPlusに人感センサーをつけたもの

仕様

ResourcesParameter
ESP32240MHz dual core, 600 DMIPS, 520KB SRAM, Wi-Fi
Flash Memory4MB
Power Input5V @ 500mA
PortTypeC x 1, GROVE(I2C+I/0+UART) x 1
LCD screen1.14 inch, 135*240 Colorful TFT LCD, ST7789v2
ButtonCustom button x 2
LEDRED LED
MEMSMPU6886
Buzzerbuilt-in buzzer
IRInfrared transmission
MICSPM1423
RTCBM8563
PMUAXP192
Battery120 mAh @ 3.7V
Antenna2.4G 3D Antenna
PIN portG0, G25/G36, G26, G32, G33
Operating Temperature0°C to 60°C
Net weight15g
Gross weight21g
Product Size48.2*25.5*13.7mm
Package Size65*25*15mm
Case MaterialPlastic ( PC )

ソースコードの説明

  • 人感センサーが人を感知したら、OpenMeteoのAPIをコールして天気予報データを取得
  • 最高気温と最低気温、取得した時刻を表示
  • 何に使うかはよくわからない、けど、練習してみた感じ。

全体

from m5stack import *
from m5ui import *
from uiflow import *
import utime
import urequests
import network
import ntptime
import hat

# WiFiのssid
ssid = "ssid"
# WiFiのパスワード
password = "password"

# 背景
lcd.clear(lcd.BLACK)

# Sensor
hat_pir0 = hat.get(hat.PIR)
label0 = M5TextBox(5, 5, "MAX Temperature", lcd.FONT_Default,0xFFFFFF, rotate=0)
label1 = M5TextBox(5, 20, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)
label2 = M5TextBox(5, 50, "MIN Temperature", lcd.FONT_Default,0xFFFFFF, rotate=0)
label3 = M5TextBox(5, 64, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)
label4 = M5TextBox(5, 85, "Get Time", lcd.FONT_Default,0xFFFFFF, rotate=0)
label5 = M5TextBox(5, 100, "", lcd.FONT_Default,0xFFFFFF, rotate=0)

def connect_wifi():
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print("connecting to network...")
        sta_if.active(True)
        sta_if.connect(ssid, password)
        while not sta_if.isconnected():
            pass
    print("network config:", sta_if.ifconfig())

def get_weather():
    
    try:
        info_dict = urequests.request(
        method='GET',
        url='https://api.open-meteo.com/v1/forecast?latitude=35.6785&longitude=139.6823&hourly=temperature_2m&timezone=Asia%2FTokyo',
        headers={'Content-Type':'application/json'}
        )
        
        ntp = ntptime.client(host='jp.pool.ntp.org', timezone=9)
        
        max_temp = max(info_dict.json()['hourly']['temperature_2m'])
        min_temp = min(info_dict.json()['hourly']['temperature_2m'])
        
        label1.setText(str(max_temp))
        label3.setText(str(min_temp))
        label5.setText(ntp.formatDatetime('-',':'))
        
    except Exception as e:
        lcd.text(lcd.CENTER, lcd.CENTER, "No Data")
        raise e

while True:
    # wifi接続
    connect_wifi()
    
    if hat_pir0.state:
        get_weather()
        speaker.tone(1000,500,50)
        utime.sleep(60)

    utime.sleep(1)

グローバル

  • ssid,passwordはconnect_wifiで使用
  • lcd.clear(lcd.Black)は、画面を黒く塗りつぶす機能
  • hat.get(hat.PIR)は、M5Stick CPlusのセンサーを使うためのインスタンスを生成
  • label0-label5は、M5TextBoxを使ってLCDに文字列を表示
# WiFiのssid
ssid = "ssid"
# WiFiのパスワード
password = "password"

# 背景
lcd.clear(lcd.BLACK)

# Sensor
hat_pir0 = hat.get(hat.PIR)
label0 = M5TextBox(5, 5, "MAX Temperature", lcd.FONT_Default,0xFFFFFF, rotate=0)
label1 = M5TextBox(5, 20, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)
label2 = M5TextBox(5, 50, "MIN Temperature", lcd.FONT_Default,0xFFFFFF, rotate=0)
label3 = M5TextBox(5, 64, "0", lcd.FONT_Default,0xFFFFFF, rotate=0)
label4 = M5TextBox(5, 85, "Get Time", lcd.FONT_Default,0xFFFFFF, rotate=0)
label5 = M5TextBox(5, 100, "", lcd.FONT_Default,0xFFFFFF, rotate=0)

connect_wifi

  • ここでは、グローバル変数のssidpasswordを使って、Wifiに接続を試みます。
def connect_wifi():
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print("connecting to network...")
        sta_if.active(True)
        sta_if.connect(ssid, password)
        while not sta_if.isconnected():
            pass
    print("network config:", sta_if.ifconfig())

get_weather

  • OpenMeteoのAPIをコールして、天気予報データを取得しinfo_dictに格納
  • max_temp,min_tempに最高気温、最低気温を格納
  • ntpにntptime.clientで取得した時刻のオブジェクトを格納
  • label1,label3のsetTextで取得した最高気温と最低気温を格納し、ディスプレイに表示
  • label5のsetTextで取得した時刻を格納し、ディスプレイに表示
def get_weather():
    
    try:
        info_dict = urequests.request(
        method='GET',
        url='https://api.open-meteo.com/v1/forecast?latitude=35.6785&longitude=139.6823&hourly=temperature_2m&timezone=Asia%2FTokyo',
        headers={'Content-Type':'application/json'}
        )
        
        ntp = ntptime.client(host='jp.pool.ntp.org', timezone=9)
        
        max_temp = max(info_dict.json()['hourly']['temperature_2m'])
        min_temp = min(info_dict.json()['hourly']['temperature_2m'])
        
        label1.setText(str(max_temp))
        label3.setText(str(min_temp))
        label5.setText(ntp.formatDatetime('-',':'))
        
    except Exception as e:
        lcd.text(lcd.CENTER, lcd.CENTER, "No Data")
        raise e

while true

  • wifiに接続
  • hat_pir0.stateで人感センサーが感知しているか[1:感知]
  • speaker.toneで、内蔵のブザーを鳴らす
  • utime.sleep(60)でセンサー感知していれば60秒待機
while True:
    # wifi接続
    connect_wifi()
    
    if hat_pir0.state:
        get_weather()
        speaker.tone(1000,500,50)
        utime.sleep(60)

    utime.sleep(1)

M5StickCPlusはこんな感じになる

コメント

タイトルとURLをコピーしました