Про умные дома вы, наверное, слышали. Многие идеи в этом направлении весьма футуристичны, но это не должно останавливать.
Некоторые казались фантастикой всего 20 — 25 лет назад, а сейчас применяются повсеместно. В ближайшее время все дома сильно «поумнеют» или хотя бы начнут «умнеть». Направление это не только перспективное, но и интересное, так что не стоит оставаться в стороне.
Вообще, умный дом — это очень сложная система датчиков, механических и электронных компонентов, управляемая по заложенной программе. Эта система следит за расходом (и утечкой) воды, газа, электричества. Управляет освещением. Включает противопожарные элементы. Обеспечивает удаленное управление разными устройствами по телефону или СМС. Включает элементы защиты от краж и несанкционированного доступа. Содержит устройства бесперебойного питания жизненно важных для всей системы блоков.
Основная задача таких систем — облегчить жизнь людям, переложив часть забот на автоматику. По этому принципу мы и будем работать, поручив часть домашней работы микроконтроллеру. Начнем, как всегда, с простого.
Автомат полива растений
Существует множество поливальных устройств, от примитивных, вроде марли, одним концом закопанной в горшок с растением, а другим погруженной в емкость с водой, до высокотехнологичных систем полива с электронным управлением. У первых качество и КПД полива невысокое, у вторых высока цена, а работают они по своему алгоритму, который менять нельзя.
Мы будем разрабатывать устройство универсальное, с возможностью функционального расширения, но при этом недорогое и эффективное.
Алгоритм работы автомата полива растений простой: высохла земля в горшке — поливаем, полили — ждем, пока высохнет. Вроде все просто на первый взгляд. Составляем список необходимых компонентов: микроконтроллерная плата, насос, силовой ключ управления двигателем насоса, датчик влажности почвы, емкость с водой (на самом деле хорошо бы подключиться к водопроводу, но лучше не будем 🙂 Чтобы система была полностью автономной, необходимо ее оснастить устройством оповещения о расходе воды, например, зеленый светодиод — воды достаточно, красный — воды осталось мало, надо долить. Значит, нужен еще датчик уровня воды.
Насос для автомата полива растений
Из вышеперечисленного все, кроме насоса, изготовим самостоятельно. Насос подойдет любой маломощный. Можно поискать в старых и сломанных струйных принтерах или купить в автозапчастях насос для стеклоомывателя, самый простой я нашел за 90 рублей.
Важно: прежде чем подключать насос к готовому устройству, проверьте его в работе. Автомобильный насос может выдать фонтан в несколько метров; дома такое «поливание» могут не понять и запретить на корню. Подберите опытным путем оптимальное напряжение. Автонасос рассчитан на питание от бортовой сети 12 В, на моем экземпляре достаточный напор появляется уже при напряжении 8…9 В. Насос от принтера напора в несколько метров не даст, но с ним другая проблема: в принтере он качал чернила, а они очень трудно отмываются, и такой насос аккуратнейшим образом необходимо будет промыть.
О датчиках
Датчик влажности почвы лучше всего сделать графитовым, металлический подвержен электролизу и коррозии, в связи с чем его свойства со временем ухудшаются. Хотя в нашей экспериментальной установке нормально работают датчики из гвоздей и медной проволоки.
Датчик из гвоздей — самая простая конструкция. Для его изготовления нужен кусок пластика или резины, два гвоздя, провода и кембрик (изолента).
Датчик уровня жидкости можно сделать так же, как и датчик влажности почвы, а можно придумать конструкцию поплавкового типа. Второй вариант предпочтительнее. На рисунке 3 вариант такого датчика, где 1 — емкость с водой для полива и отметкой минимума, 4 — трубка из любого материала и стержень 3, который свободно ходит в трубке. Трубку и стержень можно взять от старой шариковой ручки. Внизу на стержень крепится поплавок 2 (кусок пенопласта). В верхней, надводной, части конструкции на трубке размещаем на пластиковой пластине контакты 5, это и будут контакты датчика. Сверху на стержень крепим токопроводящую пластину 6. Ход стержня в трубке 1…2 см. К контактам 5 припаиваем провода для подключения к Arduino. Трубка 4 неподвижно крепится внутри емкости.
Принцип работы датчика следующий. Когда воды много, поплавок 2 выталкивает стержень 3 до упора вверх, при этом пластина 6 не касается контактов 5. Когда уровень воды опускается ниже отметки МИН, поплавок опускается вместе с уровнем воды и опускает стержень с пластиной б, которая, в свою очередь, касается контактов 5 и замыкает их между собой. Контроллеру остается только считывать состояние контактов 5. Если лень возиться, можно купить похожие в автозапчастях, они там продаются как датчики уровня охлаждающей жидкости, цена самых простых 100 — 150 рублей.
Управление доверим Arduino
Для нее это тривиальная задача. Датчики одним контактом подключаем к пину Arduino и через высокоомный резистор подтягиваем к «земле», другим контактом — к +5 В питания Arduino. Для выбора способа подключения насоса нам нужно знать ток, который он потребляет в режиме работы, причем обязательно при перекачивании воды; на холостом ходу ток может быть меньше. Если ток меньше 3,5 А, то можно для подключения насоса применить транзисторную сборку uln2003.
Каждый выход uln2003 может управлять нагрузкой 0,5 А. Я подключил параллельно все семь входов и выходов для увеличения тока нагрузки: 7×0,5=3,5 А. Если ток насоса больше 3,5 А, то можно поставить полевой транзистор, например irf630 (но к нему нужны дополнительные элементы). Этот транзистор выдерживает ток до 9 А. Если вашему насосу требуется больший ток, то меняйте насос, а то у нас получится не поливалка, а брандспойт 🙂
Для питания автомата полива растений можно применить аккумуляторы от радиоуправляемых игрушек или сетевой блок питания. Выбранный источник питания должен быть рассчитан на ток, необходимый для насосов. Я бы остановился на аккумуляторном питании, насосы включаются не часто и на короткое время, поэтому в блоке питания, включенном в сеть постоянно, нет необходимости. Кроме того, со временем можно добавить в программу контроль заряда аккумулятора и сигнализацию необходимости зарядки.
Блок-схема управляющего алгоритма представлена на рисунке ниже. После запуска устройства в непрерывном рабочем цикле опрашиваются датчики и, исходя из состояния каждого датчика, выполняются действия. Датчик уровня воды управляет светодиодами. Датчик влажности почвы управляет насосом.
Программа простая, но требует корректировки в каждом конкретном случае. Особенно нужно уделить внимание паузе между включением и выключением насоса: чем меньше цветочный горшок и чем больше производительность насоса, тем меньше должна быть пауза. Также от размеров горшка зависит и пауза после выключения насоса. После полива земля должна пропитаться, иначе, если влага до датчика не дойдет, то система включит полив еще раз. Оптимальный вариант — трубку подачи воды разместить рядом с датчиком, чтобы земля в районе датчика пропитывалась сразу. Здесь же отмечу: уровень влажности для включения полива можно регулировать самим датчиком, погружая его на разную глубину.
Код программы
// константы
const int dw = 12; // датчик уровня воды на 12 пин
const int dg = 11; // датчик влажности почвы на 11 пин
const int nasos = 2; // управление насосом на 2 пин
const int ledG = 3; // зеленый светодиод на 3 пин
const int ledR = 4; // красный светодиод на 4 пин
// переменные
int dwS = 0; // состояние датчика уровня воды
int dgS = 0; // состояние датчика уровня влажности почвы
//установки
void setup() {
// объявляем пины светодиодов и насоса как выходы:
pinMode(nasos, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledR, OUTPUT);
// объявляем пины датчиков и насоса как входы:
pinMode(dw, INPUT);
pinMode(dg, INPUT);
}
// рабочий цикл
void 1оор(){
// считываем состояния датчика уровня жидкости
dwS = digitalRead(dw);
// если воды много — включаем зеленый, иначе красный
if (dwS == LOW) {
digitalWrite(ledG, HIGH);
digitalWrite(ledR, LOW);
}
else {
digitalWrite(ledG, LOW);
digitalWrite(ledR, HIGH);
}
// считываем состояния датчика влажности почвы
dgS = digitalRead(dg);
// если почва сухая, включаем полив
if (dgS == LOW) {
digitalWrite(nasos, HIGH);
delay(2000);
digitalWrite(nasos, LOW);
delay(30000);
}
else {
digitalWrite(nasos, LOW);
}
}
Относительно кода хочу сказать следующее. Для его упрощения я поставил команды delay, на которые сам же ругался. Из-за delay в один момент наше устройство застывает на 30 секунд (а может, придется поставить и больше). Но в данном устройстве это не критично. Если в итоге устройство будет поливать 10 растений и произойдет совпадение, что все надо полить одновременно, думаю, 300 секунд, которые придется ждать последнему растению, не так уж важны.
А вот для источника питания такое решение сыграет положительную роль: оно не позволит устройству включить 10 насосов одновременно. Первый delay(2000) включает на 2 секунды насос, если у вас большое растение в большом горшке, то время надо увеличить, если насос очень производительный, то, наоборот, уменьшить. Второй delay(30000) дает почве 30 секунд пропитаться водой, об этом я писал ранее. Возможно, это время тоже нужно регулировать.
Конструктивно устройство состоит из двух частей — электронной и механической. Электронную часть и элементы питания желательно поместить в корпус, чтобы случайные брызги не вывели электронику из строя. Можно задействовать не всю Arduino, а микроконтроллер, кварц с конденсаторами и стабилизатор питания на 5 В. В этот же корпус помещаем микросхему uln2003, резисторы, выводим на лицевую панель светодиоды и устанавливаем разъем для подключения датчиков и насоса. Если насос мощный и uln греется, то в корпусе сверлим отверстия для вентиляции. Дополнительный индикатор включения устройства устанавливать не нужно, один из светодиодов уровня воды включен всегда, он и выполнит эту функцию.
Корпус для электронной части можно изготовить из любого материала или подобрать готовый. Для емкости можно применить пластиковую бутылку или стеклянную банку подходящего размера, а можно склеить из пластика. Крепим датчик уровня жидкости и устанавливаем насос. Если насос придется погружать на дно (а бывают и такие), то очень аккуратно изолируем все его токоведущие провода. От насоса до горшка с растением проводим трубку подходящего диаметра. Купить такую можно в магазине автозапчастей вместе с насосом или подобрать подходящую резиновую или силиконовую. На ободе горшка придумываем крепление для трубки таким образом, чтобы при подаче воды не было брызг. Датчик влажности устанавливаем в непосредственной близости к трубке. Чтобы стоящая рядом с растением стеклянная или пластиковая посудина не пугала окружающих своим видом, можно с помощью акриловых витражных красок придать ей авторский дизайнерский стиль.
Далее испытания. Не забывайте: от работы устройства зависит благополучие растения. Перед проведением практических испытаний проведите испытания стендовые, потестировав несколько дней устройство с горшком без растения. Земля в нем не должна быть залита или пересушена. В случае необходимости датчик влажности углубите побольше или, наоборот, приподнимите повыше. Регулируйте в программе продолжительность работы насоса. Он не должен каждые пять минут выдавать по капле, но и не должен раз в неделю заливать землю. По ходу эксперимента следите за температурой электронных компонентов.
Не допускайте перегрева!
Когда все отлажено, переходите к испытаниям практическим, взяв самое неприхотливое растение. Внимательно следите за состоянием растения, если что-то не так, останавливайте эксперимент до выяснения причин. Если все нормально, подключайте к Arduino еще один датчик и насос, дописывайте код и автоматизируйте полив еще одного растения. Без дополнительного расширения портов Arduino справится с десятком растений.
Приложение. Код без комментариев:
const int dw = 12;
const int dg = 11;
const int nasos = 2;
const int ledG = 3;
const int ledR = 4;
int dwS = 0;
int dgS = 0;
void setup() { pinMode(nasos, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledR, OUTPUT);
pinMode(dw, INPUT);
pinMode(dg, INPUT); }
void loop(){ dwS = digitalRead(dw);
if (dwS == LOW) { digitalWrite(ledG, HIGH);
digitalWrite(ledR, LOW); }
else { digitalWrite(ledG, LOW);
digitalWrite(ledR, HIGH); }
dgS = digitalRead(dg);
if (dgS == LOW) { digitalWrite(nasos, HIGH);
delay(2000);
digitalWrite(nasos, LOW);
delay(30000); }
else { digitalWrite(nasos, LOW); }}
Автор: К. Холостов