Air Surfer:Arduino Mega 2560で作るCO2・温湿度・気圧監視システム
必要な部品と材料
- Arduino Mega 2560 R3 ×1
- 3.2インチ TFTディスプレイ(Mega直結タイプ 480×320) ×1
- MH-Z19 CO2センサー(UART接続) ×1
- Si7021 温湿度センサー(I2C) ×1
- DS18B20 防水温度センサー(屋外用) ×1
- DS1307 RTCモジュール(I2C) ×1
- LM2596 DC-DC可変レギュレーター(7V出力設定) ×1
- フォトレジスタ(明るさ検知・LED輝度調整用) ×1
- ステンレス製プッシュボタン(LED内蔵) ×3
- 航空コネクタ GX12-3ピン(屋外センサー接続用) ×1
- DCジャック、電源アダプター(12V/15V/19V対応可)
- 合板 3mm(ケース自作用)
プロジェクト概要
民間のCO2モニターでは物足りず、CO2濃度・室温湿度・屋外温度・時刻を一緒に表示できる自作モニター「Air Surfer」を開発。Arduino Mega 2560と直結型TFTディスプレイで配線を最小限に抑え、木製ケースに収めました。総額約55ドル(約6,000円)で実現。
センサー詳細と工夫
MH-Z19 CO2センサー
UART通信(9600bps)で濃度を取得。自動キャリブレーション機能あり(無人時の400ppmを基準に補正)。初回24時間はキャリブレーション中で値が不安定。PWM出力も可能だがUARTを採用。
Si7021 温湿度センサー
I2C接続で高精度。トラブルフリーで扱いやすい。
DS18B20 防水温度センサー
1-Wireプロトコル。4.7kΩプルアップ抵抗必須。ステンレスカプセル入りで屋外設置に最適。
表示とUI
- CO2濃度:緑(400-800ppm)/ 黄(800-1200)/ 赤(1200以上)でLEDと画面インジケータ連動
- 湿度・室温・屋外温度も色分け表示
- フォトレジスタで周囲明るさを検知し、ボタンLEDとステータスLEDの輝度を自動調整
- 3つのボタンで時刻合わせ(時/分)と文字色変更
- 安価なTFTの色反転・白ドット対策で、正午/真夜中に画面リフレッシュ

電源回路
手持ちの19V/15VアダプターをLM2596で7Vに降圧し、ArduinoのVinへ供給。7Vなら発熱も少なく安定動作。航空コネクタで屋外センサーを着脱可能に。

ケース製作の試行錯誤
- ポリマークレイ → 形状維持難、オーブンで焦がす失敗
- 6mm合板 → 切断に電動工具必須、加工大変
- 3mm合板 → カッターナイフとヤスリだけで加工可能、アクリル塗装で仕上げて良好

コスト内訳(参考)
| 部品 | 費用(USD) | 備考 |
|---|---|---|
| Arduino Mega 2560 | 8.27 | |
| TFT 3.2インチ | 8.00 | |
| MH-Z19 CO2 | 20.00 | 最も高価 |
| Si7021 | 2.00 | |
| DS18B20カプセル | 1.14 | |
| DS1307 RTC | 0.55 | |
| その他(電源、配線、木材等) | 15.55 | |
| 合計 | 55.51 |
完全スケッチ
UTFTライブラリ等を使用。画面描画、センサー読み取り、ボタン処理、明るさ自動調整、画面リフレッシュなど全機能を1つのループで処理。
#include <Wire.h>
#include <RTClib.h>
#include <SoftwareSerial.h>
#include <SparkFunHTU21D.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <UTFT.h>
#define ONE_WIRE_BUS 9
#define GREENLED 5
#define YELLOWLED 7
#define REDLED 8
#define BUTTONLED 11
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
UTFT myGLCD(CTE32HR, 38, 39, 40, 41);
HTU21D myHumidity;
RTC_DS1307 rtc;
extern uint8_t Ubuntu[];
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
unsigned char response[9];
unsigned int ppm;
unsigned long time;
int photocellReading;
int hourupg, minupg;
float humd, temp;
int tcolor, Z;
boolean Reset = false;
void setup() {
myGLCD.InitLCD();
myGLCD.clrScr(); myGLCD.fillScr(VGA_WHITE);
myGLCD.setBackColor(VGA_WHITE);
Serial3.begin(9600);
sensors.begin();
myHumidity.begin();
rtc.begin();
pinMode(GREENLED, OUTPUT);
pinMode(YELLOWLED, OUTPUT);
pinMode(REDLED, OUTPUT);
pinMode(BUTTONLED, OUTPUT);
pinMode(2, INPUT_PULLUP); // 時ボタン
pinMode(3, INPUT_PULLUP); // 分ボタン
pinMode(4, INPUT_PULLUP); // 色変更ボタン
Z = 0;
}
void loop() {
co2(); // MH-Z19読み取り
photosensor(); // 明るさ読み取り→LED輝度調整
dateandtime(); // ボタンで時刻合わせ
th(); // Si7021/DS18B20読み取り
if (digitalRead(4) == LOW) { tcolor++; if (tcolor >= 13) tcolor = 0; }
drawmain(); // 画面描画
lamps(); // LEDインジケータ制御
screenreset(); // 正午/真夜中に画面クリア
}
// 以下、co2(), th(), photosensor(), drawmain(), lamps(), dateandtime(), screenreset() 関数定義...
回路図

製造プロセス
- OpenSensorsで空気質を測定: ArduinoとPythonによるガイド
- DIY空気質モニター:コスト効率の良いEPA準拠検知器
- エアシリンダーアクチュエーターの理解:基礎と用途
- 設備に最適なエアコンプレッサー選びの究極ガイド
- スーパーチャージャーがエンジン効率と性能を向上させる仕組み
- 自動車エアコンシステムの仕組み:快適な車内環境を実現する技術
- エアサスペンションシステム完全解説:重量車両へのメリット・構成・種類
- エアインジェクションシステム完全解説:排出ガス低減メカニズムと仕組み
- エアコンプレッサーの冬季対策ガイド:寒冷地での機器保護と凍結防止
- 圧縮空気:見えないコストが利益を圧迫する
- 圧縮空気が支える日常プロセス:身近な用途を紹介