Контроллер уровня воды на Arduino

В данной статье описывается полнофункциональный контроллер уровня воды на базе Arduino. На дисплее схемы отображается уровень воды в резервуаре. При этом, если уровень воды падает ниже предварительно определенного уровня, тогда включается двигатель. Схема автоматически отключает двигатель, когда резервуар полностью заполнен. Уровень воды и другие важные данные отображаются на дисплее 16×2 LCD. Схема также позволяет проконтролировать уровень воды в отстойном резервуаре (первичный резервуар). Если уровень воды в отстойном резервуаре понижается, тогда двигатель не включится, что позволит защитить его от сухого запуска. Звуковой сигнал генерируется, когда уровень воды в отстойном резервуаре низкий или в случае неисправности датчиков.

Электрическая схема


Электрическая схема контроллера уровня воды на базе Arduino показана на рисунке выше. Для измерения уровня жидкости используется токопроводящий метод. Датчик в сборе состоит из четырех алюминиевых проводников, устанавливаемых на уровне 1/4, 1/2, 3/4 и метки полного уровня в резервуаре. Вторые (сухие) концы проводников подключены к аналоговым входам A1, A2, A3 и A4 микроконтроллера Arduino соответственно. Пятый проводник размещается в нижней части резервуара. Резисторы с R6 по R9 являются подтягивающими. Вторые выводы данных резисторов подключаются к источнику напряжения +5В DC. Когда вода контактирует с определенным датчиком, то устанавливается электрическое соединение между данным датчиком и источником напряжения питания датчика +5В, поскольку вода является проводником электричества. В результате этого ток протекает через датчик и далее преобразуется в пропорциональное напряжение на подтягивающем резисторе. Arduino считывает падение напряжения на каждом резисторе, определяя уровень воды в резервуаре. Аналогичный метод используется для измерения уровня воды в отстойном резервуаре.
Цифровой вывод 7 микроконтроллера Arduino управляет устройством звуковой сигнализации (пищалкой), а цифровой вывод 8 управляет двигателем. Транзистор Q1 управляет пищалкой, и резистор R5 ограничивает ток базы Q1. Транзистор Q2 управляет реле. Резистор R3 ограничивает ток базы Q2. D2 представляет собой обратный диод. Потенциометр R2 используется для регулировки контрастности ЖК-дисплея. Резистор R1 ограничивает ток светодиода фоновой подсветки. Резистор R4 ограничивает ток светодиода включения питания power ON LED. Полный программный код для контроллера уровня воды на базе Arduino представлен ниже.

Программный код
#include <LiquidCrystal.h>
int sump=A0;
int qut=A1;
int hlf=A2;
int thf=A3;
int ful=A4;
int motor=8;
int buz=7;
int s;
int q;
int h;
int t;
int f;
int i;     //motor status flag
int v=100; //comparison variable(needs some adjustment)
int b=0;   //buzzer flag
int m=0;   //motor flag
int c=0;   //sump flag

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{

pinMode(qut,INPUT);
pinMode(hlf,INPUT);
pinMode(qut,INPUT);
pinMode(ful,INPUT);
pinMode(sump,INPUT);
pinMode(motor,OUTPUT);
pinMode(buz,OUTPUT);
lcd.begin(16, 2);
digitalWrite(buz,LOW);
}

void loop()
{

i=digitalRead(motor);
s=analogRead(sump);
q=analogRead(qut);
h=analogRead(hlf);
t=analogRead(thf);
f=analogRead(ful);
lcd.clear();

if(f>v && t>v && h>v && q>v )
{
lcd.setCursor(0,0);
lcd.print(char(219));
lcd.print(char(219));
lcd.print(char(219));
lcd.print(char(219));
lcd.setCursor(5,0);
lcd.print("FULL");
m=0;
b=0;
}
else
{
if(f<v && t>v && h>v && q>v)
{
lcd.setCursor(0,0);
lcd.print(char(219));
lcd.print(char(219));
lcd.print(char(219));
lcd.print("_");
lcd.setCursor(5,0);
lcd.print("3/4th");
b=0;
}
else
{
if(f<v && t<v && h>v && q>v)
{
lcd.setCursor(0,0);
lcd.print(char(219));
lcd.print(char(219));
lcd.print("_");
lcd.print("_");
lcd.setCursor(5,0);
lcd.print("HALF");
m=1;
b=0;
}
else
if(f<v && t<v && h<v && q>v)
{
lcd.setCursor(0,0);
lcd.print(char(219));
lcd.print("_");
lcd.print("_");
lcd.print("_");
lcd.setCursor(5,0);
lcd.print("1/4th");
b=0;
}
else
{
if(f<v && t<v && h<v && q<v)
{
lcd.setCursor(0,0);
lcd.print("_");
lcd.print("_");
lcd.print("_");
lcd.print("_");
lcd.setCursor(5,0);
lcd.print("LOW");
b=0;
}
else

{
digitalWrite(motor,LOW);
lcd.setCursor(0,0);
lcd.print("ERROR!");
b=1;
}
}}}
if(i==HIGH)
{
lcd.setCursor(0,1);
lcd.print("Motor ON");
}
else
{
lcd.setCursor(0,1);
lcd.print("Motor OFF");
}

if(s>v && m==1)
{
digitalWrite(motor,HIGH);
}
if(s<v)
{
digitalWrite(motor,LOW);
lcd.setCursor(11,0);
lcd.print("Low");
lcd.setCursor(11,1);
lcd.print("Sump");
c=1;
}
if(s>v)
{
c=0;
}

if(m==0)
{
digitalWrite(motor,LOW);
}

if(b==1 || c==1)
{
digitalWrite(buz,HIGH);
delay(500);
digitalWrite(buz,LOW);
}
else
{
digitalWrite(buz,LOW);
}
delay(100);
lcd.clear();
}


Описание программы
Arduino считывает выходные показания датчика через аналоговый вход, используя функцию analogRead. Например, q=analogRead(qut); преобразует напряжение (в диапазоне от 0 до 5В) на одном из четырех уровней датчика в числовые значения (в диапазоне от 0 до 1023) и сохраняет их в переменную “q”. Таким образом, напряжение на каждом датчике сканируется с соответствующими переменными. Эти переменные далее сравниваются с фиксированными значениями (здесь 100) для идентификации текущего состояния. Фактически, значение 100 соответствует напряжению 0.48 вольт и если напряжение на текущем датчике выше данной величины, то это считается как непрерывная цепь. Это означает, что вода контактирует с датчиком. Набор фиксированных значений (по сравнению с переменой ”v”) должен быть отрегулирован, поскольку удельное электрическое сопротивление воды изменяется от слоя воды к слою и расстояние между датчиками будет различным для разных резервуаров.

Важные примечания
• Схема питается от источника внешнего напряжения 9В через силовой разъем на плате Arduino.
• Напряжение 5В, необходимое в различных точках схемы, можно снимать с выхода 5В на плате Arduino.
• Для изготовления датчиков используйте только качественные алюминиевые проводники. Не используйте медные проводники.

По материалам сайта circuitstoday.com

1 комментарий

avatar
Отличный и практичный проект.Хочу приступить к изготовлению.Но, тк я новичок в Ардуино (железо без проблем соберу, а в скетчах=0) просьба подробнее рассказать про калибровку (смущает данное описание)):
«Эти переменные далее сравниваются с фиксированными значениями (здесь 100) для идентификации текущего состояния. Фактически, значение 100 соответствует напряжению 0.48 вольт и если напряжение на текущем датчике выше данной величины, то это считается как непрерывная цепь. Это означает, что вода контактирует с датчиком. Набор фиксированных значений (по сравнению с переменой ”v”) должен быть отрегулирован, поскольку удельное электрическое сопротивление воды изменяется от слоя воды к слою и расстояние между датчиками будет различным для разных резервуаров.»
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.