ラズベリーパイpicoでCO2測定④フリスクサイズのCO2モニター
CO2モニターができました。11x3.5x1.2cmのケースに収めました。ケースは2mmのアクリル板をレーザーカットして作りました。①ハードウエア ラズパイpicoとの配線は以下のようにしました。ここで、MHZ-19CのRXにPICOのUART-TX、MHZ-19CのTXにPICOのUART-RX、をつなぎます。実は逆につないで、動作せず。しばらく悩んだ。②ラズパイPICOのコーディング MicroPythonで組んであります。ラズパイPICOを初期化して(やり方はYouTubeやWEBで検索してください)USB経由でWindowsのThonnyからコーディングします。PICO内の不揮発メモリーに2つのコードを保存します。必要なものは、ssd1306.py:OLED用ドライバーです。main.py:CO2センサーからデータを取り、表示するコードです。ssd1306.pyはThonnyの”ツール”→”Manage packges...”から検索してダウンロードします。右上、[Serch on PyPi]をクリックすると"micropyton-ssd1306"があたりますので、[インストール]を押してRaspberryPICOに保存します。main.pyは以下です。################################################################ SSD1306 OLED Display I2C Tests with the Raspberry Pi Pico# 2021/5/7 by BenzennYa# ssd1306 package from# https://github.com/raspberrypi/pico-micropython-examples/tree/master/i2c/1306oled# Raspberry Pi PicoでCO2濃度を測定する by Qiita@SamAkada# https://qiita.com/SamAkada/items/f9bbd8f777d8aa7fc6d9#################################################################from machine import Pin, I2Cfrom ssd1306 import SSD1306_I2Cimport utime#pix_res_x = 128 # SSD1306 horizontal resolutionpix_res_y = 64 # SSD1306 vertical resolutioni2c_dev = I2C(1,scl=Pin(15),sda=Pin(14),freq=400000) # start I2C on I2C1 (GPIO 26/27)i2c_addr = [hex(ii) for ii in i2c_dev.scan()] # get I2C address in hex formatoled = SSD1306_I2C(pix_res_x, pix_res_y, i2c_dev) # oled controller#----画面表示---oled.fill(0) #OLEDの表示を消すoled.text("CO2: ppm",20,0) #数値表示用の固定文oled.line(0,10,0,64,1) #グラフ軸oled.text("1K",2,40,1)oled.text("2K",2,15,1)oled.show()#gx=0 # グラフx軸初期化mhz19c=machine.UART(1,baudrate=9600) # UART#----CO2数値とグラフの表示---while True: for gx in range(98): data=bytearray([0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79]) mhz19c.write(data) mhz19c.readinto(data,len(data)) co2=data[2]*256+data[3] print(str(co2)+'ppm') oled.text(str(co2),60,1) oled.show() utime.sleep(1) # 時間をおいて # CO2数値を消去 for v in range(8): oled.line(60,v,100,v,0) oled.show() # if co2 > 2200: co2 = 2200 oled.line(gx+20,64,gx+20,64-int(co2/50),1) # 棒グラフを書く oled.line(gx+21,64,gx+21,15,0) # 一つ先の棒グラフを消す oled.show() #oled show #横軸97picselで先頭に戻す if gx == 97: oled.line(20,64,20,15,0) #先頭の棒グラフを消す gx=0#-----------それぞれ、コメントを入れてありますので参考にしてください。なお、 utime.sleep(1) # 時間をおいてで、1秒間隔で測定表示していますが、10秒~60秒;utime.sleep(10)やutime.sleep(60)くらいが実用的だと思います。③その他 電源(USBを差し込む)を入れるとmain.pyは自動的に動きます。 MHZ-19Cは、補正をかけることができるのですが、動作しなくなったら怖いので、そのまま使っています。換気の良い室内で470ppmですので、目安としてはいいと思います。 また、電源投入時はおかしなデータが出力されます。1分ほど待つと、確からしいデータが出てきますのでしばらく待つといいでしょう。以上です。