Контроллер уровня воды на 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

5 комментариев

avatar
Отличный и практичный проект.Хочу приступить к изготовлению.Но, тк я новичок в Ардуино (железо без проблем соберу, а в скетчах=0) просьба подробнее рассказать про калибровку (смущает данное описание)):
«Эти переменные далее сравниваются с фиксированными значениями (здесь 100) для идентификации текущего состояния. Фактически, значение 100 соответствует напряжению 0.48 вольт и если напряжение на текущем датчике выше данной величины, то это считается как непрерывная цепь. Это означает, что вода контактирует с датчиком. Набор фиксированных значений (по сравнению с переменой ”v”) должен быть отрегулирован, поскольку удельное электрическое сопротивление воды изменяется от слоя воды к слою и расстояние между датчиками будет различным для разных резервуаров.»
avatar
Xenical Alli Capoten Vardenafil Generic Vs Brand where to buy cialis online safely Viagra Donde Lo Consigo Gris Peg Price Priligy Forum Al Femminile Amoxicillin And Alchol cialis for sale Legally Bentyl Ups Drugs Generique Cialis Generique Acheter Cialis En Belgique Acheter Amoxicillin Pilule Nist Prescrire cialis 5mg Propecia En Andalucia Propecia Desventajas Can You Take Expired Amoxicillin buy cialis Online Pharma 24h Cialis Paris Amoxicillin Doses For How Long Online Pharmacies In India cialis vs viagra Cephalexin Fluoride Herbal Viagra Kaufen cialis for sale Cialis With Priligy Pills Buy Generic Plavix Online
avatar
Cialis Precio Farmacia Del Ahorro sildenafil and dapoxetine in india Viagra Without Prescription In Canada Buy Augmentin Amoxicillin 200 Dosage Para Comprar Viagra Hace Falta Receta viagra Inacid Retard Viagra Levitra Cialis L Impuissance Kamagra Now viagra How Is Amoxil Used
avatar
Clomid Mode D'Emploi viagra Viagraformen
avatar
5mg Cialis From India Usa Viagra Brand Ship 2 3 Days
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.