Мониторинг уровня воды с Arduino, LCD 16×2, RGB-светодиодом и зуммером (обучение работе с Proteus)
В этой статье показан проект мониторинга уровня воды на Arduino с использованием аналогового датчика воды, ЖК-дисплея 16×2, RGB-светодиода и зуммера.
Проект разработан специально для обучения работе с симулятором Proteus и демонстрирует обработку аналоговых данных, визуальную индикацию состояния и звуковое оповещение при критическом уровне воды.
Скетч реализует систему контроля, которая в реальном времени отображает процент заполнения водой, текстовый статус состояния и цветовую индикацию. При переполнении активируется звуковая тревога. Проект хорошо подходит для учебных стендов, автоматизации резервуаров и начального изучения аналоговых датчиков.
Назначение проекта
Цель проекта — наглядно показать принципы построения системы контроля уровня жидкости:
- считывание аналогового сигнала с датчика уровня воды;
- преобразование значения АЦП в проценты;
- отображение информации на LCD 16×2;
- цветовая индикация состояния с помощью RGB-светодиода;
- звуковая сигнализация при переполнении;
- использование гистерезиса для устойчивой работы сигнализации.
Подобные системы применяются в баках, ёмкостях, насосных станциях, умных теплицах и учебных лабораториях.
Используемые компоненты
- Arduino UNO;
- Датчик уровня воды (модель Water Sensor в Proteus);
- ЖК-дисплей 16×2 (библиотека LiquidCrystal);
- RGB-светодиод;
- Зуммер (Buzzer);
- Резисторы;
- Соединительные провода;
- Proteus 8 или 9.
Принцип работы программы
Датчик уровня воды подключён к аналоговому входу A0. Arduino считывает значение АЦП в диапазоне от 0 до 1023 и преобразует его в проценты с помощью функции map().
Полученное значение используется для определения текущего состояния системы. В зависимости от уровня воды меняется цвет RGB-светодиода и текстовый статус:
- 0% — EMPTY (белый цвет);
- 1–30% — VERY LOW (зелёный);
- 31–60% — MEDIUM (жёлтый);
- 61–89% — HIGH (фиолетовый);
- 90–100% — OVERFLOW (красный).
При достижении уровня 95% включается зуммер. Для предотвращения дребезга используется гистерезис: зуммер отключается только после снижения уровня ниже 90%.
Организация вывода на LCD 16×2
ЖК-дисплей используется для наглядного отображения информации:
- первая строка — процент заполнения водой;
- вторая строка — текстовый статус состояния;
Перед выводом новых данных строки дополняются пробелами, что предотвращает появление визуальных артефактов при изменении длины текста.
Arduino-скетч
#include <LiquidCrystal.h>
// LCD pins
const int RS = 13;
const int E = 12;
const int D4 = 11;
const int D5 = 10;
const int D6 = 9;
const int D7 = 8;
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
// Pins
const int BUZZ_PIN = 3;
const int WS_PIN = A0;
const int RGB_R = A5;
const int RGB_G = A4;
const int RGB_B = A3;
// Alarm state
bool alarmActive = false;
void setup() {
pinMode(BUZZ_PIN, OUTPUT);
pinMode(WS_PIN, INPUT);
pinMode(RGB_R, OUTPUT);
pinMode(RGB_G, OUTPUT);
pinMode(RGB_B, OUTPUT);
lcd.begin(20, 4);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Water Level Monitor ");
lcd.setCursor(0,1);
lcd.print(" System Initializing ");
delay(1500);
lcd.clear();
}
void loop() {
int raw = analogRead(WS_PIN);
int waterPer = map(raw, 0, 1023, 0, 100);
// Line 1
lcd.setCursor(0,0);
lcd.print("Water level: ");
lcd.print(waterPer);
lcd.print("% ");
// Status logic
if (waterPer == 0) {
setRGB(255,255,255);
printStatus("Status: EMPTY ");
}
else if (waterPer <= 30) {
setRGB(0,255,0);
printStatus("Status: VERY LOW ");
}
else if (waterPer <= 60) {
setRGB(255,255,0);
printStatus("Status: MEDIUM ");
}
else if (waterPer < 90) {
setRGB(170,0,255);
printStatus("Status: HIGH ");
}
else {
setRGB(255,0,0);
printStatus("Status: OVERFLOW! ");
}
// Buzzer logic with hysteresis
if (waterPer >= 95 && !alarmActive) {
digitalWrite(BUZZ_PIN, HIGH);
alarmActive = true;
}
else if (waterPer < 90 && alarmActive) {
digitalWrite(BUZZ_PIN, LOW);
alarmActive = false;
}
delay(500);
}
void setRGB(int r, int g, int b) {
analogWrite(RGB_R, r);
analogWrite(RGB_G, g);
analogWrite(RGB_B, b);
}
void printStatus(const char* text) {
lcd.setCursor(0,1);
lcd.print(text);
}
Работа проекта в Proteus
В Proteus датчик уровня воды формирует аналоговый сигнал. Изменяя уровень, можно наблюдать обновление процентов, смену цветов RGB-светодиода и срабатывание зуммера при переполнении. Проект полностью работает в симуляции без физического Arduino.
Установка библиотеки датчика воды для Proteus
- скопируйте файл WaterSensorTEP.LIB в каталог:
...\Proteus 8 Professional\DATA\LIBRARY\ - скопируйте файл WaterSensorTEP.IDX в каталог:
...\Proteus 8 Professional\DATA\Library Indexing\
В свойствах датчика уровня воды укажите путь к файлу WaterSensorTEP.HEX в поле Program File.
Запуск проекта в Proteus
- распакуйте архив с проектом;
- откройте файл .pdsprj;
- проверьте путь к файлу .hex в свойствах Arduino;
- проверьте путь к WaterSensorTEP.HEX в свойствах датчика;
- нажмите Run Simulation;
- изменяйте уровень воды и наблюдайте реакцию системы.
Если что-то не работает
Если возникают проблемы с запуском проекта или непонятен принцип работы, рекомендуется пройти базовый урок по Proteus.
Подробно разобран первый проект в Proteus:
Первый проект в Proteus — мигание светодиода