|
カテゴリ:コンピューター
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, I2C from ssd1306 import SSD1306_I2C import utime # pix_res_x = 128 # SSD1306 horizontal resolution pix_res_y = 64 # SSD1306 vertical resolution i2c_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 format oled = 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分ほど待つと、確からしいデータが出てきますのでしばらく待つといいでしょう。 以上です。 お気に入りの記事を「いいね!」で応援しよう
|