|
4 weeks ago | |
---|---|---|
.. | ||
README.md | 4 weeks ago | |
assignment.md | 4 weeks ago | |
pi-relay.md | 4 weeks ago | |
virtual-device-relay.md | 4 weeks ago | |
wio-terminal-relay.md | 4 weeks ago |
README.md
Автоматический полив растений
Скетчноут от Nitya Narasimhan. Нажмите на изображение, чтобы увидеть его в большем размере.
Этот урок был частью IoT для начинающих: Проект 2 - Цифровое сельское хозяйство от Microsoft Reactor.
Тест перед лекцией
Введение
На прошлом уроке вы узнали, как измерять влажность почвы. На этом уроке вы научитесь создавать основные компоненты автоматической системы полива, которая реагирует на уровень влажности почвы. Вы также узнаете о временных задержках — как датчики могут реагировать на изменения с задержкой, а исполнительные устройства могут требовать времени для изменения измеряемых параметров.
В этом уроке мы рассмотрим:
- Управление устройствами с высоким энергопотреблением с помощью IoT-устройства с низким энергопотреблением
- Управление реле
- Управление растением через MQTT
- Временные задержки датчиков и исполнительных устройств
- Добавление тайминга на сервер управления растением
Управление устройствами с высоким энергопотреблением с помощью IoT-устройства с низким энергопотреблением
IoT-устройства используют низкое напряжение. Хотя этого достаточно для датчиков и маломощных исполнительных устройств, таких как светодиоды, этого недостаточно для управления более крупным оборудованием, например, насосом для полива. Даже небольшие насосы, которые можно использовать для комнатных растений, потребляют слишком много тока для IoT-устройства и могут вывести плату из строя.
🎓 Ток, измеряемый в амперах (A), — это количество электричества, проходящего через цепь. Напряжение обеспечивает толчок, а ток показывает, сколько электричества передается. Подробнее о токе можно прочитать на странице о электрическом токе в Википедии.
Решение заключается в том, чтобы подключить насос к внешнему источнику питания и использовать исполнительное устройство для включения насоса, аналогично тому, как вы включаете свет. Для нажатия на выключатель требуется небольшое количество энергии (в виде энергии вашего тела), и это соединяет свет с электрической сетью, работающей на 110В/240В.
🎓 Электросеть — это электричество, подаваемое в дома и предприятия через национальную инфраструктуру во многих странах мира.
✅ IoT-устройства обычно обеспечивают 3.3В или 5В при токе менее 1 ампера (1А). Для сравнения, электросеть чаще всего работает на 230В (120В в Северной Америке и 100В в Японии) и может обеспечивать питание для устройств, потребляющих до 30А.
Существует множество исполнительных устройств, которые могут это сделать, включая механические устройства, которые можно прикрепить к существующим выключателям, имитируя нажатие пальцем. Самым популярным из них является реле.
Реле
Реле — это электромеханический переключатель, который преобразует электрический сигнал в механическое движение, включающее переключатель. Основным элементом реле является электромагнит.
🎓 Электромагниты — это магниты, создаваемые пропусканием электричества через катушку провода. Когда электричество включено, катушка намагничивается. Когда электричество выключено, катушка теряет свою магнитность.
В реле управляющая цепь питает электромагнит. Когда электромагнит включен, он притягивает рычаг, который замыкает контакты и завершает выходную цепь.
Когда управляющая цепь выключена, электромагнит отключается, освобождая рычаг и размыкая контакты, что отключает выходную цепь. Реле являются цифровыми исполнительными устройствами — высокий сигнал включает реле, низкий сигнал выключает его.
Выходная цепь может использоваться для питания дополнительного оборудования, например, системы полива. IoT-устройство может включить реле, замкнув выходную цепь, которая питает систему полива, и растения будут поливаться. Затем IoT-устройство может выключить реле, разорвав цепь питания системы полива, отключив воду.
На видео выше реле включается. Светодиод на реле загорается, указывая на его включение (некоторые платы реле имеют светодиоды для индикации состояния реле), и питание подается на насос, который включается и подает воду к растению.
💁 Реле также могут использоваться для переключения между двумя выходными цепями вместо включения и выключения одной. Когда рычаг перемещается, он переключает цепь с одной выходной цепи на другую, обычно имея общий источник питания или общий заземляющий контакт.
✅ Исследуйте: Существует несколько типов реле, различающихся, например, тем, включается ли реле при подаче питания на управляющую цепь или выключается, а также количеством выходных цепей. Узнайте больше об этих типах.
Когда рычаг перемещается, обычно можно услышать четкий щелчок, указывающий на контакт с электромагнитом.
💁 Реле можно подключить так, чтобы замыкание цепи разрывало питание реле, выключая его, что затем снова подает питание на реле, и так далее. Это приводит к очень быстрому щелканию реле, создавая жужжащий звук. Так работали первые звонки в электрических дверных звонках.
Питание реле
Электромагниту требуется немного энергии для активации и перемещения рычага, его можно управлять с помощью 3.3В или 5В от IoT-устройства. Выходная цепь может передавать гораздо больше энергии, в зависимости от реле, включая напряжение электросети или даже более высокие уровни мощности для промышленного использования. Таким образом, IoT-устройство может управлять системой полива — от небольшого насоса для одного растения до огромной промышленной системы для коммерческой фермы.
На изображении выше показано реле Grove. Управляющая цепь подключается к IoT-устройству и включает или выключает реле, используя 3.3В или 5В. Выходная цепь имеет два терминала, любой из которых может быть источником питания или заземлением. Выходная цепь может выдерживать до 250В при 10А, что достаточно для различных устройств, работающих от электросети. Существуют реле, которые могут выдерживать еще более высокие уровни мощности.
На изображении выше питание подается на насос через реле. Красный провод соединяет клемму +5В USB-источника питания с одним из терминалов выходной цепи реле, а другой красный провод соединяет другой терминал выходной цепи с насосом. Черный провод соединяет насос с заземлением USB-источника питания. Когда реле включается, оно замыкает цепь, подавая 5В на насос, включая его.
Управление реле
Вы можете управлять реле с помощью вашего IoT-устройства.
Задание — управление реле
Выполните соответствующее руководство для управления реле с помощью вашего IoT-устройства:
- Arduino - Wio Terminal
- Одноплатный компьютер - Raspberry Pi
- Одноплатный компьютер - Виртуальное устройство
Управление растением через MQTT
На данный момент ваше реле управляется IoT-устройством напрямую на основе одного показания влажности почвы. В коммерческой системе полива логика управления централизована, что позволяет принимать решения о поливе на основе данных от нескольких датчиков и изменять настройки в одном месте. Чтобы смоделировать это, вы можете управлять реле через MQTT.
Задание — управление реле через MQTT
-
Добавьте соответствующие библиотеки MQTT/pip-пакеты и код в ваш проект
soil-moisture-sensor
для подключения к MQTT. Назовите идентификатор клиента какsoilmoisturesensor_client
, добавив ваш ID в качестве префикса.⚠️ Вы можете обратиться к инструкциям по подключению к MQTT в проекте 1, урок 4, если это необходимо.
-
Добавьте соответствующий код устройства для отправки телеметрии с настройками влажности почвы. Для сообщения телеметрии назовите свойство
soil_moisture
.⚠️ Вы можете обратиться к инструкциям по отправке телеметрии в MQTT в проекте 1, урок 4, если это необходимо.
-
Создайте локальный серверный код для подписки на телеметрию и отправки команды для управления реле в папке
soil-moisture-sensor-server
. Назовите свойство в сообщении командыrelay_on
, а идентификатор клиента —soilmoisturesensor_server
, добавив ваш ID в качестве префикса. Сохраните ту же структуру, что и в серверном коде, который вы писали для проекта 1, урок 4, так как вы будете добавлять в этот код позже в этом уроке.⚠️ Вы можете обратиться к инструкциям по отправке телеметрии в MQTT и отправке команд через MQTT в проекте 1, урок 4, если это необходимо.
-
Добавьте соответствующий код устройства для управления реле на основе полученных команд, используя свойство
relay_on
из сообщения. Отправляйте true дляrelay_on
, еслиsoil_moisture
больше 450, иначе отправляйте false, как в логике, которую вы добавили для IoT-устройства ранее.⚠️ Вы можете обратиться к инструкциям по обработке команд из MQTT в проекте 1, урок 4, если это необходимо.
💁 Вы можете найти этот код в папке code-mqtt.
Убедитесь, что код работает на вашем устройстве и локальном сервере, и протестируйте его, изменяя уровни влажности почвы, либо изменяя значения, отправляемые виртуальным датчиком, либо изменяя уровень влажности почвы, добавляя воду или вынимая датчик из почвы.
Временные задержки датчиков и исполнительных устройств
На уроке 3 вы создали ночник — светодиод, который включается, как только датчик света обнаруживает низкий уровень освещенности. Датчик света мгновенно реагировал на изменения уровня света, и устройство могло быстро реагировать, ограничиваясь только длиной задержки в функции loop
или цикле while True:
. Как разработчик IoT, вы не всегда можете рассчитывать на такую быструю обратную связь.
Временные задержки для влажности почвы
Если вы выполняли предыдущий урок с использованием физического датчика влажности почвы, вы могли заметить, что показания влажности почвы снижались через несколько секунд после полива растения. Это связано не с медлительностью датчика, а с тем, что воде требуется время, чтобы впитаться в почву.
💁 Если вы поливали слишком близко к датчику, вы могли заметить, что показания быстро упали, а затем снова поднялись — это происходит из-за того, что вода рядом с датчиком распространяется по остальной части почвы, снижая влажность почвы возле датчика.
На диаграмме выше показано, что уровень влажности почвы составляет 658. Растение поливается, но это значение не изменяется сразу, так как вода еще не достигла датчика. Полив может закончиться до того, как вода достигнет датчика, и значение упадет, отражая новый уровень влажности.
Если вы пишете код для управления системой орошения через реле на основе уровня влажности почвы, вам нужно учитывать эту задержку и внедрить более умное управление временем в вашем IoT-устройстве.
✅ Подумайте, как вы могли бы это реализовать.
Управление временем датчика и исполнительного устройства
Представьте, что вам поручили создать систему орошения для фермы. Исходя из типа почвы, идеальный уровень влажности для выращиваемых растений соответствует аналоговому напряжению в диапазоне 400-450.
Вы могли бы запрограммировать устройство так же, как ночник — все время, пока датчик показывает значение выше 450, включать реле для запуска насоса. Проблема в том, что вода некоторое время движется от насоса через почву к датчику. Датчик остановит подачу воды, когда обнаружит уровень 450, но уровень воды будет продолжать падать, так как вода продолжает пропитывать почву. В результате вода будет потрачена впустую, а корни растений могут быть повреждены.
✅ Помните — слишком много воды может быть так же вредно для растений, как и слишком мало, и это приводит к растрате ценного ресурса.
Лучшее решение — понимать, что существует задержка между включением исполнительного устройства и изменением свойства, которое измеряет датчик. Это означает, что датчик должен подождать некоторое время перед повторным измерением, а исполнительное устройство должно быть выключено на некоторое время перед следующим измерением датчика.
Сколько времени реле должно быть включено каждый раз? Лучше перестраховаться и включать реле на короткое время, затем подождать, пока вода пропитает почву, и снова проверить уровень влажности. В конце концов, вы всегда можете включить насос снова, чтобы добавить больше воды, но вы не можете удалить воду из почвы.
💁 Такой контроль времени очень специфичен для IoT-устройства, которое вы создаете, свойства, которое вы измеряете, и используемых датчиков и исполнительных устройств.
Например, у меня есть растение клубники с датчиком влажности почвы и насосом, управляемым реле. Я заметил, что когда я добавляю воду, требуется около 20 секунд, чтобы показания влажности почвы стабилизировались. Это означает, что мне нужно выключить реле и подождать 20 секунд перед проверкой уровня влажности. Я предпочитаю, чтобы воды было недостаточно, чем слишком много — я всегда могу включить насос снова, но не могу удалить воду из растения.
Это означает, что лучший процесс полива будет выглядеть примерно так:
- Включить насос на 5 секунд
- Подождать 20 секунд
- Проверить уровень влажности почвы
- Если уровень все еще выше необходимого, повторить вышеуказанные шаги
5 секунд могут быть слишком долгим временем для насоса, особенно если уровень влажности лишь немного выше необходимого. Лучший способ определить, какое время использовать, — попробовать, а затем корректировать, имея данные датчика, с постоянной обратной связью. Это может даже привести к более точному управлению временем, например, включению насоса на 1 секунду за каждые 100 выше необходимого уровня влажности почвы, вместо фиксированных 5 секунд.
✅ Проведите исследование: Есть ли другие временные факторы, которые нужно учитывать? Можно ли поливать растение в любое время, когда уровень влажности почвы слишком низкий, или существуют определенные времена дня, которые подходят или не подходят для полива растений?
💁 Прогнозы погоды также могут быть учтены при управлении автоматизированными системами полива для выращивания на открытом воздухе. Если ожидается дождь, полив можно отложить до его окончания. После этого почва может быть достаточно влажной, чтобы не нуждаться в поливе, что гораздо эффективнее, чем тратить воду, поливая непосредственно перед дождем.
Добавьте управление временем в сервер управления растением
Код сервера можно модифицировать, чтобы добавить управление временем цикла полива и ожидание изменения уровня влажности почвы. Логика сервера для управления временем реле такова:
- Получено сообщение телеметрии
- Проверить уровень влажности почвы
- Если все в порядке, ничего не делать. Если показания слишком высоки (что означает, что уровень влажности почвы слишком низкий), то:
- Отправить команду для включения реле
- Подождать 5 секунд
- Отправить команду для выключения реле
- Подождать 20 секунд, чтобы уровень влажности почвы стабилизировался
Цикл полива, процесс от получения сообщения телеметрии до готовности снова обработать уровень влажности почвы, занимает около 25 секунд. Мы отправляем данные о влажности почвы каждые 10 секунд, поэтому существует перекрытие, когда сообщение получено, пока сервер ожидает стабилизации уровня влажности почвы, что может запустить еще один цикл полива.
Есть два варианта решения этой проблемы:
- Изменить код IoT-устройства, чтобы отправлять телеметрию только раз в минуту, таким образом цикл полива будет завершен до отправки следующего сообщения
- Отписаться от телеметрии во время цикла полива
Первый вариант не всегда подходит для больших ферм. Фермер может захотеть фиксировать уровни влажности почвы во время полива для последующего анализа, например, чтобы быть в курсе движения воды в разных областях фермы и направлять более целенаправленный полив. Второй вариант лучше — код просто игнорирует телеметрию, когда не может ее использовать, но телеметрия все равно доступна для других сервисов, которые могут подписаться на нее.
💁 Данные IoT не отправляются только от одного устройства к одному сервису, вместо этого множество устройств могут отправлять данные брокеру, а множество сервисов могут слушать данные от брокера. Например, один сервис может слушать данные о влажности почвы и сохранять их в базе данных для анализа позже. Другой сервис может также слушать ту же телеметрию для управления системой орошения.
Задача — добавьте управление временем в сервер управления растением
Обновите код сервера, чтобы реле работало 5 секунд, а затем ожидало 20 секунд.
-
Откройте папку
soil-moisture-sensor-server
в VS Code, если она еще не открыта. Убедитесь, что виртуальная среда активирована. -
Откройте файл
app.py
-
Добавьте следующий код в файл
app.py
ниже существующих импортов:import threading
Этот оператор импортирует
threading
из библиотек Python, что позволяет Python выполнять другой код во время ожидания. -
Добавьте следующий код перед функцией
handle_telemetry
, которая обрабатывает сообщения телеметрии, полученные кодом сервера:water_time = 5 wait_time = 20
Это определяет, как долго реле должно работать (
water_time
), и как долго ждать после этого, чтобы проверить уровень влажности (wait_time
). -
Ниже этого кода добавьте следующее:
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
, определяет, должно ли реле быть включено или выключено. -
После функции
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
секунд. Затем она снова подписывается на телеметрию. -
Измените функцию
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
. Эта функция выполняется в отдельном потоке, работающем в фоновом режиме. -
Убедитесь, что ваше 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. Несмотря на наши усилия по обеспечению точности, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.