CO2濃度測定で「眠気倍率」を可視化する
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Andium Anduino WiFiシールド | 1 | Arduino Due/Zero用WiFiシールド |
| Arduino Due | 1 | またはArduino Zero |
| CO2センサー(Cozir NDIRタイプ) | 1 | UART接続、3.3V動作 |
使用ソフトウェア・サービス
- Arduino IDE
- Adafruit IO(データ可視化・MQTT)
このプロジェクトについて
動機
午後の会議で眠くなったり、講義中に欠伸が止まらなかった経験はありませんか?睡眠不足が原因と思いがちですが、実は換気不足によるCO2濃度上昇が眠気の原因かもしれません!
このNDIR(非分散型赤外線吸収)CO2センサーを使えば、正確なCO2濃度をUARTシリアルで簡単に読み取れます。従来のCO2センサーは消費電力が大きく、ランプのウォームアップに時間がかかりましたが、このセンサーはLEDと赤外線検出器を用い、3.3Vで平均1.5mA以下の超低消費電力を実現。光学分散技術などを駆使した印象的なデバイスです(詳細はCozirデータシート参照)。

セットアップ
必要なもの:
- Arduino DueまたはZero
- Anduino WiFiシールド
- Cozir CO2センサー
- ジャンパーワイヤー数本
接続はシンプル。センサーは10ピンありますが、使用するのは4線のみ。

Arduino Due接続:
- 3.3V → センサー 3V3
- GND → センサー GND
- Rx (DIO19) → センサー Tx
- Tx (DIO18) → センサー Rx
※UARTはクロス接続(Tx↔Rx)してください。DIO0/DIO1(Serial)はシリアルモニタ用に残すため、センサー通信にはSerial1を使用します(他のUARTでも可)。
※Arduinoを介さず直接センサーをテストする場合:PuTTY等で9600bps、8N1、CR+LF送信設定で接続可能。
重要:このセンサーは3.3V TTLレベルです。5V系マイコンから制御する場合はロジックレベルシフター必須。
センサーのキャリブレーション
キャリブレーション方法はいくつかあります。最良は既知濃度ガス(窒素ガス=0ppm CO2)でゼロ点合わせ。手元にない場合は「外気(約450ppm)」で実用十分な精度でキャリブレーション可能です。



屋外で添付スケッチを動かし、calibrateFreshAir()のコメントを外して実行。これによりセンサーに'G'コマンドを送り、現在の環境を450ppm(標準外気濃度)として基準設定します。会議室・教室レベルの濃度差(1000ppm以上)を検知するには十分な精度です。
基本スケッチ(シリアルモニタ出力)
char buffer[20] = {0};
int c = 0;
void setup() {
Serial.begin(9600);
while(!Serial);
Serial1.begin(9600);
while(!Serial1);
Serial.println("Begin reading CO2 Levels");
// setOperatingMode(CZR_STREAMING);
// setOperatingMode(CZR_POLLING);
// calibrateFreshAir(); // 初回のみ有効化
}
void loop() {
delay(10000);
c = Request("Z");
Serial.print("CO2 : "); Serial.println(c);
Serial.println();
}
int Request(char* s) {
buffer[0] = '\0';
int idx = 0;
Command(s);
delay(250);
while(Serial1.available()) buffer[idx++] = Serial1.read();
buffer[idx] = '\0';
uint16_t rv = 0;
switch(buffer[1]) {
case 'T': rv = atoi(&buffer[5]); if(buffer[4]==1) rv+=1000; break;
default: rv = atoi(&buffer[2]); break;
}
return rv;
}
void Command(char* s) {
Serial1.print(s); Serial1.print("\r\n");
}
uint16_t calibrateFreshAir() { return Request("G"); }
void setOperatingMode(uint8_t mode) {
sprintf(buffer, "K %u", mode);
Command(buffer);
}
初回キャリブレーション後はcalibrateFreshAir()をコメントアウトし、ポーリングモード(setOperatingMode(CZR_POLLING))で運用します。シリアルモニタにCO2値が表示されれば次のステップへ。
クラウド(Adafruit IO)へデータ送信
Adafruit IOとAnduino WiFiの接続方法はこちらの記事を参照。以下は1分ごとにCO2濃度をAdafruit IOへ送信し、Anduino LCDにも表示するスケッチです。
#include <WiFi101.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "AnduinoLCD.h"
#define WLAN_SSID "YOUR_SSID"
#define WLAN_PASS "YOUR_PASSWD"
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "YOUR_AIO_USERNAME"
#define AIO_KEY "YOUR_AIO_KEY"
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish carbonDioxide = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/co2");
AnduinoLCD LCD = AnduinoLCD(ST7735_CS_PIN, ST7735_DC_PIN, 13);
static int co2 = 0, co2Prev = 0;
#define CZR_STREAMING 0x01
#define CZR_POLLING 0x02
char buffer[20] = {0};
void setup() {
Serial.begin(115200);
delay(3000);
Serial1.begin(9600);
connectToWiFi();
connectToAdafruit();
LCD.begin(); LCDinit();
// setOperatingMode(CZR_POLLING);
// calibrateFreshAir();
}
void loop() {
if(!mqtt.ping(3)) { if(!mqtt.connected()) connect(); }
co2 = Request("Z");
char b[20]; String str = String(co2);
for(int i=0;i<str.length();i++) b[i]=str.charAt(i);
b[str.length()+1]=0;
if(!carbonDioxide.publish((char*)b)) Serial.println(F("Failed to publish co2"));
else { Serial.print(F("co2 published: ")); Serial.println(co2); displayCo2(co2, co2Prev); }
Serial.print("CO2 : "); Serial.println(co2);
co2Prev = co2;
delay(60000);
}
// 以下、WiFi/MQTT接続、LCD表示、センサー通信関数は省略(元コード参照)
完成!
このセンサーは非常に高感度で、換気の良い部屋でも人数変化に伴うCO2濃度変化を捉えられます。「眠いのは微分方程式のせいじゃない、換気のせいだ!」と教授に証明できます。授業をビーチに移しましょう!

ライブラリ
Anduinoライブラリ: ArduinoをAndium Nodeに変えるライブラリ。GitHub
製造プロセス
- センサーデータをRaspberry Piに統合:実践ガイド
- LEGO Mindstorms EV3用カスタムオブジェクトセンサー構築: DIY光ベース「目」
- Lego Mindstorms NXT超音波センサーをRaspberry Piに直接接続する
- HC-SR04超音波センサーをRaspberry Piに接続する実践ガイド
- Acconeer A111パルスレーダーをRaspberry Piと統合:実践ガイド
- 店頭での顧客サービスを高める:可視性と効率化の先進戦略
- 産業メンテナンス:知っておくべき5つのレベルを解説
- CO₂レーザー vs Nd:YAGレーザー切断:主な違いを解説
- Sensirion、SCD40発表:超小型CO₂およびRH/Tセンサー
- RFワイヤレス電力でユニバーサルセンサネットワーク普及加速、配線・電池不要でAI時代の神経網構築へ
- RapidPlexセンサー:SARS-CoV-2自宅検査に関する5つの重要質問