Arduino超音波距離・温度モニター:LCD表示とアラーム機能付き水位監視システム
必要なパーツと用品
| パーツ | 数量 |
|---|---|
| Arduino UNO | 1 |
| 16x2 キャラクタLCD (白文字/青背景、Adafruit標準タイプ) | 1 |
| 超音波センサー HC-SR04 | 1 |
| DS18B20 防水温度センサー (1-Wire) | 1 |
| 4.75kΩ 抵抗 (DS18B20プルアップ用) | 1 |
| タクトスイッチ 12mm | 1 |
| 可変抵抗 10kΩ (LCDコントラスト調整用) | 1 |
| ブザー (8mA以下推奨) | 1 |
| LED (緑・黄・赤 各1) | 3 |
| 220Ω 抵抗 (LED用) | 3 |
| ブレッドボード | 1 |
| ジャンパーワイヤー | 1式 |
使用アプリ
- Arduino IDE
プロジェクト概要
このプロジェクトは、水槽/水タンクの水位と水温を監視するシステムです。超音波センサーでセンサーから水面までの距離を測定し、水位レベルを3段階で判定。LCDに距離と温度を表示し、LEDとブザーでアラートを出します。
- 水位 LOW (距離 > 40cm): 緑LED点灯
- 水位 MEDIUM (20cm < 距離 ≤ 40cm): 黄色LED点灯
- 水位 HIGH (距離 ≤ 20cm): 赤LED点滅 + ブザー音
これはより大きなシステムの一部です。第2段階ではポンプ稼働中を示す6個のチェイサーLEDリングを追加予定。第3段階では水位HIGHでポンプ起動、LOWで停止する磁気接点式制御を実装予定 (工事中)。実運用では防水型超音波センサーを使用しますが、配線とコードは共通です。湿度による測定への影響は未検証のため、本システムは「情報表示用」とし、ポンプ制御は別系統で行う想定です。
配線
- 超音波センサー Trig → Arduino D9
- Echo → Arduino D7
- DS18B20 データ線 → Arduino D6 (4.75kΩで5Vにプルアップ)
- LCD: RS→D12, Enable→D11, D4→D5, D5→D4, D6→D3, D7→D2 (4ビットモード)
- 緑LED → D13 (220Ω経由)
- 黄色LED → D8 (220Ω経由)
- 赤LED/ブザー → D10 (220Ω経由、同一ピン共用・電流注意)
- タクトスイッチ → 未使用ピン (将来拡張用)
- 可変抵抗 → LCD Voピン (コントラスト調整)
ソースコード
Arduinoスケッチ (C/C++)
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal LCD(12, 11, 5, 4, 3, 2);
int trigPin = 9;
int echoPin = 7;
int myCounter = 0;
float pingTime;
float targetDistance;
float speedOfSound = 776.5; // マイル/時 (約340m/s)
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
LCD.begin(16, 2);
LCD.setCursor(0, 0);
LCD.print("Distance:");
sensors.begin();
pinMode(8, OUTPUT); // 黄色LED
pinMode(10, OUTPUT); // 赤LED/ブザー
pinMode(13, OUTPUT); // 緑LED
}
void loop() {
// 超音波距離測定
digitalWrite(trigPin, LOW);
delayMicroseconds(2000);
digitalWrite(trigPin, HIGH);
delayMicroseconds(15);
digitalWrite(trigPin, LOW);
delayMicroseconds(10);
pingTime = pulseIn(echoPin, HIGH); // μs
pingTime = pingTime / 1000000.0; // 秒
pingTime = pingTime / 3600.0; // 時間
targetDistance = speedOfSound * pingTime; // マイル
targetDistance = targetDistance / 2.0; // 往路のみ
targetDistance = targetDistance * 160934.4; // cm変換
// 温度取得
sensors.requestTemperatures();
// LCD表示更新
LCD.setCursor(10, 0);
LCD.print(" "); // クリア
LCD.setCursor(10, 0);
LCD.print((int)(targetDistance + 0.5));
LCD.print("cm ");
LCD.setCursor(0, 1);
LCD.print(" "); // クリア
LCD.setCursor(0, 1);
if (targetDistance > 40) {
LCD.print("LEV LOW ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223); // 度記号
LCD.print("C");
} else if (targetDistance > 20) { // 40以下かつ20超
LCD.print("LEV MED ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223);
LCD.print("C");
} else { // 20以下
LCD.print("LEV HIGH ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223);
LCD.print("C");
}
delay(2000);
// LED/ブザー制御
if (targetDistance > 40) {
digitalWrite(13, HIGH); // 緑ON
} else {
digitalWrite(13, LOW);
}
if (targetDistance > 20 && targetDistance <= 40) {
digitalWrite(8, HIGH); // 黄ON
} else {
digitalWrite(8, LOW);
}
if (targetDistance <= 20) {
digitalWrite(10, HIGH); // 赤ON + ブザー
delay(2000);
digitalWrite(10, LOW);
} else {
digitalWrite(10, LOW);
}
}
注意点:
- 元コードの
delayMicroseconds(1000)(Trig HIGH時間) は長すぎます。HC-SR04仕様は10μs以上なので、上記ではdelayMicroseconds(15)に修正しています。 - 音速をマイル/時 (776.5) で定義し、最終的にcmに変換していますが、よりシンプルに
targetDistance = pingTime * 0.01715(μs→cm) とするのが一般的です。 - 元コードの
else (targetDistance < 20);は構文エラーになるため、単純なelseに修正しています。 - 赤LEDとブザーが同一ピン (D10) で共有されているため、ブザー電流が8mA以下のものを使用してください。
回路図
Fritzingファイル: lcd_pot_led_buzz_pb_distsens_temp_EHVdF6S1L7.fzz
製造プロセス
- QR・RFID・体温検知統合アクセス制御システム(Raspberry Piベース)
- 複数DS18B20 1-WireセンサーをRaspberry Pi接続で精密温度監視
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- Raspberry PiとDS18B20でマルチセンサー温度・光監視システムを構築
- Raspberry Piと湿度センサーで作る自動エアロポニックスシステム
- Raspberry Pi、MCP9808、InfluxDB、Grafanaで作る家庭温度モニター
- Arduino Portenta H7にMAX6675でサーモカップル温度センサーを接続する
- DHT11温湿度センサーで作る温度アラート – LEDとピエゾブザーで視覚/聴覚通知
- スマートホーム連携向けマルチポジション温度センサーシステム
- DS1302 RTCとArduino UNOで作る信頼性の高い目覚まし時計
- NASAゴダード研究所、リアルタイム流量・温度監視用ラボオンチップセンサを開発