Программа контроллера гроубокса. Интерфейс пользователя.

Гроубокс

Заключительная статья по разработке первого варианта контроллера для гроубокса. В ней – описание интерфейса пользователя, программы, подготовка среды Arduino IDE, результаты испытаний.

Предыдущая статья     Список статей     Следующая статья

В предыдущей статье я обосновал выбор способа управления гроубоксом – Web-сервер или Web-сайт в собственной WiFi –сети контроллера. На корпусе устройства из элементов контроля и управления – только светодиод состояния.

 

Интерфейс пользователя.

Теперь подробно, как управлять гроубоксом.

Контроллер создает свою собственную WiFi-сеть, точку доступа. Через нее можно смотреть состояние и управлять гроубоксом через любое устройство, имеющее WiFi – смартфон, планшет, ноутбук.

В общем случае, заходите в настройки смартфона, находите сеть гроубокса (у меня Banan), и подключаетесь к ней.

Окно подключения WiFi

Дальше есть 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.

Прежде всего, добавить поддержку нужных нам модулей.

В нижней строке окна Настройки указываем путь для менеджера плат:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Окно Настройки

Откройте менеджер плат: Инструменты -> Плата -> Менеджер плат.

И установите нужную плату.

Окно менеджер плат

Советуют устанавливать более старую версию библиотек поддержки платы.

БиблиотекаС ней отсутствуют периодические проблемы при подключении к WiFi сети.

После загрузки в окне Инструменты -> Плата выбрать нужный модуль. У меня ESP-12E.

Окно Инструменты

В предыдущей статье я привел 2 схемы для загрузки программы во FLASH модуля и описал последовательность действий для каждой из них. В остальном, работа в Arduino IDE с ESP-модулями не отличается от стандартных плат Ардуино.

 

Программное обеспечение контроллера гроубокса.

Программа состоит из 2х параллельно работающих частей: Web-сервера и блока управления.

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-запрос. Он задан в самой ссылке.

<a href=\"/set/light\">

По этому запросу контроллер передает клиенту страницу задания параметров освещения.

На ней пользователь заполняет форму со стандартными 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е сутки. Все прекрасно, никаких проблем. Только, сегодня обнаружил, отражающая пленка вокруг гроубокса с бананом не сходится. А уже лезет новый лист, который по традиции будет на треть больше предыдущего.

Очень приятно, что мою разработку уже эксплуатируют на реальных объектах. Игорь из Минска повторил устройство и использует его в своей мини-теплице.

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

 

Дополнение по поводу зависания ESP8266.

Этот параграф пишу в октябре 2021 года на основе данных длительной эксплуатации устройства.

Как я писал выше, ESP8266 может зависать при подключении к сети.

У меня такое бывает. Когда я подключаюсь к WiFi-сети гроубокса, иногда система подвисает на время 10-20 секунд, ни на что не реагирует, светодиод состояния часто мигает, индицируя ошибку. Но через указанное время система обязательно восстанавливается. За почти год эксплуатации гроубокса ни разу не приходилось выключать питание для сброса микроконтроллера.

Но Игорь из Минска нашел решение, позволяющее исправить эту проблему. У него контроллер перестал зависать после установки более старой версии библиотеки. Вот его скрины.

Скрин

Скрин

Скрин

У него стабильно работает именно с этой версией библиотеки.

 

 

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

 

Предыдущая статья     Список статей     Следующая статья

0

Автор публикации

не в сети 30 минут

Эдуард

280
Комментарии: 1936Публикации: 197Регистрация: 13-12-2015

7 комментариев на «Программа контроллера гроубокса. Интерфейс пользователя.»

  1. Для вентиляторов вырезаем на глаз 4 полоски к крепим их к вентилятору. Один вентилятор устанавливаем в верхней части каркаса таким образом, чтобы он выдувал воздух из гроубокса. К фитолампе необходимо прикрепить 4 уголка, по 2 с двух сторон, НО таким образом, чтобы при установки фитолампы в корпус, отверстия в лампе были за пределами корпуса. Иначе лампа будет греться и выйдет из строя.

    0
  2. Мне кажется всё же должна быть какая-то аутентификация при подключении к сети гроубокса, а то любой сосед сможет обнаружить Вашу сеть и «потыкать кнопочки». Для реального проекта это тоже важно.

    0
  3. Эдуард, здравствуйте. Зачитывался вашими уроками по Arduino и вот теперь esp8266- ура!
    Вопрос. Из уроков по Arduino я понял что вы все свои программы строите при помощи аппаратного таймера. Вы тех уроках вы организовывали его при помощи библиотеки MsTimer2. Она работает на esp8266? Если нет — то как вы работаете с аппаратным таймером? И вообще есть ли он?

    0
    • Здравствуйте!
      Нет, MsTimer2 на ESP8266 не работает.
      Аппаратный таймер есть. Конфигурация его устанавливается в строках
      timer1_attachInterrupt(timerISR);
      timer1_write(15625); // 50000 мкс
      timer1_enable(TIM_DIV256, TIM_EDGE, TIM_LOOP);
      Частота 20 Гц получается: 80 мГц (частота тактирования) / 256 (предделитель) / 15626 (делитель). Или период 50 мс = 0,0125 мкс * 256 * 15625.
      Прерывание обрабатывается функцией
      void ICACHE_RAM_ATTR timerISR() { …
      С ESP8266 работать уже не хочется. ESP32 вытесняет его практически при той же цене.
      Я планирую в ближайшее время выложить на сайт крупный проект, в котором используется ESP32.

      0
      • Я планирую в ближайшее время выложить на сайт крупный проект, в котором используется ESP32 — это было бы великолепно! Подскажите плиз — когда можно ожидать это?

        0
        • Здравствуйте!
          Скорее всего, я имел в виду проект TinyOneWireNet. Сейчас на очереди как раз модуль с ESP32. Он реализован. Но хочется выложить его в конструктивно законченом варианте. А в Китае перестали изготавливать платы для России. Я сейчас ищу варианты.

          0
  4. И еще, Эдуард. Не могли бы вы сделать обзор esp8266 в вашем фирменном стиле, как вы умеете. Да ,я понимаю что вы дали ссылку на документацию, но в вашем исполнении это выглядит гораздо понятнее. И если решитесь такое написать , то сделайте плиз упор на «перенос» программ с arduino на esp8266 — как это сделать и на что обратить внимание.

    0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".