Разрабатываем крутой gui на esp8266 с библиотекой ugfx

NodeMCU-Tool¶

Arguably NodeMCU-Tool, which requires Node.js, is the better code upload & execution tool than ESPlorer. Also, in contrast to the former it is very well maintained. However, we also understand that Windows users in general prefer GUI over command line.

The is quite long but essentially NodeMCU-Tool offers:

  • upload (Lua) files from your host system to the device
  • manage the device file system (delete, up-/download, etc.)
  • run files on NodeMCU and display the output over UART/serial

Quick start:

  1. Install Node.js and NPM if not available yet
  2. Install NodeMCU-Tool globally
  3. Verify installation by runnin
  4. Upload a Lua file
  5. Run it

Note that you may need to use the prefix to install the tool at step 2, and also possibly add the flag after the install command.

Аппаратная часть

В качестве контроллера было решено использовать дешевый и популярный ESP8266. Он отлично подходил для моих целей, кроме одного момента: согласования уровней сигналов 5-вольтовых датчиков с 3.3 вольтовой логикой контроллера. В принципе, датчики Dallas вроде бы работают и на 3 вольтах, но у меня от контроллера до датчиков достаточно длинная линия, около 7 метров. Поэтому лучше напряжение повыше.

Было определено, что необходимо иметь по «железу»:

  • Контроллер ESP8266 или его старший брат ESP32 (в виде модуля DevKit).
  • Согласование уровней сигналов для датчиков.
  • Регулятор питания 5-вольтовой частью схемы.
  • Модуль управления реле.
  • Часы RTC + флеш память для записи логов.
  • Простейший 2-строчный LCD дисплей для отображения текущих значений датчиков и состояния прибора и реле.
  • Несколько физических кнопок, для управления состоянием устройства без доступа через web.

Многие компоненты из списка продаются в виде модулей для Arduino и многие модули совместимы с логикой 3.3в. Однако «слепливать» все это на макетной плате пучками проводов не хотелось, ведь хочется иметь аккуратный красивый «девайс». Да и за деньги, отданные китайцам за модули можно вполне нарисовать и заказать свою индивидуальную печатную плату, а ожидание её приезда будет компенсировано сравнительно быстрым и надежным монтажом.

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

Sending a message

boolean send(char channel, char * message) sends a message — alias for send(char channel, char * message, true)

  • channel Set to SERVER if you want to send to server. If we are the server, the value can be between ‘1’-‘3’
  • message a character array, max 25 characters long.
  • return true if the message was sent
  • Example:

boolean send(char channel, char * message, boolean sendNow) sends or queues a message for later sending

  • channel Set to SERVER if you want to send to server. If we are the server, the value can be between ‘1’-‘3’
  • message a character array, max 25 characters long.
  • sendNow if false, the message is appended to a buffer, if true the message is sent right away
  • return true if the message was sent
  • Example:

endSendWithNewline(bool endSendWithNewline) by default all messages are sent with newline and carrage return (println), you can disable this

  • endSendWithNewline sent messages with print instead of println
  • Example:

net.socket:on()¶

Register callback functions for specific events.

Parameters

  • string, which can be «connection», «reconnection», «disconnection», «receive» or «sent»
  • callback function. Can be to remove callback.

The first parameter of callback is the socket.

  • If event is «receive», the second parameter is the received data as string.
  • If event is «disconnection» or «reconnection», the second parameter is error code.

If reconnection event is specified, disconnection receives only «normal close» events.

Otherwise, all connection errors (with normal close) passed to disconnection event.

Example

Note

The event is fired for every network frame! Hence, if the data sent to the device exceeds 1460 bytes (derived from Ethernet frame size) it will fire more than once. There may be other situations where incoming data is split across multiple frames (e.g. HTTP POST with ). You need to manually buffer the data and find means to determine if all data was received.

В чём прошивается?

Существует несколько софтов для прошивки МК. Например NodeMCU Flasher (которая подходит не только для плат NodeMCU) или ESPTool (необходим Python).

Однако в этой статье работа с МК и процесс прошивки будут рассмотрены в Arduino IDE.

Изначально среда Arduino IDE не предназначена для работы с МК серии ESP. Чтобы это исправить, идём в Файл → Настройки и в поле Дополнительные ссылки для Менеджера плат вставляем эту ссылку:

Потом открываем Инструменты → Плата → Менеджер плат и в открывшемся списке в самом низу находим плату «esp8266 by ESP8266 Community» (если с этим возникли трудности — используем поиск вверху окна). Устанавливаем последнюю версию платы (около 150 Мбайт).

После установки в списке плат появится немалое количество плат. Если не нашли свою плату или не знаете её названия — выбирайте Generic ESP8266 Module. Теперь можно выбрать свой МК в списке COM-портов.

Теперь что касается скорости передачи. У ESP8266 две скорости передачи: основная — её вы указываете при инициализации последовательного порта, и скорость, на которой передаётся отладочная информация. Она передаётся сразу после подачи питания на МК. Обычно это скорости 115200 бод и 74800 бод 0 соответственно.

Начало работы с Termite

В оригинальной статье о прошивке ESP8266 была рекомендована PuTTY; и, если она у вас она есть, и вы хотите её использовать, она здесь будет отлично работать. Тем не менее, Termite в этом плане более удобное приложение и будет использоваться далее в этой статье. Termite бесплатен и для личного, и для коммерческого использования.

В последующих этапах предполагается, что модуль ESP-01 запрограммирован так же, как обычно, поставщиком. Если вы (или кто-то еще) внесли изменения в стандартные настройки программы, вам необходимо будет поэкспериментировать, чтобы определить текущие настройки вашего модуля ESP-01.

После проверки своей схемы программирования ESP-01, как описано выше, включите её. Запустите на своем компьютере Termite и нажмите кнопку Settings (Настройки); вы должны увидеть окно, похожее на приведенное ниже. Убедитесь, что COM порт, к которому подключен USB-TTL конвертер, правильно выбран в окне настроек последовательного порта. Выставьте все остальные параметры, как показано в окне настроек последовательного порта ниже, и нажмите OK, чтобы закрыть окно настроек последовательного порта.

Настройки последовательного порта

На этом этапе курсор должен мигать в нижней части окна Termite; если нет, кликните на нижней части окна Termite, чтобы поместить туда курсор. Введите и нажмите Enter на клавиатуре; если всё хорошо, ESP-01 ответит в окне Termite. Если это произойдет, можете вздохнуть с облегчением, потому что вы только что преодолели главное препятствие.

Затем введите и нажмите Enter. ESP-01 должен ответить чем-то очень похожим, что показано на рисунке ниже.

Отклик модуля ESP-01

Команда говорит ESP8266 сообщить о версии набора AT-команд, который он содержит, какой SDK (Software Development Kit) был загружен в него, какая компания собрала модуль ESP, и когда SDK был загружен в модуль. Наконец, как обычно, ESP8266 завершает свой ответ с помощью .

Если ESP-01 ответил правильно, то можно закончить с Termite (если вы не хотите еще поэкспериментировать). Далее он понадобится снова для подтверждения успешной прошивки.

Разновидности МК серии ESP и их плат

Существует около полутора десятка версий МК серии ESP и огромное количество плат с ними. Рассмотрим самые популярные из них.

Микроконтроллеры

ESP-01

Микроконтроллер ESP-01. Источник

Считается самым популярным из серии. Имеет 8 разведённых контактов (VCC, GND, UTXD, URXD, CH_PD, GPIO0, GPIO2, GPIO6) и PCB-антенну (печатный проводник на самой плате). Из разведённых выводов тут присутствуют только 3 GPIO, но не стоит видеть в этом одни минусы. Если нужно будет управлять одним реле или получать данные с датчика температуры, вам не понадобятся все выводы МК, достаточно будет лишь пары. К тому же, существуют платы и шилды с возможностью простой коммутации именно к этой версии МК. Например такая:

Плата WiFi-реле. Источник

ESP-07

Плата ESP-07. Источник

В этой версии в глаза сразу бросается металлический экран (который перед этим появляется на ESP-06). На борту керамическая антенна и разъём для внешней антенны.

ESP-12

Разные варианты микроконтроллера ESP-12. Источник

В свою очередь, существует несколько вариантов этой версии: ESP-12S, ESP-12F, ESP-12E. Вторая и третья версии имеют на торце дополнительно 6 разведённых контактов.

Платы

WeMos D1 mini

Плата WeMos D1 mini. Источник

Имеет распайку девяти GPIO-контактов. На плате имеется небезызвестный мост CH34x (такие часто ставят на клоны Arduino). Установлен МК с 4 Мбайт flash-памяти. Недостаток для некоторых — придётся самому паять контакты на плату (идут в комплекте). Конструкционно совместима с различными выпускаемыми шилдами реле/датчиками.

NodeMCU v0.9/v1

Плата NodeMCU v0.9. Источник

Первое поколение плат серии NodeMCU. На ней распаяны все 11 GPIO-портов. Некоторые из них обладают дополнительными функциями (UART, I2C, SPI, PWM, ADC). Хотя на плате впаяны контакты, она занимает всю ширину беспаечной макетной платы, что затрудняет работу на ней. МК имеет 4 Мбайт flash-памяти. Также имеется мост CH340.

NodeMCU v3

Плата NodeMCU v3. Источник

Финальная версия платы этой серии. Существует и v2 «Amica», которая меньше по габаритам. v3 носит название «LoLin» и отличается от предыдущей версии только размерами и незначительными деталями (например дополнительной распайкой шины питания). Кроме традиционного моста CH340/CH341 на платы ставят чип CP2102, так что внимательней с выбором драйвера на них.

Логгирование данных от датчиков и о состоянии прибора

При разработке механизма логгирования основополагающим стал тот факт, что устройство может быть внезапно выключено, т.е. практически в любой момент. При прекращении записи, мы должны уметь восстановить все записанное до самого последнего момента. В то же время нам нельзя постоянно перезаписывать одну и туже область флеш-памяти (например, некий заголовок в определенном месте, запоминая там адрес, куда в последний раз шла запись), во избежание ускоренного «протирания» флешки в этом месте.

После некоторого «кумекания» была придумана и реализована следующая модель записи:

Каждый record представляет собой запись, содержащую информацию о текущем значении потока воды, температурах датчиков, а также закодированного в байте состояния устройства (отдельные биты обозначают, включено реле или нет, разрешен ли подогрев или нет):

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

Поскольку было бы слишком накладно по объему записывать данные о текущем времени (timestamp) для каждой записи, то данные организуются в большие блоки, по N записей в каждом. Timestamp для каждого блока записывается только один раз, для остальных – вычисляется на основе информации о периодичности логгирования.

Например, при периодичности логгирования раз в 30 секунд, мы будем иметь 120 записей в блоке, а размер блока будет равен около 840 байт. Всего у нас поместиться 39 блоков в памяти флешки размером в 32 килобайта. При такой организации получается, что каждый блок начинается по строго определенному адресу в памяти, и «пробежать» по всем блокам – не проблема.

Соответственно, при внезапном обрыве записи при прошлом выключении устройства, мы будем иметь недописанный блок (т.е. в котором отсутствует часть записей). При включении устройства, алгоритм ищет последний по времени валидный заголовок блока (timestamp+crc). И продолжает запись, начиная со следующего блока. Запись осуществляется циклически: самый свежий блок перезатирает данные самого старого блока.

При чтении идет последовательное чтение всех блоков. Невалидные блоки (те, у которых не проходит проверка CRC для timestamp) игнорируются целиком. Записи в каждом блоке читаются до момента встречи первой невалидной записи (т.е. той, на которой оборвалась запись в прошлый раз, если блок не был записан целиком). Остальные игнорируются.
Для каждой записи вычисляется актуальное для неё время, основанное на timestamp блока и порядковом номере записи в блоке.

node.flashindex()¶

Returns the function reference for a function in the LFS (Lua Flash Store).

Returns

  • In the case where the LFS in not loaded, evaluates to , followed by the flash mapped base addresss of the LFS, its flash offset, and the size of the LFS.
  • If the LFS is loaded and the function is called with the name of a valid module in the LFS, then the function is returned in the same way the and the other Lua load functions do.
  • Otherwise an extended info list is returned: the Unix time of the LFS build, the flash and mapped base addresses of the LFS and its current length, and an array of the valid module names in the LFS.

Example

The is a low level API call that is normally wrapped using standard Lua code to present a simpler application API. See the module in the directory for an example of how to do this.

Схема прошивки

Улучшенная схема прошивки для модуля ESP-01 показана на следующей принципиальной схеме; в первоначальный дизайн было внесено несколько изменений:

  1. постоянное напряжение питания 3,3 В больше не снимается с преобразователя USB-TTL. Некоторые преобразователи не обеспечивают достаточный ток для надлежащей работы ESP8266, особенно когда он находится в режиме передачи Wi-Fi. Следует использовать отдельный, хорошо фильтруемый и стабилизированный источник питания 3,3 В постоянного напряжения, способный обеспечивать ток не менее 500 мА;
  2. конденсаторы C1 и C2 были добавлены для снижения уровня шума на шине питания. Они должны располагаться как можно ближе к выводам Gnd и Vcc ESP8266;
  3. R2 и R3 – это подтягивающие резисторы, которые были добавлены для того, чтобы выводы GPIO2 и GPIO0 ESP8266 никогда не «висели в воздухе».

Эти изменения не говорят, что исходная схема прошивки не работала; дело в том, что она действительно работала у автора статьи и многих других пользователей. Однако ее недостатки были такими, что схема могла и не работать у некоторых пользователей, по крайней мере, иногда. Эти сбои могут быть вызваны различными внешними факторами, качеством источника питания и допусками компонентов. Улучшенная схема должна устранить эти недостатки.

Схема программатора ESP8266

Улучшенная схема прошивки показана собранной на макетной плате на следующих фотографиях. Первая фотография показывает всю схему со вставленным модулем ESP-01; вторая фотография показывает схему без модуля ESP-01, чтобы показать места установки C2, R2 и R3

Обратите внимание, что цвета проводов на схеме соответствую обозначениям цветов на принципиальной схеме

Программатор, собранный на макетной плате, с установленным модулем ESP-01

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

Печатная плата в левом верхнем углу макета – это преобразователь USB-TTL. Как вы видите, он вставлен непосредственно в макетную плату с помощью 6-пинового разъема Dupont, который установлен на нижней стороне платы. Вы можете модифицировать свой USB-TTL конвертер для установки именно таким же способом, или вы можете использовать для соединений отдельные провода. Что бы вы ни выбрали, обязательно следуйте схеме при соединении выводов

Обратите внимание, что требуются только три линии: RxD от преобразователя до TxD на ESP-01, TxD от преобразователя до RxD на ESP-01, и общий корпус

Несмотря на то, что преобразователь USB-TTL не используется для питания ESP-01, убедитесь, что преобразователь настрое на работу с постоянным напряжение 3,3 В, чтобы уровний напряжений сигналов не превышали допустимые значения ESP8266. Любое напряжение выше 3,3 В, поданное на ESP8266, может привести к его повреждению.

Программатор, собранный на макетной плате, с изъятым модулем ESP-01

На фотографии, приведенной выше, модуль ESP-01 был изъят из макета, чтобы показать самодельный адаптер для ESP-01. На фотографии ниже слева показан почти такой же адаптер, а справа – адаптер от Addicore. Они работают одинаково и облегчают использование модуля ESP-01 на беспаечной макетной плате или любом подобном устройстве с разъемами с шагом 0,1 дюйма (2,54 мм).

Адаптеры для подключения ESP-01 к беспаечной макетной плате

Как только вы завершите сборку своего программатора, настанет время для тестирования. Но перед подключением USB кабеля или подачей питания перепроверьте разводку, особенно линии питания. Лучше потратить несколько дополнительных минут, чем повредить что-либо из-за неправильной разводки.

Сначала подключите USB кабель от компьютера к конвертеру USB-TTL. Положительным признаком является загорание красного светодиода в углу печатной платы, близкому к разъему USB, и распопознавание USB конвертера компьютером

На этом этапе обратите внимание на то, какой номер COM порта был назначен конвертеру. Как вы можете видеть на фотографиях, у меня преобразователю был назначен COM4

Затем подайте на программатор питание 3,3 В постоянного напряжения. Вы должны увидеть пару вспышек синего светодиода на модуле ESP-01, а красный светодиод на модуле должен гореть постоянно.

Теперь нажмите и отпустите SW1 (кнопка сброса); синий светодиод должен замигать. Затем нажмите и отпустите SW2 (кнопка программирования); не должно произойти ничего заметного.

Если всё идет по плану, ваша схема прошивки, вероятно, работает правильно. Настало время выполнить окончательную проверку: ответит ли ESP8266, когда вы обратитесь к нему?

Timer Object Methods¶

tobj:alarm()

This is a convenience function combining and into a single call.

To free up the resources with this timer when done using it, call on it. For one-shot timers this is not necessary, unless they were stopped before they expired.

  • timer interval in milliseconds. Maximum value is 6870947 (1:54:30.947).
  • timer mode:

    • a one-shot alarm (and no need to call )
    • manually repeating alarm (call to restart)
    • automatically repeating alarm
  • callback function which is invoked with the timer object as an argument

if the timer was started, on error

tobj:interval()

Changes a registered timer’s expiry interval.

interval_ms new timer interval in milliseconds. Maximum value is 6870947 (1:54:30.947).

tobj:register()

Configures a timer and registers the callback function to call on expiry.

To free up the resources with this timer when done using it, call on it. For one-shot timers this is not necessary, unless they were stopped before they expired.

  • timer interval in milliseconds. Maximum value is 6870947 (1:54:30.947).
  • timer mode:

    • a one-shot alarm (and no need to call )
    • manually repeating alarm (call to restart)
    • automatically repeating alarm
  • callback function which is invoked with the timer object as an argument

Note that registering does not start the alarm.

tobj:start()

Starts or restarts a previously configured timer.

if the timer was started, on error

tobj:state()

Checks the state of a timer.

(bool, int) or

If the specified timer is registered, returns whether it is currently started and its mode. If the timer is not registered, is returned.

tobj:stop()

Stops a running timer, but does not unregister it. A stopped timer can be restarted with .

if the timer was stopped, on error

tobj:unregister()

Stops the timer (if running) and unregisters the associated callback.

This isn’t necessary for one-shot timers (), as those automatically unregister themselves when fired.

Прошивка

Скорее всего, в первоначальной прошивке чего-то будет не хватать, поэтому в идеале нужно прошить устройство самостоятельно. Собрать образ Firmware можно несколькими способами: с помощью облачного сервиса, образа Docker’а или используя .

Я собирал с помощью облачного сервиса, что и всем советую.

Если нужно отправить данные в облако, то понадобится выбрать SNTP, MQTT, HTTP (Wi-Fi, timer, file, GPIO, net, node, UART уже выбраны по умолчанию). Также следует пометить в качестве необходимого TLS/SSL support в пункте Miscellaneous options. Ссылка с bin-файлом приходит на почту. Точнее сказать, приходят даже сразу две ссылки. Одна с образом, поддерживающим операции с плавающей запятой, и вторая с не поддерживающим.

Перед прошивкой ESP8266 необходимо привести в особый режим. На плате имеется отдельная кнопка FLASH. Ее нажатие во время включения питания или нажатия reset переводит девайс в режим bootloader. Если вдруг в твоей модификации платы такой кнопки нет, то перед прошивкой нужно соединить GPIO0 с GND и нажать reset (этот способ подходит для ESP-12). Прошить Firmware можно утилитой PyFlasher. Py в названии означает, что приложение написано на Python. Есть еще nodemcu-flasher, но она давно уже не обновлялась. Ее я не пробовал.

Окно PyFlasher выглядит так:

PyFlasher

Flash mode выбирается в зависимости от того, какая у нас плата. Большинству современных плат на базе модулей ESP8266 ESP-12 и ESP32 подходит режим DIO, ESP8266 от 01 до 07 — более быстрый режим QIO. DOUT используется ESP8285.

Режимы работы ESP8266

Одна из важнейших функций, которую обеспечивает ESP8266, заключается в том, что он может не только подключаться к существующей Wi-Fi сети и работать в качестве веб-сервера, но он также может устанавливать собственную сеть, позволяя другим устройствам подключаться непосредственно к нему и получать доступ к веб-страницам. Это возможно, потому что ESP8266 может работать в трех разных режимах: режим станции, режим точки доступа и оба первых режима одновременно. Это обеспечивает возможность построения ячеистых сетей.

Режим станции (STA)

ESP8266, который подключается к существующей сети W-iFi (созданной вашим беспроводным маршрутизатором), называется станцией (Station, STA).

Рисунок 2 – Демонстрация режима Station ESP8266 NodeMCU

В режиме STA ESP8266 получает IP адрес от беспроводного маршрутизатора, к которому подключен. С этим IP адресом он может настроить веб-сервер и выдавать веб-страницы на все подключенные к существующей Wi-Fi сети устройства.

Режим точки доступа (AP)

ESP8266, который создает свою собственную сеть Wi-Fi и действует как концентратор (точно так же как маршрутизатор Wi-Fi) для одной или нескольких станций, называется точкой доступа (Access Point, AP). В отличие от Wi-Fi роутера, он не имеет интерфейса к проводной сети. Такой режим работы называется Soft Access Point (soft-AP). Максимальное количество станций, которые могут к нему подключиться, ограничено пятью.

Рисунок 3 – Демонстрация режима Soft Access Point ESP8266 NodeMCU

В режиме AP ESP8266 создает новую сеть Wi-Fi и устанавливает для нее SSID (имя сети) и присваивает себе IP адрес. По запросу на этот IP адрес он может выдавать веб-страницы всем подключенным к этой сети устройствам.

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

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

Adblock
detector