M5StickCで温度や湿度、気圧計を作ろう(LCDのON/OFF機能付き)

2021年4月2日

はじめに

前回、開発に役立つ幾つかのTipsを紹介しましたが、それを利用して実際に仕えるものを作ってみたいと思っています。

今回はタイトルにもなっているように、温度、湿度、気圧計です。
では早速いってみましょう。こんなやつ。

準備するもの

M5StickC

こちらが本体となります。

ENV.Ⅱ HAT

初期設定の方法は以前の記事を参照ください。

実際のプログラム

from m5stack import *
import hat
import _thread
from machine import I2C

# 変数宣言
LcdOn = True

# WiFi設定
import wifiCfg
wifiCfg.autoConnect(lcdShow=True)

# 時刻同期
import ntptime, utime
ntp = ntptime.client(host='jp.pool.ntp.org', timezone=9)

# 表示ON/OFFボタン処理
i2c = I2C(freq=400000, sda=21, scl=22) #Enable I2C
def buttonA_wasPressed():
    global LcdOn
    LcdOn = not LcdOn
    if LcdOn:
        i2c.writeto_mem(52, 0x28, b'\xcc')
        i2c.readfrom_mem(52, 0x12, 1)
        i2c.writeto_mem(52, 0x12, b'\x1f')
    else:
        i2c.writeto_mem(52, 0x12, b'\x13')
        i2c.writeto_mem(52, 0x28, b'\x9c')
btnA.wasPressed(buttonA_wasPressed)

# 時刻表示(スレッド)
def time_data():
    while True:
        lcd.font(lcd.FONT_DefaultSmall, rotate = 0)
        lcd.rect(70 , 70, 160, 80, lcd.BLACK, lcd.BLACK)
        lcd.print('{}/{:02d}/{:02d} {:02d}:{:02d}'.format(*time.localtime()[:5]),60, 70, lcd.WHITE)

        utime.sleep(100)
_thread.start_new_thread(time_data , ())

# ENV HAT(スレッド)
def env_data():
    while True:
        hat_env0 = hat.get(hat.ENV2)
        Env_T = str('{:.1f}'.format(hat_env0.temperature))
        Env_H = str('{:.1f}'.format(hat_env0.humidity))
        Env_P = str('{:.1f}'.format(hat_env0.pressure))

        # Print
        lcd.font(lcd.FONT_Default,rotate = 0)
        lcd.rect(70 , 0, 160, 70, lcd.BLACK, lcd.BLACK)
        lcd.print(Env_T + ' C', 70, 5 , color=lcd.WHITE)
        lcd.print(Env_H + ' %', 70, 25 , color=lcd.WHITE)
        lcd.print(Env_P + ' hPa', 70, 42 , color=lcd.WHITE)

        utime.sleep(1000)
_thread.start_new_thread(env_data , ())

# 画面の初期化
lcd.setRotation(1)
lcd.font(lcd.FONT_Default)
lcd.rect(0, 0, 65, 160, lcd.BLACK, lcd.BLACK)
buttonA_wasPressed

# タイトル
lcd.rect(0, 0, 50, 80, lcd.ORANGE, lcd.ORANGE)
lcd.font(lcd.FONT_Default,rotate = 270)
lcd.print('Room' ,10,60,color=lcd.WHITE)
lcd.print('Check' ,30,60,color=lcd.WHITE)

ポイントは、Aボタンを押したときにLCDをON、OFFにする部分かと思います。
ちょっとややこしいですが、サンプル通りに書いていただければ、動作すると思います。

まとめ

いかがでしたでしょうか?ちょこっとプログラムを書けば、色々なものが作れそうですね。実装していませんが、5分おきに温度や湿度を送ってグラフを生成するとか、湿度がある一定以上高くなると携帯に通知して知らせてくれるとか・・・夢が広がります。

おもちゃ感覚で遊べますので、是非試してみてください。

IT

Posted by スングル