M5Stackで家とオフィスの二酸化炭素濃度を計測した

M5Stackで二酸化炭素濃度を測るものを作って、家とオフィスの二酸化炭素濃度を計測したので、それについて書きます。


二酸化炭素濃度が高まると、肩こりや頭痛などが起こりやすくなると言われてます。一定量を超えると脳の働きが悪くなって、眠気も出てくるようです。

エンジニアの例に漏れず、自分も以前から肩こりに悩まされてきました。あと、きちんと休息と睡眠をとってるにも関わらず、いつも決まった時間に集中が落ちてくるので、それも改善したいと考えてました。

二酸化炭素濃度が見えるデバイスを作って、家とオフィスの二酸化炭素濃度を計測・分析しシェアしたら、それらを改善できるかもと考えたので、試しにやってみました。

用意したもの

二酸化炭素濃度が見えるデバイスを作るため、中華製のCO2センサー MH-Z19とマイコンボード M5Stackを使いました。

  • M5Stack Basic(スイッチサイエンスで購入 4,490 円)
  • MH-Z19(Aliexpressで購入 2,000円ほど)
  • ピンヘッダ

CO2センサーは一般的なセンサーと比べると高いですが、MH-Z19はそれらと比べるととてもお手頃な価格です。

M5Stackについては過去に何度かこのブログで取り上げてるので、はじめての方はそちらも読んでみてください。

つなぎ方

M5StackとMH-Z19をUARTでつなぎました。MH-Z19にはピンヘッダをはんだづけしてます。

  • M5Stack TX2 → MH-Z19 RX
  • M5Stackk RX2 → MH-Z19 TX
  • M5Stack 5V → MH-Z19 Vin
  • M5Stack GND → MH-Z19 GND

ファームウェア

M5Stackにファームウェアを書き込む方法は複数あります。今回はM5Cloudを使いました。開発言語はMicroPythonを使ってます。

M5Cloudのセットアップについては、公式サイトの下記のドキュメントを参考にしてください。

ファイルは以下のように配置してます。ambient.pyはpython用のAmbientライブラリでambient-python-libからダウンロードして配置してます。

Amibientはログをグラフにしてくれるサービスです。後からグラフ形式でCO2濃度を見るため使ってます。

以下がmain.pyの中身です。

Ambientの設定の部分は、Ambientのサイトで自身のチャンネルを作って、それに書き換えてください

from m5stack import *
from machine import UART
import time
import ambient
previousTime = time.time()
updateCount = 0
label = "Number of measurements : "
am = ambient.Ambient("AmbientのチャンネルIDに書き換えてください", "Ambientのリードキーに書き換えてください")
lcd.setColor(lcd.BLACK, lcd.WHITE)
lcd.clear(lcd.WHITE)
lcd.font(lcd.FONT_Default)
lcd.text(11, 0, label + str(updateCount))
uart = UART(2, tx=17, rx=16)
uart.init(9600, bits=8, parity=None, stop=1)
b = bytearray(b'\xff\x01\x86\x00\x00\x00\x00\x00\x79')
c = bytearray(9)
def getStatus(ppm):
status = ""

if ppm < 450:
status = "perfect"
elif ppm < 700:
status = "good"
elif ppm < 1000:
status = "not good"
elif ppm < 1500:
status = "warning"
elif ppm < 5000:
status = "critical"
else:
status = "emergency"
return status
def saveAmbient(ppm):
global previousTime
global updateCount
global label
currentTime = time.time()
if 60 < (currentTime - previousTime):
if (410 < ppm) and (ppm < 6000):
r = am.send({'d1': ppm})
print(r.status_code)
r.close()
previousTime = currentTime

lcd.textClear(11, 0, label + str(updateCount))
updateCount = updateCount+1

lcd.font(lcd.FONT_Default)
lcd.text(11, 0, label + str(updateCount))
def getPPM():
uart.write(b)
uart.readinto(c,9)
ppm = c[2]*256+c[3]

return ppm
def displayPPM():
ppm = getPPM()
val = str(ppm)

lcd.font(lcd.FONT_DejaVu24)
lcd.text(11,100, val + " ppm")

status = getStatus(ppm)
lcd.font(lcd.FONT_DejaVu24)
lcd.text(11,200, status)

saveAmbient(ppm)
time.sleep_ms(3000)

lcd.textClear(11,100, val)
lcd.textClear(11,200, status)
while True:
displayPPM()

完成

中央に二酸化炭素濃度(PPM = parts per million)を表示させてます。下段を見れば、その濃度がどのくらい良いかが分かるようになってます。

二酸化炭素濃度の数値は数秒おきに最新のものを画面に表示していて、Ambientには60秒毎にその数値を送ってます。

注意点

MH-Z19は起動後 30秒くらい正しい数値を返さないようです。正確な数値が出るまで、ゆっくり待ちましょう。

オフィスの二酸化炭素濃度 計測結果

窓のない高層ビル内なので高いと考えてましたが、予想に反して低い数値でした。

朝12:00で850ppm、お昼休みの時間が一番低くて750ppm。
午後4:00頃がピークでしたが、それでも室内の合格レベルである1000ppm以内でした。

人の数と連動してppmが上がってるので、正しい数値が出てると判断して良さそうです。

自席は問題なさそうでしたが、MTGルームのような狭い場所は濃度が高い可能性があるので、今後はそちらの数値も順に追ってみて、その上でバックオフィスの方々と一緒に動けるか考えてみようと思います。

自宅の二酸化炭素濃度 計測結果

人が少ないのでオフィスより低いと予想してましたが、想像以上に悪かったです。

帰宅時は1600ppm(悪い室内空気環境、換気が不十分)、帰宅後 数時間で2000ppm(眠気を感じる人が出てくる濃度)まで上がってました。

体感でも2000ppmを超えたくらいから眠気出てきました。10分間換気を行って600ppmまで落としたら眠気が吹き飛んだので、今後は冬場でも意識して換気を行っていこうと思います。

まとめ

  • 換気は大事。Hueで時間帯ごとに集中力が増す色に光を調整したり、Nature Remoで最適な温度に自動調整するのも過去にやったが、二酸化炭素濃度の調整が今のところ一番作業パフォーマンスに影響出てる。
  • 見える化も大事。人間のカンはあてにならない。
  • 大きな部屋より狭い部屋のほうが二酸化炭素濃度が上がりやすい。注意が必要。
  • M5Stackはディスプレイ、Wifi、バッテリーがついてるので、こういった用途に向いてる。
  • 動くものを作って、どういった事ができるか継続して見せるのが、会社でIoT的なことを広める上で重要。二酸化炭素濃度を共有したらM5Stackやおうちハックについて興味を持ってくれる人が出てきた。あとワークショップを主催することになったのと、技術書典に同僚と参加することにもなった。