CO2の見える化をもっと手軽にしたい。だからメニューバーに置いてみた
数年前にCO2計測モジュールが流行って、自分も秋月電子でMH-Z19Cを購入した。
手元のArduinoでCO2を計測して遊んだだけになっており、部屋の整理をしていたところ、押し入れの奥から出てきた。

それと一緒にラズパイゼロWも出てきた。

このラズパイゼロWはもともと何かの用途があったわけではない。 2019年にたまたま在庫が復活していたラズパイを「買えるときに買っておこう」と衝動買いして、ずっと箱に眠っていた。
この2つが出てきて、「常にCO2濃度を確認できるものを作ろう」と思い、色々調べてみたら、多くの方々が外付けLCDを使ったり7セグLEDで表示している例が多い。
しかし私は、「新しくパーツを買うのは面倒だし、お金もかけたくない」 という懐的な理由からあまりやりたくなかった。
そこで、“一番手軽に CO₂ を確認できる場所” はどこだろう? と考えてみた。 そして思いついた。 「Mac のメニューバーなら常に視界に入るし、美しく表示できるのでは?」
それが、このアプリを作ろうと思った最初のきっかけだ。
ラズパイで24時間 CO2モニタリングしてわかった、驚きの事実
実はこのアプリを作る前、ラズパイでCO2を24時間取得するスクリプトを走らせていた。 すると驚くほど興味深いデータが見えてきた。
たとえば、
部屋のドアを締めて寝ると、CO2がみるみる急上昇していく
灯油ファンヒーターは、CO2製造装置
窓を開けなくても、キッチンの換気扇を弱で回すだけで高速にCO2が下がる
これらはまさに「見える化」しなければ分からない発見だった。 だからこそ “リアルタイムで CO2 を確認できる仕組み” の必要性をかなり実感した。
ラズパイ側でAPIを作る
使い慣れているFlaskでAPIを作ります。
import time
import serial
from flask import Flask, jsonify
app = Flask(__name__)
ser = serial.Serial("/dev/serial0", 9600, timeout=1)
def read_co2():
try:
cmd = b'\xff\x01\x86\x00\x00\x00\x00\x00\x79'
ser.write(cmd)
res = ser.read(9)
if len(res) != 9:
return None
high = res[2]
low = res[3]
ppm = high * 256 + low
return ppm
except Exception as e:
print("Error:", e)
return None
@app.route("/co2")
def co2():
ppm = read_co2()
return jsonify({
"ppm": ppm if ppm is not None else -1,
"timestamp": int(time.time())
})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5001, debug=True)
APIサーバのURL:5001/co2でCO2濃度を取得することができる。
これはラズパイに直接アクセスしてCO2を取得する簡易的な実装であり、実際には私の環境では自宅サーバにCO2濃度データを投げて、どこでもアクセスできるようにしている。
メニューバー常駐アプリの開発
メニューバーに小さな数字が表示されるだけのアプリを考え作ることにした。
私はまだMacOSユーザー半年もない初心者だが、メニューバーに天気や常駐アプリのアイコンが表示されているのがなんとも美しく感じる。
天気の横にCO2濃度も表示できればぴったりだなと思い作ることにした。
https://github.com/mimoex/co2-menubar-macos
メニューバーに部屋のCO2濃度が表示された

今後追加したい機能
まだまだSwift初心者ではあるが、いくつかやりたいことがある。
- 閾値を超えたら通知を出す(これは意外と簡単そう)
- 過去数時間分のCO2グラフを描画する
Swiftプログラミングのドキュメントを見ていると通知APIなど整っているので、これはすぐにでもできそうだ。
CO2グラフはメニューバーのCO2をクリックしたときに表示させてみたい。
MacOSの天気をクリックすると時間毎の天気が表示されるような感じで。
