Примерно 71% поверхности земли покрыто водой, но только 2,5% этой воды пригодно для питья. При этом запасы питьевой воды на нашей планете сокращаются с каждым годом. Эксперты прогнозируют, что в ближайшем будущем человечество может столкнуться с нехваткой питьевой воды. Чтобы уменьшить потребление воды вместо обычных механических кранов можно использовать "умные" краны, которые будут открываться только когда необходимо. Поэтому в данной статье мы рассмотрим создание на основе платы Arduino и соленоидного клапана автоматического дозатора воды (Automatic Water Dispenser), который будет автоматически включать подачу воды когда рядом с ним (под краном) будет помещаться стакан.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Соленоидный клапан (Solenoid Valve) (купить на AliExpress).
- Ультразвуковой датчик HCSR04 (купить на AliExpress).
- IRF540 MOSFET (купить на AliExpress).
- Резисторы 1 кОм и 10 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Принцип работы автоматического дозатора воды
Принцип работы проектируемого нами дозатора воды достаточно прост – мы будем использовать ультразвуковой датчик HCSR04 для определения того помещен ли перед дозатором какой-нибудь объект (например, стакан). Для подачи воды будет использоваться соленоидный клапан, который будет открывать подачу воды когда на него подано питание и закрывать подачу воды когда питание на него не подано. То есть программа для Arduino будет постоянно проверять не помещен ли какой-нибудь объект под кран, если помещен, то будет подаваться питание на соленоид. А как только объект после этого будет убираться из-под крана подача питания на соленоид будет автоматически прекращаться и, соответственно, поток воды будет перекрываться.
Более подробно об использовании ультразвукового датчика HCSR04 вместе с платой Arduino можно прочитать в этой статье.
Работа схемы
Схема автоматического дозатора воды на основе платы Arduino Uno представлена на следующем рисунке.
Соленоидный клапан, используемый в нашем проекте, питается от 12V и имеет максимальный потребляемый ток 1.2A, а в обычном режиме он потребляет ток примерно 700mA. То есть чтобы держать клапан в открытом состоянии необходима сила тока примерно 700mA. Как мы знаем, плата Arduino не может на своих выходах обеспечить такой ток, поэтому нам необходима отдельная цепь для включения и выключения соленоидного клапана.
Для этой цели мы использовали в нашем проекте MOSFET транзистор IRF540N с N-каналом. Он имеет три вывода: затвор, исток и сток. Как видно из представленной схемы, положительный контакт соленоида запитывается от контакта Vin платы Arduino. Поскольку для питания платы Arduino мы используем адаптер на 12V, поэтому на ее контакте 12V мы можем использовать 12V для питания соленоида. Отрицательный контакт соленоида подключен к земле через исток и сток MOSFET транзистора. То есть питание на соленоид будет подаваться только тогда, когда MOSFET транзистор находится в открытом состоянии.
Соответственно, затвор MOSFET транзистора используется для его переключения между открытым и закрытым состоянием. Когда на затвор будет подаваться напряжение высокого уровня (логическая 1) транзистор будет открываться, а когда логический 0 – транзистор будет закрываться. Затвор транзистора подключен к контакту платы 12 Arduino через резистор на 1 кОм, который служит для ограничения протекающего тока, а к земле схемы затвор транзистора подключен через резистор 1 кОм.
Ультразвуковой датчик запитывается от контакта 3,3В платы Arduino. Его контакты Echo и Trigger подключены к контактам 8 и 9 платы Arduino соответственно.
Как видите, схема достаточно проста, поэтому ее легко можно собрать на макетной плате. Конструкция проекта после ее сборки на макетной плате будет иметь примерно следующий вид:
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим ее основные фрагменты.
Основная функция программы будет заключаться в измерении расстояния с помощью ультразвукового датчика HCSR-04. Когда расстояние до объекта будет меньше 10 см мы будем открывать MOSFET транзистор, в противном случае мы будем закрывать его. Также мы будем включать встроенный светодиод на плате Arduino, подключенный к ее контакту 13 чтобы было наглядно видно открыт или закрыт MOSFET транзистор.
Вначале в программе мы должны инициализировать используемые контакты.
1 2 3 4 |
#define trigger 9 #define echo 8 #define LED 13 #define MOSFET 12 |
Внутри функции setup мы зададим режим работы контактов – на ввод или вывод данных.
1 2 3 4 |
pinMode(trigger,OUTPUT); pinMode(echo,INPUT); pinMode(LED,OUTPUT); pinMode(MOSFET,OUTPUT); |
Внутри функции loop мы будем вызывать функцию measure_distance(), которая использует ультразвуковой датчик для определения расстояния до объекта и на основе этого обновляет значение переменной ‘distance’. Для измерения расстояний с помощью ультразвукового датчика нам необходимо подать на его контакт trigger сигнал низкого уровня на 2 микросекунды и затем сигнал высокого уровня на 10 микросекунд, а затем снова сигнал низкого уровня на 2 микросекунды. Это приведет к тому, что датчик излучит в окружающее пространство ультразвуковую волну, которая отразится от препятствия. После приема отраженной ультразвуковой волны датчик сформирует соответствующий сигнал на своем контакте echo – по времени появления этого сигнала можно затем рассчитать расстояние до препятствия. Более подробно все эти процессы описаны в статье про измерение расстояний с помощью ультразвукового датчика и Arduino. Фрагмент программы для определения расстояния до препятствия будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 |
digitalWrite(trigger,LOW); delayMicroseconds(2); digitalWrite(trigger,HIGH); delayMicroseconds(10); digitalWrite(trigger,LOW); delayMicroseconds(2); time=pulseIn(echo,HIGH); distance=time*340/20000; |
После определения расстояния до объекта нам необходимо сравнить его с заранее определенной границей (10 см). Если измеренное расстояние меньше 10 см мы будем открывать MOSFET транзистор и включать светодиод, если оно больше 10 см – то мы будем закрывать MOSFET транзистор и выключать светодиод.
1 2 3 4 5 6 7 8 |
if(distance<10) { digitalWrite(LED,HIGH);digitalWrite(MOSFET,HIGH); } else { digitalWrite(LED,LOW);digitalWrite(MOSFET,LOW); } |
Тестирование работы автоматического дозатора воды
Сделайте все соединения, показанные на выше приведенной схеме, и загрузите программу в плату Arduino. Закрепите провода, идущие к ультразвуковому датчику и соленоидному клапану чтобы они не мешали наливу воды в стакан. Убедитесь в том, что встроенный в плату Arduino светодиод не горит – это будет свидетельствовать о том, что соленоидный клапан закрыт. Вид собранной нами конструкции для тестирования работы проекта показан на следующем рисунке.
Когда мы будем подносить сигнал под кран ультразвуковой датчик будет определять это, соответственно плата Arduino будет давать сигнал на открытие клапана и вода будет поступать в стакан. Как только мы будем убирать стакан плата Arduino будет закрывать клапан и подача воды будет прекращаться. Более подробно все эти процессы показаны на видео, приведенном в конце статьи.
Предупреждение: различные соленоидные клапаны имеют различное рабочее напряжение и потребляемый ток, поэтому для реализации данного проекта убедитесь в том, что вы выбрали соленоид работающий от 12V и с потребляемым током не более 1.5A.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#define trigger 9 #define echo 8 #define LED 13 #define MOSFET 12 float time=0,distance=0; void setup() { Serial.begin(9600); pinMode(trigger,OUTPUT); pinMode(echo,INPUT); pinMode(LED,OUTPUT); pinMode(MOSFET,OUTPUT); delay(2000); } void loop() { measure_distance(); if(distance<10) { digitalWrite(LED,HIGH);digitalWrite(MOSFET,HIGH); } else { digitalWrite(LED,LOW);digitalWrite(MOSFET,LOW); } delay(500); } void measure_distance() { digitalWrite(trigger,LOW); delayMicroseconds(2); digitalWrite(trigger,HIGH); delayMicroseconds(10); digitalWrite(trigger,LOW); delayMicroseconds(2); time=pulseIn(echo,HIGH); distance=time*340/20000; } |