0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ESP32入門】CO2モニターを作る #7 RGB LED編 〜調光機能に敗北した話〜

0
Posted at

はじめに

前回(#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への移行と、データベース連携に挑戦します。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?