前回はラズパイとSEN-CCS811を組み合わせて、CO2のデータを測定する方法について紹介しました。今回はディスプレイを接続し、計測したCO2とTVOCのデータを表示させる方法について解説します。
SEN-CCS811の測定値はコンソール画面に表示できますが、いちいち参照するのは面倒です。そこでディスプレイを接続して表示させます。ディスプレイは、こちらもAmazonで販売されている「DSD TECH 2 PCS OLED 0.91インチディスプレイ IIC I2C シリアルポート ARM用」(1599円)を使います。
このディスプレイは「SSD1306」というデバイスで動いており、公開されているCircuitPythonのライブラリを使います。まずはライブラリを以下のコマンドでインストールします。
$ sudo pip3 install adafruit-circuitpython-ssd1306
このままで動作させても文字は表示されますが、日本語表示をさせるためにフォントをインストールします。以下のコマンドを入力してIPAフォントをインストールします。IPAフォントフォントはその名前の通り、情報処理推進機構が配布しています。
$ sudo apt-get install fonts-ipafont
フォントは「/usr/share/fonts/opentype/ipafont-gothic/」に、ゴシック体の「ipag.ttf」、明朝体の「ipam.ttf」としてインストールされます。これを踏まえて、まずは文字を表示させてみましょう。
プログラムは以下の通りです。18行目の「ipag.ttf」はゴシック体の指定なので、これを「ipam.ttf」にすると明朝体になります。
#!/usr/bin/env python # -*- coding: utf-8 -*- import board import adafruit_ssd1306 import time from PIL import Image from PIL import ImageDraw from PIL import ImageFont i2c = board.I2C() oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3c) # ディスプレイの初期化 oled.fill(0) oled.show() image = Image.new("1", (oled.width, oled.height)) draw = ImageDraw.Draw(image) # フォントの指定 font = ImageFont.truetype("/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf", 13) # テキストを表示させる draw.text((0, 0), "世界の国へこんにちは!", font=font, fill=255) draw.text((0, 17), "Hello World!", font=font, fill=255) oled.image(image) oled.show() time.sleep(5) oled.fill(0) oled.show()
「世界の国へこんにちは!」と「Hello World!」が5秒間表示されたでしょうか。
ではこれらを踏まえて、CO2の値をディスプレイに表示させてみましょう。前回に紹介したプログラムを改編することで作り上げていきます。プログラムは以下のようなものでした。
#!/usr/bin/env python # -*- coding: utf-8 -*- import time import board import adafruit_ccs811 i2c = board.I2C() # uses board.SCL and board.SDA ccs811 = adafruit_ccs811.CCS811(i2c) # Wait for the sensor to be ready while not ccs811.data_ready: pass while True: print("CO2: {} PPM, TVOC: {} PPB".format(ccs811.eco2, ccs811.tvoc)) time.sleep(1)
この中のprint文を、ディスプレイへ表示させるように変更します。以下のようになります。
#!/usr/bin/env python # -*- coding: utf-8 -*- import board import time import adafruit_ccs811 import adafruit_ssd1306 from PIL import Image from PIL import ImageDraw from PIL import ImageFont i2c = board.I2C() ccs811 = adafruit_ccs811.CCS811(i2c) oled = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, addr=0x3c) # フォントの指定 font = ImageFont.truetype("/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf", 13) def runCCS811(): while True: oled.fill(0) oled.show() image = Image.new("1", (oled.width, oled.height)) draw = ImageDraw.Draw(image) print("CO2: {} PPM, TVOC: {} PPB".format(ccs811.eco2, ccs811.tvoc)) time.sleep(0.1) draw.text((0, 0), "二酸化炭素:{}PPM".format(ccs811.eco2), font=font, fill=255) draw.text((0, 17), "有機化合物:{}PPB".format(ccs811.tvoc), font=font, fill=255) time.sleep(0.1) oled.image(image) oled.show() time.sleep(2) if __name__ == '__main__': try: runCCS811() time.sleep(0.1) except (KeyboardInterrupt, SystemExit) as exErr: print("\nMeasurement end") oled.fill(0) oled.show()
これで2秒おきに、ディスプレイ画面に二酸化炭素量とTVOCが表示されるようになります。
【訂正:2021年9月21日午前10時30分 記事初出時、OLEDについて記載している箇所で液晶ディスプレイと表記している部分がありました。訂正しておわびいたします】
Copyright © ITmedia, Inc. All Rights Reserved.
Special
PR