本記事の内容
前回に引き続き、DHT22センサで取得した気温を直観的に見れるように、気温の変化を時系列グラフで表示させてみました。
Raspberry Pi Pico初心者でも作成しやすいように、サンプルコードとディスプレイ表示部分の解説を載せています。
必要なもの・配線
- Raspberry Pi Pico
- DHT22センサ
- SSD1306有機ELディスプレイ
必要な部品と配線は前回と変わりありません。配線図に関しては、前回の記事を参考にしてください。
グラフを表示させるプログラムコード
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
from DHT22 import DHT22
import time
dht22 = DHT22(Pin(16,Pin.IN,Pin.PULL_UP))
i2c = I2C(1, scl=Pin(15), sda=Pin(14), freq=200000)
oled = SSD1306_I2C(128, 64, i2c)
oled.rect(8, 8, 112, 40, 1)
oled.text("measuring",24,16,1)
oled.text("in progress",16,32,1)
oled.show()
time.sleep(6)
oled.fill(0)
while True:
oled.line(0,0,0,50,1)#グラフ縦軸
oled.text("0",2,40,1)#縦軸メモリ
oled.text("40",2,0,1)#縦軸メモリ
for x in range(100):
T, H = dht22.read()
if T is None:
T = 0
H = 0
oled.fill_rect(0, 56, 128, 64, 0)#最下部の気温湿度表示部分を消す
oled.text("T={:3.1f}C".format(T),0,56)
oled.text("H={:3.1f}%".format(H),64,56)
oled.line(x+20,int(40-T),x+20,int(40-T)-1,1) #プロットを書く
if x == 99: #グラフ右端の時は、先頭を消す
x = -1
oled.line(x+21,40,x+21,0,0) # 一つ先のプロットを消す
oled.show()
time.sleep(60)
SSD1306有機ELディスプレイとはI2C通信で繋ぎ、DHT22はライブラリを読み込んでいます。
DHT22は、起動後数秒間は気温と湿度をNoneで返します。数値の変換エラー防止のため、初期表示画面を12秒表示させてから測定・ディスプレイ表示を開始させ、エラー時は0度となるようにしています。
最下段の「time.sleep(60)」は、任意の測定間隔に変更して問題ありません。
グラフ表示コードの詳細解説
①グラフのプロットと削除
1分(60秒)ごとにxを加算して、x軸を99まで右に移動します。100分(1時間40分)でグラフの左端に帰ってきます。
oled.lineで幅1pxの気温プロットを打つと同時に、色0(黒)で一つ右のグラフ部分を塗りつぶして、2周目以降も正しいグラフが一本だけ表示されるようにしています。
②測定した気温と湿度の表示
DHT22で測定された気温と湿度を表示します。そのままでは文字が上書きされて読めなくなってしまうため、こちらも色0(黒)で一度塗りつぶしてから表示させています。
動作確認
無事に気温の変化をグラフで表示させることができました。気温の変化量が大きくないと、グラフはとても平坦になります。
まとめ
DHT22で測定した気温を時系列データとして見えるように、グラフで表示させてみました。
気温測定のみならず、グラフ表示は色々な装置に応用できるので、是非ご活用ください。
コメント
Import DHT22のところでエラーが起きてしまうのですが対処法はありますか?