MENU

ESP32で温湿度計を作る:接触不良との格闘と、OLED表示の完成

すだれ自動化プロジェクトを進めている一日の記録です。BME280(温湿度・気圧センサー)をとりあえず安定して読めるようにして、最後はOLEDに気温と湿度を表示するところまでたどり着きました。接触不良にショートにと、いろいろやらかしましたが、全部自力で原因を突き止めて解決できたので、その記録を残しておきます。

なお、このプロジェクトを始めた経緯やESP32そのものの説明については、第1回の記事にまとめてありますので、そちらもあわせてどうぞ。

目次

この日のゴール

前回、BME280のはんだ付け(いわゆる「いも半田」)と格闘した続きです。今回の目標は、BME280を安定動作させて、キット付属の0.96インチOLEDに温度・湿度をリアルタイム表示すること。すだれ制御の中心機能になる「環境を測って表示する」を、まずは形にしたいところです。

接触不良は「配線のやり直し」で解決

BME280が動いたり動かなかったりを繰り返す、という状態が続いていました。はんだの温め直しで一箇所は直ったものの、それでも不安定なまま。

原因を探ってみると、柔らかいメス-オスのジャンパー線と、ブカブカのブレッドボードの組み合わせが悪さをしていました。そこで硬いオス-オスのジャンパー線に替えて、赤=電源、黒=GNDと色分けして配線し直したら、ピタッと安定。接触不良って、はんだだけじゃなく「線の質」や「挿し心地」もかなり効いてくるんだなと実感しました。ブカブカのブレッドボードは、それ自体が不具合の温床になります。

ここでの教訓は、試作の目的は完璧な接続じゃなくて「回路とコードが正しいことの確認」だということ。多少不安定でも、まず動く状態を作って先に進む。安定性は本番でユニバーサル基板にはんだ付けする段階で根本解決すればいい、と割り切ることにしました。

値が固まる問題(再掲・重要)

BME280が認識されているのに、値がずっと同じまま変わらない、という症状も出ました。原因は測定モードで、setup()の中で連続測定モード(MODE_NORMAL)を明示的に指定すると解決します。

これを入れると、息を吹きかけたときにちゃんと数値が動くようになります。「動いてるのか分からない」ときは、指で触るか息を吹きかけて反応を見るのが一番手っ取り早いです。

OLEDを足したらESP32のランプが消えた(ショート)

BME280が安定したので、いよいよOLEDを追加。ところが、つないだ瞬間にESP32の電源ランプがふっと消えました。

原因は、OLEDの4本(GND/VCC/SCL/SDA)を全部ブレッドボードの同じ縦1列に挿していたこと。ブレッドボードの縦1列は内部でつながっているので、VCCとGNDがショートしてしまったんです。ESP32が保護機能で電源を落として、ランプが消えたというわけでした。

解決策は、4本をそれぞれ別の列に挿し直すこと。OLEDのピンは役割が違うので、行き先も全部バラバラにする必要があります。VCC→3V3、GND→GND、SDA→D21、SCL→D22。ランプが消えたのは、ESP32が壊れずに自分を守ってくれた証拠でもあります。

改めて実感したブレッドボードの基本ルールは、中央部の縦1列(5穴)が内部でつながっているということ。だから同じ列に別々の信号を挿してはいけません。逆に、同じ信号を共有したいとき(I2CのSDA/SCLなど)は、あえて同じ列に挿すのが正解です。

I2Cは2本を共有できる

OLED(アドレス0x3C)とBME280(アドレス0x76)は、どちらもI2C。アドレスが違うので、SDA(D21)とSCL(D22)の2本を共有して同時につなげます。電源のVCC/GNDは電源レール(+と-の列)に集約して、そこから両方に配ると配線がすっきりします。

電源レールで注意したいのは、レールに電源を供給する「大元」(ESP32の3V3→+レール、GND→-レール)を忘れないこと。あと、レールは製品によっては中央で分断されていることがあるので、供給位置と使用位置が同じ区間にあるかもちゃんと確認しておきましょう。

完成:温度と湿度を表示

最終的なloop()はこんな感じです。温度は小数点2桁で表示すると、変化が見やすくて動作確認がしやすくなります。湿度も追加しました。

void loop() {
  float temp = bme.readTemperature();
  float hum = bme.readHumidity();

  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(2);

  display.setCursor(0, 0);
  display.print("T:");
  display.print(temp, 2);
  display.print("C");

  display.setCursor(0, 30);
  display.print("H:");
  display.print(hum, 1);
  display.print("%");

  display.display();
  delay(2000);
}

結果、OLEDに「T:32.91C」「H:47.4%」と2行で表示成功。使ったOLEDが上部黄色・下部青の二色タイプだったので、温度が黄色、湿度が青に色分けされて、狙わずして見やすいレイアウトになったのは嬉しい誤算でした。息を吹きかけるとちゃんと数値が動きます。

この日やらかしたこと・学んだこと

  1. 接触不良は線の質とボードの質も原因 — 硬いジャンパー線+色分けで安定。ブカブカのブレッドボードは不具合の温床。
  2. OLEDの全ピンを同じ列に挿してショート — ブレッドボードの縦列が内部でつながっていることを身をもって実感。ESP32の保護機能に救われました。
  3. 電源を疑う勘所 — 「認識されるのに値が変」なときは電源、「電圧は来てるのにnot found」なときは通信線(SDA/SCL/GND)を疑う。テスターとI2Cスキャナで切り分けます。
  4. 迷ったらシンプルに戻す — 配線が複雑になって切り分け不能になったら、一度動いていたシンプルな構成に戻すのが結局は最短ルートでした。

できあがったもの

この時点で、もう立派なデジタル温湿度計です。ESP32をモバイルバッテリー(USB 5V)につなげば、PCなしで単体動作します。今のUSBケーブルをモバイルバッテリーに挿し替えるだけ。養鶏場に持って行って実際の環境を測れば、すだれのしきい値決めの実測にも使えそうです。

豆知識ですが、基板の近くはESP32やセンサー自身の発熱で室温より高めに出やすいです。正確な室温が欲しければ、センサーを本体から少し離すのがコツ。すだれ制御ではこの特性を踏まえてしきい値を決めていくつもりです。

あと、モバイルバッテリーが自動オフ機能付きだと、消費電力の小さいESP32では数分で給電が止まってしまうことがあります。すぐ消えるようなら低電流対応のものに変えるのがよさそうです。

次にやること

  • 気温がしきい値を超えたらモーターを動かす制御へ
  • その前にモーターの選定・注文(すだれ寸法は確定済み:横88cm・縦157cm・約1.2kg)
  • 将来の電源化:ソーラー→チャージコントローラー→LiFePO4バッテリー→DC-DC降圧(12.8V→5V)→ESP32のVIN。モーターは大電流なので別系統にする予定

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次