MSXで空気質を可視化!SGP30ガスセンサーをMSX0で使う方法

みなさん、こんにちは。

最近、私の中ではかなり盛り上がっているMSX。前回、Linux環境からmsxtermを使ってMSX0に接続し、簡単なホールセンサーの値を読み取る方法をご紹介しました。

今回はその続編として、より実用的なIoTデバイス制作に挑戦します。ターゲットは、現代のオフィスや自宅で気になる「空気の汚れ(空気質)」です。MSX IoT BASICを駆使して、ガスセンサーを動かしてみましょう!

 


 

準備編

 

MSX0(M5Stack Core2ベース)の真骨頂は、I2C通信にさえ対応していれば、最新のセンサーをIoT BASICで制御できるところにあります。今回は、二酸化炭素(eCO₂)と総揮発性有機化合物(TVOC)を測定できるTVOC/eCO2 ガスセンサユニット(SGP30)を使います。比較的安価で入手性も高いセンサーです。

必要なハードウェア

  • MSX0 Stack
    2026年1月現在、新品での入手は困難ですが、近々クラウドファンディングで新型のMSX0 Tab5が発表される見込みです。
  • SGP30 センサーユニット(M5Stack用などのGrove互換品がおすすめ)
  • I2Cケーブル(Port Aに接続します)

接続は非常にシンプルです。MSX0のPort A(赤いポート)にSGP30を差し込むだけ。内部的には、I2Cバスを通じてアドレス 0x58 で通信が行われます。

 


 

実装 – MSX IoT BASIC によるプログラム

 

動作を確認できるソースコードを作成しました。前回の記事を参考に以下の内容を AIR_QUALITY.BAS として保存し、msxterm で流し込んでみてください。

10 SCREEN 0:WIDTH 40:CLS
20 N$="device/i2c_a/58"
30 GOSUB 1000:'Initialize SGP30
40 '--- Main Loop ---
50 C$=CHR$(&H20)+CHR$(&H08):'Measure IAQ Command
60 _IOTPUT(N$,C$)
70 FOR J=1 TO 100:NEXT J:'Wait for measurement
80 _IOTGET(N$,S$)
90 IF LEN(S$)<9 THEN GOTO 50
100 GOSUB 2000:'Process Data
110 FOR K=1 TO 500:NEXT K:'Wait for next read
120 GOTO 40
1000 '--- Initialization ---
1010 PRINT "Initializing SGP30..."
1020 C$=CHR$(&H20)+CHR$(&H03):'IAQ_INIT
1030 _IOTPUT(N$,C$)
1040 FOR J=1 TO 500:NEXT J
1050 PRINT "Wait 15s for baseline..."
1060 FOR K=1 TO 1500:NEXT K:'Mandatory wait
1070 RETURN
2000 '--- Data Parsing ---
2010 E1=ASC(MID$(S$,1,1)):E2=ASC(MID$(S$,2,1))
2020 T1=ASC(MID$(S$,4,1)):T2=ASC(MID$(S$,5,1))
2030 EV=(E1*256)+E2:'eCO2 Value
2040 TV=(T1*256)+T2:'TVOC Value
2050 CLS:LOCATE 5,10
2060 PRINT "eCO2 : ";EV;" ppm"
2070 LOCATE 5,11
2080 PRINT "TVOC : ";TV;" ppb"
2090 IF EV>1000 THEN LOCATE 5,13:PRINT "!! VENTILATE !!"
2100 RETURN

コードの解説 – MSX IoT Basicならではのテクニック

MSX IoT Basicでセンサーを扱うには、いくつか「お作法」があります。

  1. I2Cのバイナリ送信
    SGP30へのコマンド(例: 0x2008)は、CHR$(&H20)+CHR$(&H08) のように文字列として組み立てて _IOTPUT で送信します。
  2. 変数名の2文字制約
    MSX IoT BASICでは変数名の先頭2文字しか識別されません。
    • EV = Estimated Value (eCO2)
    • TV = TVOC Value のように、短く意味の通る名前を付けるのがコツです。
  3. データ解析(Big-Endian)
    センサーから返ってくるデータは高位バイト(MSB)・低位バイト(LSB)の順です。EV=(E1*256)+E2 の計算式で、2つの8ビットデータを1つの数値に復元しています。

このコードをベースにエラー処理などを追加したソースコードをGitHubに公開していますので、よかったらこちらも参考ください。

SGP30 TVOC & eCO2 Sensor Reader for MSX0

 


 

実行結果と数値の読み方

 

プログラムを実行すると、15秒の待機(ベースライン学習)のあと、画面に数値が表示されます。

  • eCO2(二酸化炭素相当量)
    400〜1,000 ppm程度なら正常です。1,500を超えると「空気が悪い」状態ですので、窓を開けましょう。
    ただし、eCO2(二酸化炭素相当量)は、あくまで水素濃度などから「推定」した値です。実際のCO2値と比較すると誤差が多いのでご注意を。正確な換気指標が必要な場合は、NDIR方式のセンサー(SCD30など)が必要です。
  • TVOC(総揮発性有機化合物)
    タバコの煙や芳香剤、アルコール消毒液などに敏感に反応します。においセンサーとしての使い道があるかもしれません。

もし数値が 4000 から動かない場合は、センサーを指で軽く仰いでみたり、少し息を吹きかけたりして反応を確かめてみてください。

 


 

AIを活用したMSX IoT Basic開発

 

今回のプログラム、実はベースのロジックをChatGPTに出力させ、GitHub Copilotで「MSX IoT BASICの制約」に合わせて手直しさせたものです。

「I2Cのコマンドはこれ。MSX0の _IOTPUT を使って、変数名は2文字以内で書いて」

このようにAIに指示を出すことで、複雑なデータシートを読み解く時間を大幅に短縮できます。「最新のAIに、古のBASIC拡張言語の制約をコンテキストで与え、最新のセンサーを制御させる」。このギャップこそが、MSX0開発の醍醐味かもしれません。

MSX0 Tab5 のクラウドファンディングももうすぐ始まるはず。ぜひみなさんも手に入れてMSX0を使い倒してください!

 

本日も最後までお読みいただきありがとうございました。

それでは、よいMSXライフを!

「MSXで空気質を可視化!SGP30ガスセンサーをMSX0で使う方法」への1件のフィードバック

  1. ピンバック: MSX IoT BASIC 失敗学 – MAX30100で気づいた「BASIC向けセンサー」の選び方 - ビューローみかみ

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール