Мониторинг уровня воды с Arduino, LCD 16×2, RGB-светодиодом и зуммером (обучение работе с Proteus)

В этой статье показан проект мониторинга уровня воды на Arduino с использованием аналогового датчика воды, ЖК-дисплея 16×2, RGB-светодиода и зуммера.
Проект разработан специально для обучения работе с симулятором Proteus и демонстрирует обработку аналоговых данных, визуальную индикацию состояния и звуковое оповещение при критическом уровне воды.

Мониторинг уровня воды с Arduino

Скетч реализует систему контроля, которая в реальном времени отображает процент заполнения водой, текстовый статус состояния и цветовую индикацию. При переполнении активируется звуковая тревога. Проект хорошо подходит для учебных стендов, автоматизации резервуаров и начального изучения аналоговых датчиков.

Назначение проекта

Цель проекта — наглядно показать принципы построения системы контроля уровня жидкости:

  • считывание аналогового сигнала с датчика уровня воды;
  • преобразование значения АЦП в проценты;
  • отображение информации на 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 — мигание светодиода