DIY монитор уровня воды в коллекторе на Arduino Nano, MPXV5010DP и OLED
Компоненты и материалы
| Arduino Nano R3 | ×1 |
| Датчик давления Freescale MPXV5010DP | ×1 |
| OLED-дисплей 0.96" | ×1 |
| DAC MCP4725 | ×1 |
| Реле | ×1 |
| Конденсаторы 1 мкФ, 0.01 мкФ, 470 пФ (SMD) | ×1 |
| Пластиковый короб 110×85 мм | ×1 |
| Трубка Tygon 3/32" | ×1 |
О проекте
Монитор уровня для входа Ecobee RSM-01 или автономной работы. Давление от датчика MPXV5010DP (0–5 В на 0–10 кПа ≈ 1020 мм вод. ст.) передаётся через трубку к медной трубе в коллекторе. Это надежнее ультразвука и позволяет удалить электронику от воды.


Для локального индикатора использован двухцветный OLED. Добавлено реле для сухого контакта и DAC MCP4725 для усиленного 0–5 В выхода (защита датчика). Всё на I2C — легко адаптировать под другой Arduino.

Исходный код (C/C++)
#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;
int v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0, v8 = 0;
float v7 = 0;
int offSet = 40;
int maxSet = 1015;
int maxHeight = 1020;
int ranging = (maxHeight * 0.8) + offSet;
int alarmHeight = 12; // дюймы
int analogPin2 = 1;
float divisor = 25.4;
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);
}
void loop() {
v1 = analogRead(analogPin2);
delay(1000);
if (v1 < offSet) v1 = offSet;
v2 = map(v1, offSet, maxSet, 0, 4095);
dac.setVoltage(v2, false);
v3 = (v1 - offSet) / 0.8;
v7 = v3 / divisor;
v8 = round(v7);
v4 = map(v1, offSet, ranging, 0, 100);
v5 = analogRead(analogPin);
v6 = map(v5, 0, 1023, 0, 5000);
printoled();
serial();
}
void printoled() {
display.clearDisplay();
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
Производственный процесс
- Область видимости переменных в C#: класс, метод и блок
- Сборка станции качества воздуха и погоды на Raspberry Pi с InfluxDB и Grafana
- Установка Google Assistant на MATRIX Voice Raspberry Pi — пошаговое руководство
- Weather Monitor — DIY метеостанция на Raspberry Pi с загрузкой в Dropbox
- Система удалённого мониторинга сердечного ритма с алертами AWS IoT
- Построение ровера на Windows IoT Core с Raspberry Pi 2 — Руководство от новичка к профи
- Расширение GoPiGo v2 на Windows 10 IoT Core для Raspberry Pi 3
- Гейтовое моделирование в Verilog: от схем к коду
- JW Machine: услуги точного контрактного производства по чертежам ЧПУ
- Точная выверка токарного станка: профессиональное руководство