В этом простом проекте для Arduino при помощи шлангового насоса заданный объем воды ежедневно подается на комнатные растения (это удобно, когда вы, например, в отпуске).
- Домашняя поливальная установка
Таймер, который позволял бы задать, когда поливать растения, здесь не применяется. Вместо этого устройство измеряет интенсивность дневного освещения, и полив происходит, как только начинает темнеть.
Схема проекта
Принципиальная схема этого проекта приведена на рисунке ниже. Транзистор МРЅА14 используется Arduino для включения и выключения двигателя насоса. Диод DI обеспечивает защиту от отрицательных скачков напряжения.
В левой части схемы мы видим фоторезистор и постоянный резистор они образуют делитель напряжения для измерения интенсивности света на аналоговом контакте
А0 платы Arduino. Чем больше света попадает в фоторезистор, тем ниже его сопротивление, поэтому на контакте
А0 напряжение возрастает вплоть до 5 В.
Собрать такой проект очень просто. Вряд ли к выходным контактам двигателя вашего насоса будут заранее прикреплены провода, поэтому вся пайка, которую здесь придется выполнить, будет заключаться в припайке к двигателю насоса соответствующих монтажных проводов.
- Схема домашней поливальной установки
Комплектующие
В этом проекте для работы с Arduino вам понадобятся следующие комплектующие:
Arduino Uno
Q1 - Составной транзистор МРЅА14
R1, R3 - Резистор 1 кОм
R2 - Фоторезистор 1 кОм
D1 - Диод 1N4001
Шланговый насос 12 В
400-точечная беспаечная макетная плата
Перемычки "папа-папа" (только для Arduino)
Трубка для вставки в насос, 1 м
Источник питания 12 В 1 А
Большая емкость для воды
Монтажные провода, припаиваемые к двигателю насоса
Разновидность шлангового насоса, используемого в этом проекте, предназначена для применения в аквариуме, ее можно приобрести за очень небольшие деньги.
Трубка, которую я здесь использовал, досталась мне в комплекте с поливочным инвентарем, который я купил в хозяйственном магазине. Вместе с ней я обзавелся также небольшими пластиковыми соединительными втулками, при помощи кото- рых отрезки трубки соединяются между собой. Соединения трубок должны быть герметичными, иначе насос не станет работать.
Сборка проекта
Чтобы собрать этот проект, потребуется немного поработать с макетной платой, а также вручную надежно закрепить емкость для воды.
Шаг 1. Припаиваем провода к двигателю
Припаиваем монтажные провода к контактам двигателя насоса, если, конечно, их там еще нет. Провода должны быть достаточно длинными и доставать от насоса до макетной платы и Arduino. Вполне хватит полуметровых проводов.
Шаг 2. Собираем макетную плату
Устанавливаем компоненты проекта на макетной плате, как показано на рисунке. Убедитесь, что транзистор и диод установлены правильно.
- Компоновка макетной платы для сборки домашней поливальной установки
Шаг 3. Прикрепляем трубку к насосу
Нам понадобятся два отрезка трубки. Один должен погружаться в емкость с водой на всю ее глубину и доставать от посадочного отверстия для насоса, расположенного в верхней части емкости, до самого ее дна. Второй должен доставать от выходного отверстия насоса до того растения, которое вы собираетесь поливать. На рисунке крупным планом показаны насос и трубки.
Вход и выход насоса обычно никак не помечаются, но шланговые насосы могут качать жидкость в обоих направлениях. Поэтому, если вы заметите, что насос всасывает воду, тогда как должен ее нагнетать, то лучше перепаять монтажные провода на двигателе, чем переставлять трубки.
- Подсоединение трубок к насосу
Я решил, что удобно вставить насос в емкость с водой сверху, а двигатель приклеить на насос. Входная трубка тогда опускается прямо в емкость, а выходная торчит сбоку и направлена на растение. Чтобы вставить насос, мне пришлось немного подрезать горлышко бутыли для молока, которой я воспользовался.
Ha рисунке показана конструкция, которая получилась у меня, но вы вполне можете установить насос внизу, рядом с макетной платой. Правда, в таком случае вам понадобится более длинная трубка.
- Домашняя поливальная установка
Программа
Скетч с помощью которого я откалибровал датчик освещенности:
Код: Выделить всё
const int lightPin = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int lightReading = analogRead(lightPin);
Serial.println(lightReading);
delay(500);
}
Скетч Arduino для этого проекта:
Код: Выделить всё
const int motorPin = 9; // (1)
const int lightPin = A0;
const long onTime = 10 * 1000; // 60 seconds (2)
const int dayThreshold = 200; // (3)
const int nightThreshold = 70;
boolean isDay = true; // (4)
void setup() {
pinMode(motorPin, OUTPUT);
}
void loop() { // (5)
int lightReading = analogRead(lightPin);
if (isDay && lightReading < nightThreshold) { // it went dark (6)
pump();
isDay = false;
}
if (!isDay && lightReading > dayThreshold) { // (7)
isDay = true;
}
}
void pump() { // (8)
digitalWrite(motorPin, HIGH);
delay(onTime);
digitalWrite(motorPin, LOW);
}
Уточним некоторые моменты скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
1. Скетч начинается с определения констант для двух используемых контактов Arduino: контакта для управления двигателем и аналогового входа (
lightPin), на котором для измерения интенсивности света используется фоторезистор.
2. Константа onTime указывает, как долго насос должен каждую ночь оставаться включен. Когда вы тестируете проект, здесь можно задать краткий период, скажем, 10 секунд, чтобы не пришлось слишком долго ждать.
Самая интересная часть скетча - та, в которой мы определяем, что на улице стемнело. Поскольку плата Arduino не содержит встроенных часов, она не может определять время, если, конечно, не добавить к проекту RTC (часы реального времени). В этом проекте я собираюсь поливать растение раз в сутки, поэтому наступление сумерек - самый подходящий фактор, от которого срабатывал бы насос. После полива вы больше не собираетесь поливать растение до следующих сумерек, т. е., пока не закончится день.
3. Чтобы было проще различать ночь и день, определяем две константы
dayThreshold u
nightThreshold. Вероятно, эти значения потребуется откорректировать в зависимости от того, где стоит вазон с растением, и насколько чувствителен ваш фоторезистор. Принципиальная идея такова: если текущее значение освещенности выше
dayThreshold, то сейчас день, а если ниже
nightThreshold , то сейчас ночь. Может возникнуть вопрос: почему здесь две константы, а не всего одна? Дело в том, что в сумерках, когда только начинает темнеть, уровень освещенности может некоторое время колебаться возле порогового значения, и тогда аппарат сработает несколько раз.
4. Булева переменная
isDay содержит ответ на вопрос, день сейчас или нет. Если
isDay равно
true, то с точки зрения поливальной установки сейчас день.
5. Логика решения о том, наступило ли время для полива, заключена в функции
loop. Она принимает значение освещенности.
6. Если сейчас день, но значение освещенности оказалось ниже
nightThreshold, это означает, что только что стемнело - поэтому вызывается функция чтобы полить растение. После этого переменная
isDay получает значение
false, и это означает: наступила ночь, полив пока следует прекратить.
7. Второй оператор
іf в цикле
loop проверяет, ночь ли сейчас (
isDay), и не превышает ли уровень освещения значение
dayThreshold. Если оба условия соблюдены, то
isDay получает значение
true.
8. Наконец, функция
pump включает насос, выжидает период, указанный в
onTime, а затем выключает насос.
Загружаем и выполняем программу
Перед запуском основной части проекта нужно загрузить на Arduino тестовую программу - с ее помощью удобно подобрать подходящие значения для
dayThreshold и
nightThreshold. Так что, загрузите этот скетч на Arduino и откройте монитор последовательного интерфейса.
Должен появиться ряд значений, которые соответствуют текущему уровню освещенности, они будут выводиться на мониторе последовательного интерфейса каждые полсекунды. Пометьте, каково значение освещенности днем, когда очень пасмурно. Примерно половина этого значения должна соответствовать
dayThreshold - тогда наш прибор будет правильно работать и в самые хмурые дни.
Далее дождитесь, когда около вазона стемнеет, и вновь снимите показания. Можно. конечно, попытаться просто угадать либо прикрыть датчик освещения пальцем.
Удвойте полученное значение и задайте результат в качестве
nightThreshold. Обратите внимание:
nightThreshold должен быть существенно ниже, чем
dayThreshold. Возможно, при оценке двух этих значений потребуются какие-то компромиссы.
Теперь можно изменить значения
dayThreshold и
nightThreshold в реальном
скетче и загрузить его в Arduino.
Сымитировать наступление сумерек можно снова прикрыв фоторезистор пальцем - насос должен сработать и действовать в течение заданного периода.
Насос, с которым я работал, нагнетал около 90 мл/мин. Чтобы определить, сколько времени должен длиться полив, воспользуйтесь секундомером и мерным ковши ком. Так вы узнаете объемный расход вашего насоса и откорректируете значение
onTime, чтобы растение получало ровно столько воды, сколько нужно.