はじめに
前回(#6 NTP時刻編)でグラフのX軸に時刻を表示できるようになりました。
最終回の今回は RGB LEDでCO2レベルを色表示 します。
そして正直に書きます。今回は 一部の機能を諦めました。
「言われた通りにやってるのに動かない」——電子工作をやっていれば必ずぶつかる壁の話です。同じ場所でハマっている人に届けば嬉しいです。
なぜ色表示なのか
LCDには数値が出ています。メールも届きます。それでも色表示を追加した理由はシンプルで、部屋の向こうからでも一瞬で状況がわかる からです。
数字は読まないといけません。でも色は読まなくていい。
- 緑 → 良好
- 青緑 → 注意
- 黄 → 警告
- 赤 → 危険
信号機と同じです。人間は色なら0.1秒で判断できます。
使用する部品
| 部品 | 説明 |
|---|---|
| RGB LED(4本足) | 1個で何色でも光る |
| 抵抗 220Ω × 3 | LED保護用 |
RGB LEDは足が4本あります。R(赤)・G(緑)・B(青)・GNDです。
3色の光を混ぜることで黄色なども表現できます。
光の三原色:
- 赤 + 緑 = 黄色
- 赤 + 青 = マゼンタ
- 緑 + 青 = シアン
配線
| RGB LED | 抵抗 | ESP32 |
|---|---|---|
| R | 220Ω | GPIO25 |
| GND | なし | GND |
| G | 220Ω | GPIO26 |
| B | 220Ω | GPIO27 |
R・G・Bの足には必ず抵抗を挟みます。直結するとLEDが壊れます。
コード(レベル別の色表示)
#define LED_R 25
#define LED_G 26
#define LED_B 27
void setup() {
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
}
CO2レベル判定のif文に、LEDの制御を追加します。
if (co2Value >= 5000) {
// 赤(危険)
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, LOW);
digitalWrite(LED_B, LOW);
} else if (co2Value >= 2000) {
// 黄(警告)= 赤 + 緑
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_B, LOW);
} else if (co2Value >= 1000) {
// 青緑(注意)= 緑 + 青
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_B, HIGH);
} else {
// 緑(良好)
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_B, LOW);
}
ここまでは順調でした。問題はこの後です。
事件:LEDが眩しすぎる
点灯させてみると、想像以上に眩しい。
寝室に置くことも考えると、明るさを下げたくなりました。
調べると ledcWrite というPWM制御で明るさを0〜255の256段階で調整できるとのこと。
// 設定
ledcAttach(LED_R, 5000, 8);
// 明るさ50で点灯
ledcWrite(LED_R, 50);
「これで眩しさ問題も解決だ」と思っていました。
LCDが死んだ
ledcWrite に書き換えて実行した瞬間、LCDに何も表示されなくなりました。
コードを見直しても間違いはない。配線も触っていない。エラーも出ない。
なのに映らない。
正直、このときのストレスは凄まじかったです。「言われた通りにやっているのに、なぜできないのか」 と何度も思いました。
原因:リソースの競合
調べてわかったのは、ESP32の ledcAttach は内部でPWMチャンネルやタイマーを割り当てており、それが他の機能と競合することがあるということでした。
さらに私の環境ではフラッシュメモリが95%まで逼迫しており、状況を悪化させていました。
つまり「コードの書き間違い」ではなく、マイコンのリソースの問題だったのです。
これはエラーメッセージが出ないので、初心者には本当に気づきにくい罠です。
決断:調光を諦める
数時間格闘した結果、私はこう判断しました。
「調光機能を捨てて、digitalWriteに戻す」
// ledcWrite(LED_R, 50); ← 諦めた
digitalWrite(LED_R, HIGH); // ← こっちに戻した
戻した瞬間、LCDは何事もなかったように復活しました。
眩しさは…LEDに半透明のテープを貼って物理的に解決しました(笑)
この失敗から学んだこと
全部の機能を載せることが正解ではない、ということです。
| 学び | 内容 |
|---|---|
| マイコンには限界がある | フラッシュ95%は危険水域 |
| エラーが出ない不具合もある | リソース競合は無言で壊れる |
| 撤退も技術 | 動く状態を守る判断が大事 |
| 物理で解決もアリ | テープ1枚で済むこともある |
ソフトで無理ならハードで解決する。これも電子工作の面白さだと思います。
完成したもの
これで当初の構想がすべて形になりました。
- ✅ CO2濃度を5秒ごとに計測
- ✅ LCDに数値とレベル表示
- ✅ RGB LEDで色表示
- ✅ 1000ppm超えでGmail通知
- ✅ ブラウザでグラフ表示(時刻付き)
部屋の空気が悪くなると、LEDが緑→青緑→黄と変わっていきます。色が変わったら換気する。それだけの装置ですが、毎日使う実用品になりました。
シリーズまとめ
7回にわたってCO2モニターを作ってきました。
振り返ると、つまずいた回数は数え切れません。タイポ、配線ミス、メモリ不足、原因不明の不具合。
でも、つまずいた数だけ学びがありました。
これから電子工作を始める方へ。エラーは敵ではなく教材です。動かない時間こそが一番成長している時間でした。
次はESP32-S3への移行と、データベース連携に挑戦します。
完