You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/uk/2-farm/lessons/3-automated-plant-watering/README.md

39 KiB

Автоматичний полив рослин

Скетчноут із загальним оглядом цього уроку

Скетчноут від Нітії Нарасімхан. Натисніть на зображення, щоб побачити його у більшому розмірі.

Цей урок був проведений у рамках Проєкту IoT для початківців 2 - Цифрове сільське господарство від Microsoft Reactor.

Автоматичний полив рослин на базі IoT

Тест перед лекцією

Тест перед лекцією

Вступ

На попередньому уроці ви дізналися, як вимірювати вологість ґрунту. У цьому уроці ви навчитеся створювати основні компоненти автоматичної системи поливу, яка реагує на рівень вологості ґрунту. Ви також дізнаєтеся про важливість часу — як сенсори можуть потребувати часу для реагування на зміни, а актуатори — для зміни властивостей, які вимірюються сенсорами.

У цьому уроці ми розглянемо:

Керування пристроями високої потужності за допомогою IoT-пристрою низької потужності

IoT-пристрої використовують низьку напругу. Хоча цього достатньо для сенсорів і малопотужних актуаторів, таких як світлодіоди, цього недостатньо для керування більшим обладнанням, наприклад, насосом для поливу. Навіть невеликі насоси для кімнатних рослин споживають занадто багато струму для IoT-плати, що може призвести до її пошкодження.

🎓 Струм, вимірюваний в амперах (A), — це кількість електрики, що проходить через коло. Напруга забезпечує поштовх, а струм визначає, скільки саме електрики передається. Більше про струм можна прочитати на сторінці про електричний струм у Вікіпедії.

Рішенням є підключення насоса до зовнішнього джерела живлення та використання актуатора для його ввімкнення, подібно до того, як ви вмикаєте світло. Для натискання вимикача потрібно зовсім небагато енергії (у вигляді енергії вашого тіла), що з'єднує світло з електромережею, яка працює на 110В/240В.

Вимикач вмикає живлення для лампи

🎓 Електромережа — це електрика, що постачається до будинків і підприємств через національну інфраструктуру в багатьох країнах світу.

IoT-пристрої зазвичай забезпечують 3.3В або 5В при струмі менше 1 ампера (1А). Для порівняння, електромережа зазвичай працює на 230В (120В у Північній Америці та 100В у Японії) і може забезпечувати живлення для пристроїв, які споживають до 30А.

Існує багато актуаторів, які можуть це зробити, включаючи механічні пристрої, які можна прикріпити до існуючих вимикачів, імітуючи натискання пальцем. Найпопулярнішим є реле.

Реле

Реле — це електромеханічний вимикач, який перетворює електричний сигнал у механічний рух, що вмикає вимикач. Основою реле є електромагніт.

🎓 Електромагніти — це магніти, які створюються шляхом пропускання електрики через котушку дроту. Коли електрика вмикається, котушка намагнічується. Коли електрика вимикається, котушка втрачає магнетизм.

Коли реле ввімкнене, електромагніт створює магнітне поле, яке замикає вимикач вихідного кола

У реле керуюче коло живить електромагніт. Коли електромагніт увімкнений, він притягує важіль, який замикає контакти і завершує вихідне коло.

Коли реле вимкнене, електромагніт не створює магнітного поля, розмикаючи вимикач вихідного кола

Коли керуюче коло вимкнене, електромагніт вимикається, відпускаючи важіль і розмикаючи контакти, що вимикає вихідне коло. Реле є цифровими актуаторами — високий сигнал вмикає реле, низький сигнал вимикає його.

Вихідне коло можна використовувати для живлення додаткового обладнання, наприклад, системи зрошення. IoT-пристрій може ввімкнути реле, завершуючи вихідне коло, яке живить систему зрошення, і рослини отримують воду. Потім IoT-пристрій може вимкнути реле, відключаючи живлення системи зрошення і припиняючи подачу води.

Реле вмикає насос, який подає воду до рослини

На відео вище реле вмикається. Світлодіод на реле загоряється, вказуючи, що воно ввімкнене (деякі плати реле мають світлодіоди для індикації стану реле), і живлення подається на насос, який починає подавати воду до рослини.

💁 Реле також можна використовувати для перемикання між двома вихідними колами замість увімкнення або вимкнення одного. Коли важіль рухається, він перемикає вимикач із завершення одного вихідного кола на завершення іншого, зазвичай використовуючи спільне джерело живлення або спільний заземлюючий контакт.

Проведіть дослідження: Існує кілька типів реле, які відрізняються, наприклад, тим, чи вмикається реле при подачі живлення на керуюче коло, чи вимикається, або кількістю вихідних кіл. Дізнайтеся більше про ці типи.

Коли важіль рухається, зазвичай можна почути чіткий клацання, коли він контактує з електромагнітом.

💁 Реле можна підключити так, щоб з'єднання фактично розривало живлення реле, вимикаючи його, що потім знову подає живлення на реле, і так далі. Це означає, що реле буде клацати дуже швидко, створюючи гудіння. Так працювали деякі з перших дзвінків у дверях.

Живлення реле

Електромагніту не потрібно багато енергії, щоб активуватися і притягнути важіль, його можна керувати за допомогою 3.3В або 5В від IoT-плати. Вихідне коло може передавати набагато більше енергії, залежно від реле, включаючи напругу електромережі або навіть вищі рівні потужності для промислового використання. Таким чином, IoT-плата може керувати системою зрошення — від невеликого насоса для однієї рослини до величезної промислової системи для всього комерційного господарства.

Реле Grove із позначеними керуючим колом, вихідним колом і самим реле

На зображенні вище показано реле Grove. Керуюче коло підключається до IoT-пристрою і вмикає або вимикає реле за допомогою 3.3В або 5В. Вихідне коло має два термінали, будь-який з яких може бути живленням або заземленням. Вихідне коло може витримувати до 250В при 10А, чого достатньо для ряду пристроїв, що працюють від електромережі. Ви можете знайти реле, які витримують ще вищі рівні потужності.

Насос, підключений через реле

На зображенні вище живлення подається на насос через реле. Червоний дріт з'єднує термінал +5В USB-джерела живлення з одним терміналом вихідного кола реле, а інший червоний дріт з'єднує інший термінал вихідного кола з насосом. Чорний дріт з'єднує насос із заземленням USB-джерела живлення. Коли реле вмикається, воно завершує коло, подаючи 5В на насос і вмикаючи його.

Керування реле

Ви можете керувати реле за допомогою вашої IoT-плати.

Завдання — керування реле

Виконайте відповідний посібник для керування реле за допомогою вашого IoT-пристрою:

Керування вашою рослиною через MQTT

На даний момент ваше реле керується IoT-пристроєм безпосередньо на основі одного показника вологості ґрунту. У комерційній системі зрошення логіка керування централізована, що дозволяє приймати рішення про полив на основі даних з кількох сенсорів і змінювати конфігурацію в одному місці. Щоб змоделювати це, ви можете керувати реле через MQTT.

Завдання — керування реле через MQTT

  1. Додайте відповідні бібліотеки MQTT/pip-пакети та код до вашого проєкту soil-moisture-sensor, щоб підключитися до MQTT. Назвіть ідентифікатор клієнта як soilmoisturesensor_client, додавши ваш ID як префікс.

    ⚠️ Ви можете звернутися до інструкцій щодо підключення до MQTT у проєкті 1, урок 4, якщо це необхідно.

  2. Додайте відповідний код пристрою для надсилання телеметрії з налаштуваннями вологості ґрунту. Для повідомлення телеметрії назвіть властивість soil_moisture.

    ⚠️ Ви можете звернутися до інструкцій щодо надсилання телеметрії до MQTT у проєкті 1, урок 4, якщо це необхідно.

  3. Створіть локальний серверний код для підписки на телеметрію та надсилання команди для керування реле в папці soil-moisture-sensor-server. Назвіть властивість у повідомленні команди relay_on, а ідентифікатор клієнта — soilmoisturesensor_server, додавши ваш ID як префікс. Дотримуйтесь тієї ж структури, що й у серверному коді, який ви писали для проєкту 1, урок 4, оскільки ви будете додавати до цього коду пізніше в цьому уроці.

    ⚠️ Ви можете звернутися до інструкцій щодо надсилання телеметрії до MQTT та надсилання команд через MQTT у проєкті 1, урок 4, якщо це необхідно.

  4. Додайте відповідний код пристрою для керування реле на основі отриманих команд, використовуючи властивість relay_on із повідомлення. Надсилайте true для relay_on, якщо soil_moisture перевищує 450, інакше надсилайте false, як у логіці, яку ви додали для IoT-пристрою раніше.

    ⚠️ Ви можете звернутися до інструкцій щодо обробки команд із MQTT у проєкті 1, урок 4, якщо це необхідно.

💁 Ви можете знайти цей код у папці code-mqtt.

Переконайтеся, що код працює на вашому пристрої та локальному сервері, і протестуйте його, змінюючи рівні вологості ґрунту, або змінюючи значення, які надсилає віртуальний сенсор, або змінюючи рівень вологості ґрунту, додаючи воду чи виймаючи сенсор із ґрунту.

Час роботи сенсорів і актуаторів

На уроці 3 ви створили нічник — світлодіод, який вмикається, коли сенсор світла виявляє низький рівень освітлення. Сенсор світла миттєво реагував на зміну рівня освітлення, і пристрій міг швидко реагувати, обмежуючись лише тривалістю затримки у функції loop або циклі while True:. Як розробник IoT, ви не завжди можете розраховувати на такий швидкий зворотний зв'язок.

Час для вологості ґрунту

Якщо ви виконували попередній урок із використанням фізичного сенсора вологості ґрунту, ви могли помітити, що рівень вологості ґрунту знижувався через кілька секунд після поливу рослини. Це відбувається не через повільність сенсора, а через те, що вода потребує часу, щоб просочитися через ґрунт. 💁 Якщо ви поливали занадто близько до сенсора, ви могли помітити, як показник швидко знизився, а потім знову піднявся — це відбувається через те, що вода біля сенсора розповсюджується по решті ґрунту, зменшуючи вологість ґрунту біля сенсора. Вимірювання вологості ґрунту 658 не змінюється під час поливу, лише падає до 320 після поливу, коли вода просочилася через ґрунт

На діаграмі вище показано, що показник вологості ґрунту становить 658. Рослину поливають, але цей показник не змінюється одразу, оскільки вода ще не досягла датчика. Полив може навіть завершитися до того, як вода досягне датчика, і значення знизиться, відображаючи новий рівень вологості.

Якщо ви пишете код для управління системою зрошення через реле на основі рівня вологості ґрунту, вам потрібно врахувати цю затримку і створити розумніший таймінг для вашого IoT-пристрою.

Зробіть паузу і подумайте, як ви могли б це реалізувати.

Контроль таймінгу датчика і виконавчого механізму

Уявіть, що вам доручили створити систему зрошення для ферми. Виходячи з типу ґрунту, ідеальний рівень вологості для вирощуваних рослин відповідає аналоговому показнику напруги 400-450.

Ви могли б запрограмувати пристрій так само, як нічник — увесь час, поки датчик показує значення вище 450, увімкнути реле для запуску насоса. Проблема полягає в тому, що вода потребує часу, щоб пройти від насоса через ґрунт до датчика. Датчик зупинить подачу води, коли виявить рівень 450, але рівень води продовжить падати, оскільки вода, що була накачана, продовжує просочуватися через ґрунт. У результаті витрачається зайва вода, а також виникає ризик пошкодження коренів.

Пам’ятайте — надмірна кількість води може бути так само шкідливою для рослин, як і недостатня, і витрачає цінний ресурс.

Краще рішення — зрозуміти, що існує затримка між увімкненням виконавчого механізму і зміною властивості, яку вимірює датчик. Це означає, що датчик не лише має зачекати певний час перед повторним вимірюванням значення, але й виконавчий механізм має вимкнутися на певний час перед наступним вимірюванням датчика.

Скільки часу реле має бути увімкненим кожного разу? Краще перестрахуватися і вмикати реле лише на короткий час, потім зачекати, поки вода просочиться, і повторно перевірити рівень вологості. Зрештою, ви завжди можете увімкнути насос знову, щоб додати більше води, але не можете забрати воду з ґрунту.

💁 Такий контроль таймінгу дуже специфічний для IoT-пристрою, який ви створюєте, властивості, яку ви вимірюєте, а також датчиків і виконавчих механізмів, які використовуються.

Рослина полуниці, підключена до води через насос, насос підключений до реле. Реле і датчик вологості ґрунту в рослині підключені до Raspberry Pi

Наприклад, у мене є рослина полуниці з датчиком вологості ґрунту і насосом, який контролюється реле. Я помітив, що коли я додаю воду, потрібно близько 20 секунд, щоб показник вологості ґрунту стабілізувався. Це означає, що я маю вимкнути реле і зачекати 20 секунд перед перевіркою рівня вологості. Я краще дам занадто мало води, ніж занадто багато — я завжди можу увімкнути насос знову, але не можу забрати воду з рослини.

Крок 1: зробити вимірювання. Крок 2: додати воду. Крок 3: зачекати, поки вода просочиться через ґрунт. Крок 4: повторно зробити вимірювання

Це означає, що найкращий процес поливу буде виглядати приблизно так:

  • Увімкнути насос на 5 секунд
  • Зачекати 20 секунд
  • Перевірити рівень вологості ґрунту
  • Якщо рівень все ще вище потрібного, повторити ці кроки

5 секунд можуть бути занадто довгим часом для насоса, особливо якщо рівень вологості лише трохи перевищує потрібний рівень. Найкращий спосіб визначити, який таймінг використовувати, — це спробувати, а потім коригувати, коли у вас будуть дані датчика, з постійним циклом зворотного зв’язку. Це навіть може призвести до більш точного таймінгу, наприклад, увімкнення насоса на 1 секунду за кожні 100 одиниць вище потрібного рівня вологості ґрунту, замість фіксованих 5 секунд.

Проведіть дослідження: Чи є інші фактори таймінгу? Чи можна поливати рослину будь-коли, коли рівень вологості ґрунту занадто низький, чи є конкретні часи доби, які підходять або не підходять для поливу рослин?

💁 Прогнози погоди також можна враховувати при управлінні автоматизованими системами поливу для вирощування на відкритому повітрі. Якщо очікується дощ, полив можна відкласти до його завершення. Після цього ґрунт може бути достатньо вологим, щоб не потребувати поливу, що набагато ефективніше, ніж витрачати воду, поливаючи перед дощем.

Додайте таймінг до вашого сервера управління рослиною

Код сервера можна змінити, щоб додати контроль таймінгу циклу поливу і очікування зміни рівня вологості ґрунту. Логіка сервера для управління таймінгом реле виглядає так:

  1. Отримано телеметричне повідомлення
  2. Перевірити рівень вологості ґрунту
  3. Якщо все добре, нічого не робити. Якщо показник занадто високий (тобто рівень вологості ґрунту занадто низький), тоді:
    1. Надіслати команду для увімкнення реле
    2. Зачекати 5 секунд
    3. Надіслати команду для вимкнення реле
    4. Зачекати 20 секунд, щоб рівень вологості ґрунту стабілізувався

Цикл поливу, процес від отримання телеметричного повідомлення до готовності обробляти рівень вологості ґрунту знову, займає близько 25 секунд. Ми надсилаємо рівні вологості ґрунту кожні 10 секунд, тому є накладання, коли повідомлення отримується, поки сервер очікує стабілізації рівня вологості ґрунту, що може запустити ще один цикл поливу.

Є два варіанти вирішення цієї проблеми:

  • Змінити код IoT-пристрою, щоб надсилати телеметрію лише раз на хвилину, таким чином цикл поливу завершиться до надсилання наступного повідомлення
  • Відписатися від телеметрії під час циклу поливу

Перший варіант не завжди є хорошим рішенням для великих ферм. Фермер може захотіти фіксувати рівні вологості ґрунту під час поливу для подальшого аналізу, наприклад, щоб бути в курсі потоку води в різних зонах ферми для більш цільового поливу. Другий варіант кращий — код просто ігнорує телеметрію, коли не може її використовувати, але телеметрія все ще доступна для інших сервісів, які можуть її підписати.

💁 Дані IoT не надсилаються лише одним пристроєм до одного сервісу, натомість багато пристроїв можуть надсилати дані до брокера, і багато сервісів можуть слухати ці дані з брокера. Наприклад, один сервіс може слухати дані про вологість ґрунту і зберігати їх у базі даних для аналізу пізніше. Інший сервіс також може слухати ту саму телеметрію для управління системою зрошення.

Завдання - додайте таймінг до вашого сервера управління рослиною

Оновіть код вашого сервера, щоб реле працювало 5 секунд, а потім чекало 20 секунд.

  1. Відкрийте папку soil-moisture-sensor-server у VS Code, якщо вона ще не відкрита. Переконайтеся, що віртуальне середовище активоване.

  2. Відкрийте файл app.py

  3. Додайте наступний код до файлу app.py під існуючими імпортами:

    import threading
    

    Цей оператор імпортує threading з бібліотек Python, що дозволяє виконувати інший код під час очікування.

  4. Додайте наступний код перед функцією handle_telemetry, яка обробляє телеметричні повідомлення, отримані кодом сервера:

    water_time = 5
    wait_time = 20
    

    Це визначає, як довго працюватиме реле (water_time) і як довго чекати після цього для перевірки вологості ґрунту (wait_time).

  5. Під цим кодом додайте наступне:

    def send_relay_command(client, state):
        command = { 'relay_on' : state }
        print("Sending message:", command)
        client.publish(server_command_topic, json.dumps(command))
    

    Цей код визначає функцію send_relay_command, яка надсилає команду через MQTT для управління реле. Телеметрія створюється як словник, а потім перетворюється на JSON-рядок. Значення, передане в state, визначає, чи реле має бути увімкненим чи вимкненим.

  6. Після функції send_relay_code додайте наступний код:

    def control_relay(client):
        print("Unsubscribing from telemetry")
        mqtt_client.unsubscribe(client_telemetry_topic)
    
        send_relay_command(client, True)
        time.sleep(water_time)
        send_relay_command(client, False)
    
        time.sleep(wait_time)
    
        print("Subscribing to telemetry")
        mqtt_client.subscribe(client_telemetry_topic)
    

    Це визначає функцію для управління реле на основі потрібного таймінгу. Спочатку вона відписується від телеметрії, щоб повідомлення про вологість ґрунту не оброблялися під час поливу. Потім надсилає команду для увімкнення реле. Далі чекає water_time, перш ніж надіслати команду для вимкнення реле. Нарешті, чекає стабілізації рівня вологості ґрунту протягом wait_time секунд. Потім знову підписується на телеметрію.

  7. Змініть функцію handle_telemetry на наступну:

    def handle_telemetry(client, userdata, message):
        payload = json.loads(message.payload.decode())
        print("Message received:", payload)
    
        if payload['soil_moisture'] > 450:
            threading.Thread(target=control_relay, args=(client,)).start()
    

    Цей код перевіряє рівень вологості ґрунту. Якщо він перевищує 450, ґрунт потребує поливу, тому викликається функція control_relay. Ця функція виконується в окремому потоці, працюючи у фоновому режимі.

  8. Переконайтеся, що ваш IoT-пристрій працює, а потім запустіть цей код. Змініть рівні вологості ґрунту і спостерігайте, що відбувається з реле — воно має увімкнутися на 5 секунд, а потім залишатися вимкненим щонайменше 20 секунд, увімкнувшись лише тоді, коли рівень вологості ґрунту недостатній.

    (.venv) ➜  soil-moisture-sensor-server ✗ python app.py
    Message received: {'soil_moisture': 457}
    Unsubscribing from telemetry
    Sending message: {'relay_on': True}
    Sending message: {'relay_on': False}
    Subscribing to telemetry
    Message received: {'soil_moisture': 302}
    

    Хороший спосіб протестувати це в симульованій системі зрошення — використовувати сухий ґрунт, а потім вручну наливати воду, поки реле увімкнене, зупиняючи наливання, коли реле вимикається.

💁 Ви можете знайти цей код у папці code-timing.

💁 Якщо ви хочете використовувати насос для створення реальної системи зрошення, ви можете використовувати 6V водяний насос з USB-термінальним джерелом живлення. Переконайтеся, що живлення до або від насоса підключено через реле.


🚀 Виклик

Чи можете ви придумати інші IoT або електричні пристрої, які мають схожу проблему, коли потрібен час, щоб результати виконавчого механізму досягли датчика? Можливо, у вас є кілька таких пристроїв вдома або в школі.

  • Які властивості вони вимірюють?
  • Скільки часу потрібно, щоб властивість змінилася після використання виконавчого механізму?
  • Чи нормально, якщо властивість змінюється за межі потрібного значення?
  • Як її можна повернути до потрібного значення, якщо це необхідно?

Післялекційний тест

Післялекційний тест

Огляд і самостійне навчання

  • Дізнайтеся більше про реле, включаючи їх історичне використання в телефонних станціях, на сторінці Wikipedia про реле.

Завдання

Створіть більш ефективний цикл поливу


Відмова від відповідальності:
Цей документ було перекладено за допомогою сервісу автоматичного перекладу Co-op Translator. Хоча ми прагнемо до точності, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.