Индикатор уровня воды на Arduino Uno


В этом проекте на основе Arduino мы рассмотрим индикатор автоматического определения уровня воды. Уровень воды мы будем определять с помощью ультразвукового датчика. Основные принципы измерения расстояния с помощью ультразвукового датчика основаны на эффекте эхо. Когда звуковые волны излучаются в окружающую среду они после встречи с каким-нибудь препятствием возвращаются обратно к источнику в виде эхо. То есть для измерения расстояния нам необходимо лишь определить время за которое звуковая волна достигает препятствия и возвращается обратно к источнику. Потом после произведения некоторых вычислений мы сможем получить значение расстояния. Этот принцип определения расстояния и будет использован в нашем проекте, в котором водяной электронасос будет автоматически включаться когда уровень воды в цистерне станет низким.

Внешний вид индикатора уровня воды на Arduino Uno

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Модуль ультразвукового датчика (купить на AliExpress).
  3. ЖК дисплей 16х2 (купить на AliExpress).
  4. Драйвер двигателей ULN2003 (купить на AliExpress).
  5. Реле на 6 В.
  6. Батарейка на 9 Вольт или адаптер на 12 Вольт.
  7. Медный провод.
  8. Соединительные провода.

Модуль ультразвукового датчика

Его внешний вид представлен на следующем рисунке.

Внешний вид ультразвукового датчика HC-SR04

Ультразвуковой датчик HC-SR04 используется для измерения расстояний в диапазоне 2-400 см с точностью 3 мм. Модуль датчика состоит из ультразвукового передатчика, приемника и схемы управления. Принцип действия датчика показан на следующих диаграммах. Более подробно о работе данного датчика можно прочитать в статье про измерение расстояния с помощью Arduino.

Временные диаграммы работы ультразвукового датчика HC-SR04

Для того чтобы датчик начал работу на него необходимо подать импульс длительностью 10 мкс. После этого датчик автоматически излучает 8 импульсов с частотой 40 кГц и затем проверяет вернулись ли они обратно (эхо). Если отраженные импульсы вернулись, то они принимаются приемником. После этого расстояние до препятствия можно рассчитать по формуле:

Distance= (time x speed)/2.

Произведение времени и скорости в этой формуле делится на 2 потому что общее время распространения звуковой волны в нашем случае состоит из времени когда она распространялась до препятствия и возвращалась обратно.

Работа индикатора автоматического определения уровня воды

Как уже указывалось, принцип работы рассматриваемого нами индикатора уровня воды достаточно прост. Модуль ультразвукового датчика передает звуковые волны в цистерну с водой и затем принимает отраженные волны в виде эхо. Вначале на модуль подается импульс длительностью 10 мкс чтобы запустить его в работу. Затем после приема отраженного сигнала (эхо) плата Arduino считывает время, прошедшее между передачей звукового сигнала и его приемом. Поскольку скорость звука (speed of sound) приблизительно равна 340 м/с, то мы можем рассчитать расстояние по формуле:

Distance= (travel time/2) * speed of sound

С использованием этого метода мы можем определить расстояние от датчика до поверхности воды. После этого нам необходимо рассчитать уровень воды. Для этого нам нужно знать общую длину (высоту) водяной цистерны. Зная эту длину мы можем рассчитать уровень воды как разницу между длиной цистерны и расстоянием, измеренным ультразвуковым датчиком. После этого мы можем конвертировать этот уровень воды в проценты и отобразить это значение на ЖК дисплее. Обобщенная структурная схема работы устройства показана на следующем рисунке.

Структурная схема индикатора уровня воды на Arduino Uno

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема индикатора уровня воды на Arduino UnoКак показано на приведенной схеме контакты “trigger” и “echo” модуля ультразвукового датчика напрямую подсоединены к контактам 10 и 11 платы Arduino. ЖК дисплей подключен к Arduino в 4-битном режиме. Его управляющие контакты RS, RW и En напрямую подключены к контактам Arduino 7, GND и 6. Контакты данных ЖК дисплея D4-D7 подключены к контактам 5, 4, 3 и 2 Arduino. Буззер (звонок) подключен к контакту 12. Реле на 6 Вольт подключено к контакту 8 Arduino через микросхему ULN2003. Реле используется для включения и выключения водяного электронасоса. Регулятор напряжения 7806 (7805) используется для обеспечения реле и части схемы напряжением питания 5 В.

Модуль ультразвукового датчика устанавливается на верх водяной цистерны. Датчик будет измерять расстояние до поверхности воды и затем на ЖК дисплее будет высвечиваться сообщение “Water Space in Tank is:”. Фактически в этом случае мы будем показывать пустой объем цистерны (не занятый водой) вместо уровня воды. Но благодаря этому мы сможем применять наше устройство в любой водяной цистерне. В нашем случае когда пустой уровень воды достигает дистанции приблизительно 30 см плата Arduino с помощью реле осуществляет включение водяного электронасоса. При этом на ЖК дисплее будут показываться сообщения “LOW Water Level” (низкий уровень воды), “Motor turned ON” (двигатель включен).

Исходный код программы

В коде программы автоматического индикатора уровня воды нам первым делом необходимо инициализировать все контакты Arduino, которые мы будем использовать для подключения внешних устройств: реле, ЖК дисплей, буззер (звонок) и т.д.

#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12

Затем мы инициализируем все устройства, задействованные в проекте.

lcd.begin(16,2);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
pinMode(motor, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.print(" Water Level ");
lcd.setCursor(0,1);
lcd.print(" Indicator ");
delay(2000);

После этого инициализируем модуль ультразвукового датчика и считаем время между передачей и приемом ультразвуковой волны с помощью функции pulseIn(pin). Затем произведем вычисления и покажем результат на экране ЖК дисплея.

digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
delayMicroseconds(2);
time=pulseIn(echo,HIGH);
distance=time*340/20000;
lcd.clear();
lcd.print("Water Space In ");
lcd.setCursor(0,1);
lcd.print("Tank is: ");
lcd.print(distance);
lcd.print("Cm");

Потом запишем условия, позволяющие проверить полна или пуста цистерна с водой и в зависимости от результатов проверки этих условий произведем соответствующие действия.

if(distance<12 && temp==0)
{
digitalWrite(motor, LOW);
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(2000);
digitalWrite(buzzer, LOW);
delay(3000);
temp=1;
}

else if(distance<12 && temp==1)
{
digitalWrite(motor, LOW);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(5000);
}

Далее представлен полный текст программы.

(2 голосов, оценка: 4,50 из 5)
Загрузка...
7 053 просмотров

Комментарии

Индикатор уровня воды на Arduino Uno — 4 комментария

  1. Уважаемый автор, не могли бы вы помочь, с модификацией скетча в обратную сторону. Не на наполнение, а на осушение емкость. Чтобы устройство показывало уровень воды от дна бочки(степень заполнения и на определенном уровне включался насос на откачку. Допустим если указать высоту и диаметр бочки.

    • Ну диаметр бочки указывать не нужно, достаточно указать высоту. Логика работы насоса в этом случае вам нужна такая же как в представленном скетче: команда digitalWrite(motor, HIGH) будет включать его, а команда digitalWrite(motor, LOW) выключать? В этом плане ничего не меняется?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *