ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ
Блог технической поддержки моих разработок
Программа контроллера гроубокса. Интерфейс пользователя.
Заключительная статья по разработке первого варианта контроллера для гроубокса. В ней – описание интерфейса пользователя, программы, подготовка среды Arduino IDE, результаты испытаний.
В предыдущей статье я обосновал выбор способа управления гроубоксом – Web-сервер или Web-сайт в собственной WiFi –сети контроллера. На корпусе устройства из элементов контроля и управления – только светодиод состояния.
Интерфейс пользователя.
Теперь подробно, как управлять гроубоксом.
Контроллер создает свою собственную WiFi-сеть, точку доступа. Через нее можно смотреть состояние и управлять гроубоксом через любое устройство, имеющее WiFi – смартфон, планшет, ноутбук.
В общем случае, заходите в настройки смартфона, находите сеть гроубокса (у меня Banan), и подключаетесь к ней.
Дальше есть 2 варианта реакции системы, которые могут быть выбраны в программе:
- Смартфон автоматически открывает основную страницу Web-сайта.
- Необходимо открыть браузер и набрать заданное доменное имя либо IP-адрес. Этот способ можно использовать, если не работает предыдущий, например, для ноутбуков, планшетов.
Это основное окно для управления и контроля состояния гроубокса.
Я не большой специалист в HTML-программировании. Поэтому реализовал самое простое оформление Web-страницы. Но получилось наглядно, понятно, удобно. Вряд ли кто-то будет собирать устройство для того, чтобы любоваться красивой картинкой на смартфоне.
Вся информация на экране обновляется каждые 2 секунды.
Первый абзац показывает текущее время. Оно хранится в энергонезависимых часах и не теряется при выключении питания. Установить его можно нажав соответствующую ссылку.
Операция завершается нажатием кнопки ”Отправить”.
Следующий абзац показывает состояние освещения и позволяет задать его параметры.
- Звездочки ” *** ” красного цвета означают, что освещение включено.
- Звездочки ”***” черного цвета показывают, что освещение отключено.
- В начале и конце строки показаны времена включения и выключения освещения.
По ссылке ”установить” открывается страница задания параметров освещения.
Полив происходит с максимальным циклом неделя. Абзац полива показывает:
- Дни недели, в которые надо поливать. Отмечены жирным шрифтом.
- Символы ”…..” означают, что в данный момент полив не происходит.
- Символы ” ’ ‘ ‘ ‘ ‘ ” означают, что в данный момент идет полив.
- Время перед символами состояния показывает начало полива.
- Время в конце строки – длительность полива.
Этот абзац, как пример, сообщает, что полив происходит по понедельникам, средам и субботам, в 8 часов вечера, в течение 1 минуты и 15 секунд.
Как задавать параметры полива догадаться не трудно.
Все параметры хранятся во FLASH микроконтроллера, защищены контрольными кодами и при выключении питания не теряются.
Остается рассказать о светодиоде состояния контроллера.
Программа раз в секунду считывает время часов, параметры из FLASH и осуществляет управление реле. Этот цикл является основным. В нем светодиод изменяет свое состояние, т.е. секунду светится, секунду погашен.
Это при нормальной работе устройства. Если в течение времени большем секунды программа не проходит через основной цикл, то светодиод состояния начинает мигать часто, примерно 3 раза в секунду.
Такое может случиться в случае, если ES88266 “отвлечется” на значительное время, например, при подключении к сети WiFi. Это не является ошибкой.
В случае, если программа перестанет проходить через основной цикл дольше 20 секунд, то сработает сторожевой таймер, который перезапустит всю систему.
Также светодиод частым миганием индицирует ошибку параметров (не соответствие контрольных кодов) и ошибку часов реального времени.
При ошибке параметров отключается управление, использующее соответствующие параметры. При ошибке часов, отключается и освещение, и полив.
Тоже самое о светодиоде состояния в более строгой форме.
- Мигает редко (секунду светится, секунду погашен) – нормальная работа.
- Мигает часто (3 раза в секунду) не дольше 20 секунд — ожидание завершения операций WiFi. Бывает редко. Тоже нормальная работа.
- Мигает часто (3 раза в секунду) дольше 20 секунд – ошибка.
- Неисправны часы реального времени – аппаратная ошибка.
- Неправильные параметры во FLASH. Исправляется переустановкой данных.
Подготовка Arduino IDE.
Мы будем разрабатывать программу, и загружать ее в контроллер в среде Ардуино. Необходимо выполнить минимальные действия для подготовки Arduino IDE.
Прежде всего, добавить поддержку нужных нам модулей.
В нижней строке окна Настройки указываем путь для менеджера плат:
Откройте менеджер плат: Инструменты -> Плата -> Менеджер плат.
И установите нужную плату.
Советуют устанавливать более старую версию библиотек поддержки платы.
С ней отсутствуют периодические проблемы при подключении к WiFi сети.
После загрузки в окне Инструменты -> Плата выбрать нужный модуль. У меня ESP-12E.
В предыдущей статье я привел 2 схемы для загрузки программы во FLASH модуля и описал последовательность действий для каждой из них. В остальном, работа в Arduino IDE с ESP-модулями не отличается от стандартных плат Ардуино.
Программное обеспечение контроллера гроубокса.
Программа состоит из 2х параллельно работающих частей: Web-сервера и блока управления.
- Организует TCP/IP соединение с клиентом.
- Формирует главную страницу, используя HTTP-протокол.
- Обрабатывает GET-запросы установки параметров.
- Формирует страницы установки параметров.
Сейчас объясню, что происходит и какие данные необходимо задать.
Созданы TCP/IP и DNS серверы.
WiFiServer server(80);
DNSServer dnsServer;
Параметры заданы в следующих строках.
const char* ssid = «Banan»; // имя сети устройства
const char* password = «12345678»; // пароль сети устройства
//const char* password = «»; // без пароля
const char* dnsName = «*»; // имя dns
IPAddress apIP(192, 168, 4, 1);
Вам необходимо заполнить их своими данными.
Если вы укажите в качестве имени dns ”*”, то это означает, что любое имя домена будет преобразовано в IP-адрес 192.168.4.1. При подключении к сети WiFi смартфонов, главное окно будет появляться автоматически.
На ноутбуке это может не сработать. Тогда необходимо явно ввести IP-адрес в адресной строке браузера: http://192.168.4.1.
Можно задать конкретное имя dns, например,
const char* dnsName = «b.ru»; // имя dns
В этом случае придется в браузере указывать адрес b.ru.
В основном цикле происходит ожидание подключения клиента. Как только клиент подключается, данные с него проверяются на соответствие HTTP-протоколу и выделяются запросы.
По первому HTTP-запросу клиенту передается главная страница и соединение разрывается.
В заголовке есть команда
client.println(F(«Refresh: 2»)); // обновить страницу автоматически
Она говорит клиенту-браузеру о том, что необходимо через 2 секунды повторить запрос главной страницы. Именно таким образом обеспечивается циклическая передача данных о состоянии контроллера.
Как только пользователь нажимает на ссылку, например ”Установить параметры освещения”, то формируется GET-запрос. Он задан в самой ссылке.
По этому запросу контроллер передает клиенту страницу задания параметров освещения.
На ней пользователь заполняет форму со стандартными HTML-объектами и посылает GET-запрос, в котором указаны параметры освещения.
Контроллер принимает его, устанавливает параметры и опять передает клиенту главную страницу.
В программном блоке управления каждую секунду:
- Считывается время из часов реального времени. Если часы остановились, то они перезапускаются.
- Считываются и проверяются на целостность технологические параметры из FLASH.
- Происходит управление сигналами включения освещения и полива в зависимости от текущего времени и заданных параметров.
Обработка ошибок и реализация сторожевого таймера ESP8266.
ESP8266 имеет свойство периодически, а иногда и навсегда зависать при обработке подключений по WiFi-сети. То ли недоработка внутреннего программного обеспечения, то ли недостаток ресурсов микроконтроллера.
Очевидно, для гроубокса, работающего в круглосуточном режиме это недопустимо.
Чтобы исключить такие ситуации я создал программный сторожевой таймер. В прерывании аппаратного таймера с периодом 50 мс контролируется время прохождения точки, в которой считывается время часов. При нормальной работе это время равно 1 секунде. При превышении его до 1,25 секунды, начинает часто мигать светодиод состояния, и сторожевой таймер отсчитывает время, заданное в строке:
#define WDT_TIME 400 // время сторожевого таймера (* 50 мс)
При превышении его (20 секунд), система перезапускается.
Если аппаратные компоненты вы подключили к другим контактам модуля, то необходимо отразить это в программе.
#define RTC_SCL 5 // часы (D1)
#define RTC_SDA 4 // часы (D2)
#define LIGHT_PIN 15 // реле освещения _-_ (D8)
#define WATER_PIN 13 // реле полива _-_ (D7)
#define LED_PIN 16 // светодиод (D0)
Загрузить итоговый скетч можно по ссылке.
Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!
У меня устройство работает в круглосуточном режиме уже 11е сутки. Все прекрасно, никаких проблем. Только, сегодня обнаружил, отражающая пленка вокруг гроубокса с бананом не сходится. А уже лезет новый лист, который по традиции будет на треть больше предыдущего.
Очень приятно, что мою разработку уже эксплуатируют на реальных объектах. Игорь из Минска повторил устройство и использует его в своей мини-теплице.
Более того, он стал движущей силой проекта, активно его испытывает, дорабатывает. В последующих статьях к контроллеру будут подключаться новые датчики, расширяться функциональные возможности.
В следующем проекте буду подключать к контроллеру датчик влажности почвы.
Источник
Гроубокс своими руками
Основная идея проекта — сделать автоматический гроубокс на Arduino, который мог бы вписаться в интерьер квартиры не потеряв функциональности.
Что гроубокс должен делать? Много чего.
Система должна следить за влажностью почвы автоматически включая полив. Должны быть гибкие настройки для задания влажности под конкретный тип растений.
Что бы создавать оптимальные условия для роста необходимо контролировать температуру. Я использовал датчик DHT11. Он уже имеет датчик температуры совмещенный с датчиком влажности.
Как всем известно, растения нуждаются в свете. Таким образом, я использовал свет LED теплого свечения для имитации дневного света (Если целью проекта создать экономную систему, то можно использовать сине-красные диоды для рассады. У них снижено энергопотребление за счет того, что они излучают свет только в спектре поглощаемом растениями.) Так же, имеется таймер для контроля время суток. (но можно обойтись фоторезистором)
RGB диод по центру горшка является индикатором условий. Если возникают определенные проблемы в работе — диод согласно программы меняет цвет:
Зеленый свет — Пустой бак для воды
Красный свет — Слишком жарко
Синий свет — Слишком холодно
Белый свет — все ОК
Здесь я постараюсь перечислить все детали:
2x DC в DC преобразователь 1,5а:
1x DC в DC преобразователь 5A:
1x Таймер:
1x Arduino UNO:
1x DHT11:
6х 1w LED:
3x TIP120 транзистор:
2x 5v реле:
2x красный светодиод:
1x 12v автомобильный насос:
1x датчик уровня воды
1x Пластиковое ведро:
3x Диоды:
1x 12v 2A Блок питания:
1x ESP8266:
1x Датчик влажности:
В первую очередь я выпилил две доски длиной 40 см с торцевым скосом под углом 45 градусов. Это будет задняя и передняя панели. После этого я вырезал два квадрата со сторонами 24 см с такими же скосами Это будут боковины. Если их сложить вместе должен получиться ящик.
Что бы отделить почву от электроники было сделано двойное дно. Для того, чтобы собрать ящик я использовал клей для дерева и винты. В углы вклеил бруски, которые добавляют прочности всей конструкции.
Перед покраской просверливаем отверстия под диод-индикатор, для подачи питания и крепления светильника.
Отверстие индикатора закрываю полу-прозрачным оргстеклом. Окраску я провел темно-коричневым рояльным лаком.
На этом этапе будем делать стальную раму для светильника.
Это будет как крыша над ящиком. В основе пластина с размерами 24 см х 40 см и толщиной 3 мм. Вокруг пластины я сделал бордюр шириной 2 см. Он направляет свет строго вниз и скрывает провода.
Что бы закрепить светильник пришлось изготовить ножку из 3 см квадратной стали из кусков по 45 см и 15 см. Они сварены вместе с углом 90 градусов. Затем к ним был приварен сам светильник.
Провода протянул через этот квадратный профиль. Внизу были приварены два винта M8 по 4 см.
Электросхема по которой все собиралось:
Я подключил три понижающего преобразователей. Два LM317 для питания Arduino и насос. Они держут максимальный ток 1.5A. Для диодов подсветки я использовал отдельный преобразователь DC к DC с током до 5А.
Для питания всего проекта я просто использовал источник питания 12v 2A.
Для освещения я использовал шесть мощных диодов. Они были приклеены с обратной стороны металлической лампы. Управляются включением Arduino через полевой транзистор TIP120.
Для измерения влаги в почве, я использовал датчик влажности. Подключается тримя проводами, сигнал выдает цифровой. Датчик мы расположим в грунте и по тому его видно не будет.
Для контроля влажности и температуры я использовал DHT11. С помощью двухстороннего скотча он был приклеен к лампе так, что бы его не было видно.
Насос использую автомобильный. Он работает от 12 вольт. Насос стоит на дне резервуара, и закреплен с горячим клеем. Управляется он так же как и свет — Arduino через полевой транзистор TIP120. Что бы уменьшить его мощность — подключил к питанию от 6 вольт вместо 12.
Для того, чтобы отслеживать уровень воды в баке я использовал датчик уровня. Он приклеивается на верхней части насоса и срабатывает достаточно рано, так что насос не успевает нагнетать воздух. Датчик представляет собой простой выключатель который подключен к любому порту arduino через резистор 10 k.
В планах подключить к системе esp8266 для уведомления о состоянии системы через интернет.
Швы ящика были загерметизированы силиконом. На дно была уложена целофанавая пленка и датчик влажности.
Я очень доволен своим проектом. Цель была достигнута — я сделал что-то на Arduino и получил очень симпатичный Гроубокс, который не стыдно поставить дома.
Источник