company_banner

Raspberry Pi, Python и полив комнатных растений

Автор оригинала: Alan Constantino
  • Перевод
У меня не складываются отношения с комнатными растениями. Дело в том, что я забываю их поливать. Зная это, я начал размышлять о том, что кто-то, наверняка, уже нашёл способ автоматизации полива. Как оказалось, способов таких существует очень много. А именно, речь идёт о решениях, основанных на Arduino или на Raspberry Pi. В этом материале я хочу рассказать о том, как создал систему, основанную на Raspberry Pi и Python, предназначенную для автоматизации полива растений.



Компоненты и полезные ресурсы


Мне сразу хотелось бы отметить, что я вовсе не являюсь экспертом в электронике. Если меня попросят нарисовать электрическую схему, или подробно рассказать о том, как, работает какой-нибудь электронный компонент, я ничего толкового нарисовать или рассказать не смогу. На самом деле, я сделал этот проект, обладая лишь базовыми знаниями об электричестве и просто экспериментируя с компонентами. Прошу вас очень осторожно относиться к работе с электричеством. А, если вы чувствуете недостаток знаний в этой области, предлагаю хотя бы немного в этом разобраться.

Вот список компонентов, которые я использовал в своём проекте.


Я участвую в партнёрской программе Amazon, поэтому выше приведены соответствующие ссылки. Если вы, перейдя по ним, что-нибудь купите, я немного заработаю.

После того, как я раздобыл все необходимые мне компоненты, пришло время заняться некоторыми изысканиями. Ниже приведён список ресурсов, которые помогли мне правильно соединить электронные компоненты и понять основные моменты, касающиеся их функционирования:


Вот схема GPIO-портов Raspberry Pi.


Схема GPIO-портов Raspberry Pi

Подключение реле к Raspberry Pi


Я начал с подключения реле к Raspberry Pi. Вот как это выглядит.


Подключение реле к Raspberry Pi

Красный провод (Female-Female) идёт от пина платы реле JD_VCC к 5V-пину (контакт №2) Raspberry Pi. Оранжевый провод (Female-Female) ведёт от пина платы реле VCC к 3.3V-пину (контакт №1) Raspberry Pi.


Пины JD_VCC и VCC платы реле

С помощью этих проводов мы подаём питание на плату реле. Для того чтобы получить возможность управлять отдельными реле, нужно соединить плату реле и Raspberry Pi ещё двумя проводами, которые подключаются к пинам GND и IN1 платы реле.


Пины GND и IN1 платы реле

Чёрный провод (Female-Female) — это кабель заземления, который соединяет пин GND платы реле и контакт заземления на Raspberry Pi (я подключил его к контакту №34). Белый провод (Female-Female) ведёт от пина IN1 платы реле к контакту №12 Raspberry Pi. Именно этот белый провод позволяет нам программным способом управлять реле, включая и отключая отдельные реле, расположенные на плате.


Чёрный и белый провода, подключённые к Raspberry Pi

Если вы решите воспроизвести мой проект — вы можете организовать связь реле и Raspberry Pi, пользуясь любыми подходящими пинами. Но учитывайте, что если схема соединения компонентов вашего проекта будет отличаться от схемы соединения компонентов моего проекта — вам придётся внести соответствующие изменения в мой код.

Подключение блока питания к реле


После того, как я присоединил плату реле к Raspberry Pi, я подключил блок питания к одному из реле.

Не подключайте блок питания к розетке до тех пор, пока не завершите все операции по сбору компонентов системы. Помните о риске поражения электрическим током.


Подключение блока питания к одному из реле

Используемый мной блок питания на 12V поставляется с адаптером, к которому удобно подключать соединительные провода. Я подключил красный провод (Male-Male) к разъёму «+» адаптера, а коричневый кабель (Male-Male) — к разъёму «-» адаптера. Затем я подключил кабель с разъёмом «крокодил» (Female-Male) к коричневому проводу.


Адаптер, который поставляется с блоком питания

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


Подключение отдельного реле

Я подключил красный кабель от блока питания (положительный вывод) к центральному контакту реле. Затем я подключил оранжевый кабель (Male-Male) к левому разъёму реле и подключил к этому кабелю кабель с «крокодилом» (Female-Male).


Красный и оранжевый кабели


Блок питания и адаптер


Реле и Raspberry Pi

Подключение водяного насоса к реле


Теперь осталось лишь подключить разъёмы «крокодилы» к водяному насосу. Порядок их подключения определяет направление тока воды.

Так, мне нужно было, чтобы вода поступала бы в левый канал насоса и выходила бы из правого канала. Поэтому я подключил разъём «крокодил» чёрного провода к выводу насоса, около которого имеется красная точка, а другой «крокодил» — к другому выводу насоса. Если бы я подключил «крокодилы» в другом порядке — вода пошла бы в обратном направлении — из правого канала в левый.


Подключение водяного насоса к реле


Система полива в сборе: вода поступает в насос через левый канал, выходит из правого и идёт к растению

Код


Вот мы и добрались до того, в чём я по-настоящему хорош. Мы дошли до кода. Для того чтобы наладить программную работу с GPIO-портами Raspberry Pi, я использовал библиотеку gpiozero. Пользоваться ей легко, она скрывает от программиста массу низкоуровневых механизмов, с которыми обычно нужно разобраться тому, кто хочет работать с GPIO-пинами. Библиотека хорошо документирована.

Прежде чем заниматься написанием кода, к Raspberry Pi нужно подключить монитор, мышь и клавиатуру. Или нужно подключиться к Raspberry Pi по SSH.

После того, как вы войдёте в Raspberry Pi, перейдите к папке Desktop и создайте там папку run. В этой папке создайте папку classes. А в папке classes создайте файл Hardware.py. В нём должен быть следующий код:

from gpiozero import OutputDevice

class Relay(OutputDevice):
    def __init__(self, pin, active_high):
        super(Relay, self).__init__(pin, active_high)

В этом файле я всего лишь объявил новый класс Relay, который является наследником класса OutputDevice.

Далее, в папке classes я создал новый файл TimeKeeper.py:

import datetime

class TimeKeeper:
    def __init__(self, current_time):
        self.current_time = current_time
        self.time_last_watered = None
    
    def set_current_time(self, updated_time):
        self.current_time = updated_time

    def set_time_last_watered(self, updated_time):
        self.time_last_watered = updated_time

    @staticmethod
    def get_current_time():
        now = datetime.datetime.now()
        return now.strftime("%I:%M:%S %p")

Цель этого класса заключается в отслеживании текущего времени и того момента, когда в прошлый раз выполнялся полив.

Итак, файлы Hardware.py и TimeKeeper.py находятся в папке classes. Теперь я, за пределами этой папки, создаю файл water_plant.py:

from classes import Hardware
from classes import TimeKeeper as TK
import schedule
import smtplib
import time
import ssl

# WATERING_TIME must be in "00:00:00 PM" format
WATERING_TIME = '11:59:50 AM'
SECONDS_TO_WATER = 10
RELAY = Hardware.Relay(12, False)
EMAIL_MESSAGES = {
    'last_watered': {
        'subject': 'Raspberry Pi: Plant Watering Time',
        'message': 'Your plant was last watered at'
    },
    'check_water_level': {
        'subject': 'Raspberry Pi: Check Water Level',
        'message': 'Check your water level!',
    }
}

def send_email(time_last_watered, subject, message):
    port = 465
    smtp_server = "smtp.gmail.com"
    FROM = TO = "YOUR_EMAIL@gmail.com"
    password = "YOUR_PASSWORD"

    complete_message = ''
    if time_last_watered == False:
        complete_message = "Subject: {}\n\n{}".format(subject, message)
    else:
        complete_message = "Subject: {}\n\n{} {}".format(subject, message, time_last_watered)
    
    context = ssl.create_default_context()
    with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
        server.login(FROM, password)
        server.sendmail(FROM, TO, complete_message)

def send_last_watered_email(time_last_watered):
    message = EMAIL_MESSAGES['last_watered']['message']
    subject = EMAIL_MESSAGES['last_watered']['subject']
    send_email(time_last_watered, subject, message)

def send_check_water_level_email():
    message = EMAIL_MESSAGES['check_water_level']['message']
    subject = EMAIL_MESSAGES['check_water_level']['subject']
    send_email(False, subject, message)

def water_plant(relay, seconds):
    relay.on()
    print("Plant is being watered!")
    time.sleep(seconds)
    print("Watering is finished!")
    relay.off()

def main():
    time_keeper = TK.TimeKeeper(TK.TimeKeeper.get_current_time())
    if(time_keeper.current_time == WATERING_TIME):
        water_plant(RELAY, SECONDS_TO_WATER)
        time_keeper.set_time_last_watered(TK.TimeKeeper.get_current_time())
        print("\nPlant was last watered at {}".format(time_keeper.time_last_watered))
        # send_last_watered_email(time_keeper.time_last_watered)

# schedule.every().friday.at("12:00").do(send_check_water_level_email)

while True:
    # schedule.run_pending()
    time.sleep(1)
    main()

Тут можно поменять значения переменных WATERING_TIME и SECONDS_TO_WATER на те, которые кажутся вам подходящими. Первая переменная определяет то, в какое время нужно поливать растения. Вторая задаёт длительность полива.

Кроме того, я создал тут механизм рассылки уведомлений и напоминаний по электронной почте. Благодаря этому механизму владелец системы полива получает электронное письмо каждый раз, когда система включается и поливает растения. Кроме того, каждую пятницу он получает письмо с напоминанием о том, что ему нужно проверить запасы поливочной воды. В коде вызов соответствующих методов закомментирован, в результате программа может нормально работать и без настроек, касающихся электронной почты. Если вы хотите эти напоминания включить — надо сделать следующее:

  1. Надо ввести в строки FROM = TO = «YOUR_EMAIL@gmail.com» и password = «YOUR_PASSWORD» ваш адрес электронной почты Gmail и пароль.
  2. Нужно раскомментировать следующие строки:

    •  # send_last_watered_email(time_keeper.time_last_watered)
    • # schedule.every().friday.at(«12:00»).do(send_check_water_level_email)
    • # schedule.run_pending()
  3. Нужно перейти сюда, войти в учётную запись Gmail и включить переключатель, имеющийся на данной странице. В противном случае при попытке отправить письмо с использованием Gmail вы получите сообщение об ошибке. 

Кроме того, тут важно отметить, что моя система напоминаний работает только с учётными записями Gmail.

Теперь, когда всё готово к работе, у вас должна получиться следующая структура файлов и папок:

run
├── classes
│ ├── Hardware.py
│ └── TimeKeeper.py
└── water_plant.py

Папку run можно, на самом деле, разместить где угодно. Я решил оставить её в папке Desktop.

Меня не прельщала перспектива подключаться к Raspberry Pi каждый раз, когда надо было запустить water_plant.py. Мне хотелось, чтобы этот скрипт запускался бы автоматически при включении Raspberry Pi. Это, например, позволило бы легко отключить систему, перенести её в другое место, включить, и уже ни о чём не беспокоиться. Для того чтобы реализовать этот привлекательный сценарий, нам понадобится команда crontab.

Откроем на Raspberry Pi окно терминала и введём следующую команду:

sudo crontab -e

В ответ на неё система должна вывести нечто, напоминающее то, что изображено на следующем рисунке.


Настройка задач cron

В этот файл нужно добавить следующую строчку:

@reboot python3 /home/pi/Desktop/run/water_plant.py

Затем этот файл надо сохранить, воспользовавшись комбинацией клавиш Ctrl+X, введя Y и нажав Enter.

Вышеописанной строкой мы даём Raspberry Pi следующие инструкции: «Каждый раз, когда ты перезагружаешься, запускай файл water_plant.py, находящийся в папке run, котораях находится в папке Desktop». Если у вас папка run находится по другому пути — отредактируйте соответствующим образом эту команду.

Итоги


Посмотреть код проекта можно здесь. Если хотите — можете сразу клонировать себе репозиторий такой командой:

git clone https://github.com/AlanConstantino/rpi-plant-project.git

Вот и всё! Теперь вы знаете о том, как создать систему автоматизированного полива комнатных растений, основанную на Raspberry Pi. Она умеет поливать растения каждые 24 часа и может отправлять своему владельцу уведомления и напоминания по электронной почте.

Уважаемые читатели! Как бы вы подошли к разработке домашней автоматизированной системы полива растений?

RUVDS.com
RUVDS – хостинг VDS/VPS серверов

Комментарии 51

    +4
    Вы, большой молодец!
    Однако, жалко тратить столь серьезный аппарат для такой примитивной задачи, сюда просится «ардуина». А еще лучше заточенная под тему плата с AVR или с простым STM8…

    Пардон, только сейчас понял, что перевод. Тем не менее, мысль не поменялась.
      0
      На малинке можно потом добавить датчиков и поднять HomeAssistant, там тоже Python простота и удобство.
      0
      Отличная дорогая игрушка :)
        +3
        теперь у вас есть риск загубить ваши растения не засухой, так переливом. Избыток воды не многим лучше ее отсутствия. Мало того, каждое растение имеет как правило свой диаметр горшка и свой поливной цикл, часть воды обязательно выльется на подоконник или загноит растения.
        Выход- сенсор влажности в каждый горшок и настраиваемая или отдельная линия полива для каждого или хотя б группы похожих растений, но это дорого.
        Но самое печальное даже не это… Большой резервуар воды ( а автоматический полив предполагает, что вы забываете про полив) — источник бактериального заражения почвы. Через где-то месяц в нем( или в трубках) начинает плодиться суровая бактериально-патогенная (для растений) микрофлора. Здесь один выход- антибиотики.
        Применение дешевой помпы, создаст еще одну трудность — либо она не прокачает трубку (1м или 2М), особенно при подъеме, либо (если поднять резервуар с водой) вода пойдет самотеком и зальет ваши горшки.
        Решите эти проблемы — будет дело, а так это 1000500й полив «ардуинкой».

        Сорри, только после комментов понял, что это перевод)
          0
          Помпа тут перистальтическая, так что вода сквозь нее самотеком не пойдет.
            0
            Да, вот интересно — про помпу если можно подробнее!

            Мое замечание из моих чисто эмпирических наблюдений за процессом. Как минимум года три борюсь с авто-поливом. )) Вначале воду нужно из большой емкости поднять на уровень края этой емкости, затем прогнать по трубкам и снова поднять на уровень горшка. Справится перистальтика с такой работой?
              0
              Устройство простое. По окружности проложен шланг, по которому катятся несколько колёс и проталкивают воду.
              image
                0
                спасиб, как перистальтика в принципе работает я знаю
                мне показалась реализация конкретного моторчика необычной, но приглядевшись, понял, что обычный.
                Перистальтика либо дорого(если на каждую ветку по насосу), либо не подойдет по напору) лучше мощный 5в аквариумник и клапана-ИМНО.
            0
            А если в тщательно очищенный резервуар налить воду обессоленую после осмотического фильтра?
              +1
              вообще для растений соли как раз нужны, а бактериям они особо не помощники…
                0
                Так растениям нужны другие соли и в других концентрациях…
              0
              Наверное можно добавить УФ обработку воды в резервуаре…
                0
                наверное можно, но это тащить 220в, а у меня вся система на 4х АА…
                0

                Датчик влажности довольно одноразовая штука :( Ну, по крайней мере из доступных. Они быстро покрываются коррозией и их нужно периодически менять. Выбор на Али большой, даже "антикоррозийных", но вот по-настоящему качественные найти трудно.

                  0

                  А можно поподробнее про патогенную микрофлору? У меня в резервуарах, из видимого, кроме каких-нибудь водорослей ничего не развивается. (По типу хлореллы и сине-зеленых водорослей. Первая, к стати считается полезной для растений)

                    0
                    ну подробнее это вряд ли )) — сиквенс микробиома не делал. Но какие-то хлопья появляются в воде, формируя слизистые колонии, верхняя часть земли начинает рыжеть. Это ж прежде всего зависит от среды обитания. Значит у меня либо дома, либо в воде больше «всякой», чем у вас…
                      0

                      каждый раз при наполнении ёмкости проводить "подкормку" воды, исходя из её качества в каждом конкртетном случае? вы свою воду изучите, изучите, что можно добавить в воду, чтобы оно и растению на пользу и бактерий/слизи в воде не образовывалось. лично у меня вода спокойно может стоять в закрытой ёмкости месяцаме без образования видимого загрязнения (в открытой ёмкости, естественно, в воду из окружающей среды может попадать всё, что угодно)

                    0

                    А если для защиты от микрофлоры в резервуар для воды кинуть серебро? Ложку серебряную например.

                      0
                      Есть ультрафиолетовые лампы для дезинфекции воды в аквариуме. Думаю можно включать раз в неделю.
                    0

                    Уважаемая редакция, я часто встречаю статьи об автополиве растений. Подскажите, пожалуйста, как сделать автоматический отгон котов...

                      +1
                      Сделать орошение на датчике движения. Если любимый цветок задергается в горшке чтобы убить всех человеков, то заливаем его водой это задержит его немного. Как только система будет готова, можно применить ее и для котов. Правда, я не понял что такое отгон. Это что-то из самогоноварения? Тогда полив не подойдет.
                        0

                        А это мысль: сделать фотодатчик на кота, как только он нависает над горшком, включается полив — только вверх.

                          0
                          Может вместо полива включать какой-нибудь противный звук? Ультразвук? Мигающий свет, как при ЭЭГ…
                            0

                            Не годится для спальни и детской:)

                            +1
                            Лучше распылитель типа «искусственного тумана» — количество воды будет минимально, а коту будет противно.
                              0

                              Отличная мысль, спасибо:)

                        0
                        Водопроводная труба + ардуино + релешки + солиноидные клапаны и датчики влажности (по 1 на каждый горшок) + для защиты один общий солиноидный клапан на датчик протечки (на пол) + мигание светодиодом, если ардуино пытался полить, а по датчику влажности ничего не получилось = нормально будет?
                          0

                          Насколько знаю, датчики влажности почвы — фигня.

                            0
                            Какие именно фигня?
                              0
                              не все фигня и есть хорошие, но они дорогие.
                                0
                                Датчики на ёмкостном эффекте не корродируют в почве.
                                0

                                Я не спец, но вроде бы водопроводной водой цветы не поливают — во первых из под крана холодная слишком, вода должна быть комнатной температуры. Во вторых, там хлор растворен для обеззараживания, в открытой бутылке он выходит из воды понемногу.

                                0
                                Делал я подобную штуку, и с датчиком влажности и по факту всё это не пашет
                                А дело в том что, поливя из трубочки вода смачивает только этот маленький пяточёк, и стикает тонкой ниткой через толщу почвы в самый низ, при этом в 3-х см от трубки пова сухая при сухая. Этот эффект не сразу проявляется, а через неделю например.
                                Выход поливать разбрзгиванием, но так нужно давление да и дома особо не набрызгаешся.
                                  0
                                  Можно, наверное, проложить шланг кольцом, а в нём маленькие дырочки…
                                    0
                                    Это было первое что я попорбовал, на самом деле вода находит дырку чуть-чуть поблище в началу трубки и черз дырку которая чуть-чуть больше чем другие и текёт опять-таки через одно отверстие.
                                    К тому же трубки изнутри зарастают таким слоем слизким, это бактерии. и при том минимальном давнеии что есть она вообще может забиться неговоря уже о маленьких дырках.
                                      0
                                      Может тогда тупо сделать разветвитель толстой трубки, на много мелких и развести их в разные стороны? А еще может закопать их как корни…
                                        0
                                        не наблюдал такого за несколько лет эксплуатации… бактерии, да — это напасть.
                                        у меня стоит китайский держатель, втыкающийся в почву с трубо-рассекателем, трубка подведена к корням, вроде справляется.
                                    0
                                    Несколько лет назад, уезжая в отпуск на пару-тройку недель, пытался решить эту задачу для нескольких десятков горшочков. Хотелось упростить жизнь тому, кто взялся на это время ухаживать за цветами.
                                    Схема проста до нельзя. Тазик с водой стоит выше уровня горшочков. Из тазика в горшочки тянутся жгуты сплетённые из киперной ленты (была под рукой, можно заменить бинтом, х/б верёвочкой...). Толщина каждого жгута подбирается под потребление конкретного цветочка — очень муторная и длительная процедура.
                                    Алгоритм очевиден: два-три раза в неделю тазик наполняется водой. Я заливал руками, но автоматизировать один канал — даже не обсуждается.
                                    зы. где-то в инетах видел подобное.
                                      0
                                      В Интернетах… Журнал «Работница» или аналогичный за какой-то там мохнатый год из 80-х, там просто шнурок для ботинка применяется. Давайте микроскопом гвозди забивать?
                                        0
                                        Да идея-то очевидная, на поверхности лежит. Шнурок от ботинка, как подкласс верёвочки, будет работать. Только регулировать придётся числом шнурков. Это дороговато при числе горшочков в четыре десятка.
                                        А про микроскоп я не понял.
                                          0
                                          Микроскоп это больше к основным «строителям» подобного — микроконтроллер на любой чих. «Аналога» как грязи вокруг — нет, надо быть супер-пупер-мульти-современным (без датчика солнца полив ни-ни!)
                                          Регулировка полива там же в журнале была, как ни странно. Но вот найти его (журнал) сейчас мне затруднительно
                                            0
                                            Если уехал в отпуск, а поливать нужно пару-тройку раз в неделю, то альтернативу «микроскопу» придумать сложно, особенно если принять во внимание цену решения.
                                      0
                                      Нереальная система для одного горшка) Хватит STM32 BluePill
                                        0
                                        Хватит STM32 BluePill

                                        Хватит даже ATtiny13A. Правда, без питона, хипстеры не одобрят.
                                          0
                                          Полив тупо по таймеру или датчику влажности можно и на дискретных элементах сделать, там все не очень сложно.
                                          Другое дело, что сейчас на МК все это сильно дешевле и быстрее выйдет :)
                                        +1
                                        Сложность не в том, как автоматизировать полив одиного горшка, а как это сделать с двадцатью;) Не покупать же 20 водяных помп ;)

                                        upd: посчитал — в 2х лоджиях и на одном окне у меня больше 40 горшков с цветами;)
                                          0
                                          см. выше: тут я предложил вариант.
                                            0
                                            Не будет работать, если требуется разный уровень полива для разных растений — а он требуется, когда у вас разные цветы в 20ти условных горшках;)

                                              0
                                              Работает. Регулируется толщиной верёвочки. Прочитайте. пожалуйста, повнимательней мой комментарий.
                                          0
                                          проще использовать USB реле. не требует доппитания. проще в управлении и подключении
                                          использую такое для домашней автоматики лет 5 уже
                                          управляется отправкой набора цифр через pyserial кодом из 3-х строк
                                          self.ser = serial.Serial(self.port, timeout=0.1)
                                          self.ser.write(binascii.unhexlify('5501010200000059'))
                                          self.ser.close()
                                            0

                                            Синяя пилюля (stm32) для такого проекта — максимум. Если так пойдёт и дальше, скоро настолка с i7 + WEB/JS ворвутся даже в комнатный полив…

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое