DIY集水槽水位モニター - Arduino Nano、MPXV5010DP、OLEDディスプレイ
部品と材料
| 部品 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| Freescale MPXV5010DP 差圧センサー(0-10kPa, 0-5V出力) | 1 |
| 0.96インチ OLEDディスプレイ(I2C、2色) | 1 |
| MCP4725 DAC(I2C、12bit) | 1 |
| リレーモジュール(ドライ接点出力用) | 1 |
| チップコンデンサ(1μF, 0.01μF, 470pF) | 各1 |
| プラスチックプロジェクトボックス(110×85mm) | 1 |
| タイゴンチューブ(3/32インチ) | 1 |
プロジェクト概要
集水槽(サムプ)の水位を非接触で監視するモニターを自作しました。超音波センサーより信頼性が高く設置が容易な差圧センサー(MPXV5010DP)を採用。センサーはチューブで銅管に接続し、銅管を集水槽内まで延ばすことで、本体を水から離れた安全な場所に設置できます。


設計のポイント
- ローカル表示: OLEDで水位をインチ単位でリアルタイム表示
- 外部インターフェース: リレー接点出力(アラーム用)、DACによる0-5Vアナログ出力(他システム連携用)
- センサー保護: DACでセンサー出力をバッファーし、配線トラブルからセンサーを保護
- I2Cバス: OLEDとDACをI2Cで接続、ソフトウェア変更で他Arduinoへデータ提供可能
動作仕様
- MPXV5010DP: 0-10kPa = 0-1020mm水頭 に対応
- Arduino ADCでセンサー電圧を読み取り、オフセット/スパン補正
- 水深をmm→インチ変換してOLED表示
- 設定水位(デフォルト12インチ)超過で画面反転表示 + リレー接点動作(アラーム出力)
- DAC出力で0-5V電圧として水位を外部出力
ソースコード
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <Adafruit_MCP4725.h>
#include <math.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
Adafruit_MCP4725 dac;
int relayPin = 5;
int analogPin = 0; // DAC出力確認用ADC
int analogPin2 = 1; // MPXV5010DP入力
int v1 = 0; // MPXV5010DP ADC値
int v2 = 0; // DAC入力用スケーリング値
int v3 = 0; // mm換算値
int v4 = 0; // 深度パーセント
int v5 = 0; // DAC出力読み戻し値
int v6 = 0; // mV換算値
float v7 = 0; // インチ換算値
int v8 = 0; // 表示用整数インチ
int offSet = 40; // 0kPa時のADC値(実測で調整)
int maxSet = 1015; // 10kPa時のADC値(実測で調整)
int maxHeight = 1020; // 満水深度 mm
int ranging = (maxHeight * 0.8) + offSet;
int alarmHeight = 12; // アラーム閾値(インチ)
float divisor = 25.4; // mm→インチ変換
void setup() {
Serial.begin(9600);
Serial.println("DAC test with DP sensor");
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
dac.begin(0x60);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, HIGH); // リレーOFF(Active LOW想定)
}
void loop() {
v1 = analogRead(analogPin2);
delay(1000);
if (v1 < offSet) v1 = offSet;
// DAC出力値計算(0-4095)
v2 = map(v1, offSet, maxSet, 0, 4095);
dac.setVoltage(v2, false);
// 水深計算
v3 = (v1 - offSet) / 0.8; // mm
v7 = v3 / divisor; // インチ
v8 = round(v7); // 整数インチ
v4 = map(v1, offSet, ranging, 0, 100); // パーセント
v5 = analogRead(analogPin); // DAC出力確認
v6 = map(v5, 0, 1023, 0, 5000); // mV
printoled();
serial();
}
void printoled() {
display.clearDisplay();
// アラーム判定:閾値超過で画面反転 + リレーON(LOW)
if (v8 > alarmHeight) {
display.invertDisplay(true);
digitalWrite(relayPin, LOW);
} else {
display.invertDisplay(false);
digitalWrite(relayPin, HIGH);
}
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("SUMP LEVEL");
display.setTextSize(4);
display.print(v8);
display.setTextSize(2);
display.println(" inches");
display.display();
delay(500);
}
void serial() {
Serial.print(" PS analog input: "); Serial.print(v1);
Serial.print(" Height: "); Serial.print(v3); Serial.print(" mm ");
Serial.print(v4); Serial.print(" %");
Serial.print(" Converted voltage: "); Serial.print(v6); Serial.println(" mV");
}
回路図・基板データ
EAGLE 6.5.0で設計。sump%20level.sch として提供。
設置上の注意
- 銅管の先端が集水槽の底より少し上になるよう配置(泥詰まり防止)
- チューブに水が入らないよう、本体をセンサーより高い位置に設置
- オフセット(
offSet)とスパン(maxSet)は実機でキャリブレーションして設定 - 電源は5V安定化電源を推奨(ADC精度向上のため)
製造プロセス
- 血圧計:設計、製造、将来動向
- Raspberry Piで構築する空気質・気象ステーション:InfluxDB & Grafana活用
- MATRIX Voice搭載Raspberry PiへのGoogle Assistantインストール:ステップバイステップガイド
- Weather Monitor:Raspberry Pi自作気象ステーション+Dropboxアップロード
- リモート心拍数監視システム:AWS IoTアラート付き
- Windows IoT Core搭載RoverをRaspberry Pi 2で構築 - 初心者から上級者まで
- GoPiGo v2をWindows 10 IoT Coreで拡張 - Raspberry Pi 3対応
- JW Machine:精密CNC受託製造サービス
- 精密な旋盤レベリング:プロフェッショナルガイド
- C# 変数のスコープを理解する:クラス、メソッド、ブロックレベル
- ゲートレベルモデリング:ハードウェア回路図からVerilogコードへ