Вопрос Передача данных с помощью ESP-12E между датчиком и модулем управления
Имеется модуль управления (ДЭЛ-140) и датчик нагрузки (ДН130). Они связаны проводом — интерфейс связи RS485, а протокол передачи информации ModBus. Также имеются 2 модуля ESP-12E (ESP8266 Nodemcu) и 2 трансивера MAX485. Можно ли связать модуль управления и датчик по Wi-Fi с помощью еспшек? Если возможно, есть ли похожие примеры?
pvvx
Активный участник сообщества
Если возможно, есть ли похожие примеры?
Karsh
New member
К несчастью, в моём случае используется Modbus ASCII. Можно ли переделать ваш проект под ASCII или прошивку надо будет писать с нуля?
pvvx
Активный участник сообщества
К несчастью, в моём случае используется Modbus ASCII. Можно ли переделать ваш проект под ASCII или прошивку надо будет писать с нуля?
Для Modbus ASCII моя прошивка ModbusTCP не годится. Может возможно приспособить прошивку TCP2UART (попробовать), но желательно взять что-то проще и написать самому. Тут всё зависит хотите ли вы поддерживать стандарты или достаточно поддержки только каких-то частей для стыковки с уже имеющимся внешним ПО.
Karsh
New member
Для Modbus ASCII моя прошивка ModbusTCP не годится. Может возможно приспособить прошивку TCP2UART (попробовать), но желательно взять что-то проще и написать самому. Тут всё зависит хотите ли вы поддерживать стандарты или достаточно поддержки только каких-то частей для стыковки с уже имеющимся внешним ПО.
Поскольку я новичок в этом деле, можете посоветовать с чего начать изучение/написание прошивки? Или может на ардуино будет проще написать,например, на базе такой прошивки?
Занимательная электроника

Подключаем модуль ESP8266 к платам Arduino Nano, STM32f103, PSoC, TMS320, Atmega8 и PIC передаем данные по WiFi.
Страница на этапе разработки
В данном уроке мы с Вами соединим модуль ESP8266 с другими микроконтроллерами, что даст нам возможность передавать данные с любого микроконтроллера в облако. Работать мы будем с платой ESP-12:

Прошивать ее будем готовым программатором:

Единственный нюанс, необходимо проверить, есть ли в данном программаторе переход в режим программирования, если нету — Вам нужно будет самим либо вручную либо через добавленную кнопку замыкать контакт GND и GPIO0.
Так как данная плата имеет ножки UART, данные между контроллерами будем передавать именно по UART. Для этого нам нужно будет настроить в каждом микроконтроллере UART на прием и на выдачу данных.
Сначала настроим наш ESP8266 модуль на работу с WiFi и прием/передача данных по UART.
У нас уже были уроки по настройке WiFi соединения, и работе UART, по этому возьмем уже готовый код и протестируем его на соответствие, при необходимости скорректируем.
Двусторонняя передача данных между ESP8266

В данном руководстве мы рассмотрим организацию двусторонней передачи данных между двумя платами ESP8266 с помощью протокола ESP-NOW. Рассмотрим работу нашего проекта на примере обмена данными с датчика влажности и температуры (DHT).

У нас также есть и другие руководства по ESP8266:
- Протокол ESP-NOW и ESP8266: Получение данных с нескольких плат (one-slave-multi-master);
- ESP-NOW на ESP8266: отправка данных по схеме “one-master-multi-slave”;
Что такое ESP-NOW?
ESP-NOW – это протокол беспроводной связи от Espressif для обмена небольшими пакетами данных. Он позволяет нескольким устройствам взаимодействовать друг с другом без подключения к Wi-Fi.
Скорость обмена данными достаточно высокая, однако размер пакета ограничен 250 байтами, кроме того, протокол делает возможным как односторонний, так и двусторонний обмен данными. Последнее мы и рассмотрим в данном руководстве.

Обзор проекта

В данном проекте используется две платы ESP8266, к каждой и которых подключен датчик влажности и температуры. Каждая плата снимает показания с соответствующих датчиков и отправляет их другой плате по протоколу ESP-NOW.
Получив данные, плата выводит их в монитор порта (хотя можно и подключить OLED-дисплей для визуализации). При отправке сообщения реализуется callback-функция, которая отображает статус отправки. Также для организации взаимодействия нам потребуются MAC-адреса плат.
В примере мы используем две платы, однако, вы можете подключить и больше.
Что нужно для проекта?
Перед началом работы убедитесь, что в среде Arduino установлена плата ESP8266. Также нам потребуется установить библиотеки для датчиков DHT.
Установка требуемых библиотек
Мы используем библиотеку Adafruit для работы с датчиками влажности и температуры. Однако, для работы с ней требуется также установить библиотеку Adafruit Unified Sensor. Для их установки выполните следующие действия:
- Откройте менеджер библиотек (Скетч>Подключить библиотеку…>Менеджер библиотек);
- Найдите «DHT» и установите данную библиотеку:

- После установки введите в поле поиска «AdafruitUnifiedSensor», пролистайте до самого низа и установите библиотеку:

После установки требуется перезагрузка среды Arduino.
Требуемые компоненты
Для проекта потребуются следующие детали:
-
- 2 платы ESP8266;
- 2 датчика температуры и влажности DHT22 или DHT11
- 2 резистора на 4,7 кОм;
- 2 макетные платы;
- Провода DuPont.
Получение MAC-адреса платы
Чтобы отправлять данные через ESP-NOW, вам нужно знать MAC-адрес плат. Каждая плата имеет уникальный MAC-адрес
Загрузите следующий код на платы:
Знакомимся с модулем ESP8266 подробнее

ESP8266 — это микроконтроллер, разработанный в 2014 году и выпускающийся компанией Espressif Systems — китайской компанией из Шанхая. Он представляет собой сетевое решение с Wi-Fi-трансивером на борту плюс возможность выполнения записываемых в его память приложений.
Существует множество модификаций плат, именуемых обычно от ESP-01 до ESP-12. Сейчас уже появились ещё другие наименования плат от сторонних разработчиков. Отличия в платах заключается в основном в портах ввода-вывода, количестве флеш-памяти, вида коннекторов и т.п. Процессор — один и тот же, так что с точки зрения программирования не имеет значения какую плату программировать.
Спецификация ESP8266:
- Напряжение питания: 3,3 В
- Энергопотребление:10 мка. 170 мА
- Флеш-память: до 16 мб максимум (обычно 512 кб)
- Процессор: Tensilica L106, 32 бита
- Скорость процессора: 80. 160 МГц
- ОЗУ: 32 кб + 80 кб
- Порты ввода-вывода общего назначения: 17 (мультиплексируемые с другими функциями)
- АЦП: 1 ввод с разрешением 1024
- Поддержка 802.11: b/g/n/d/e/i/k/r
- Максимальное число подключений TCP: 5
Из спецификации видно, что вопрос как долго будет работать ESP8266 от батареек не может быть легко определён. Потребление энергии изменяется в очень широком диапазоне — при передаче на полной мощности оно составляет 170 миллиампер, а в режиме сне — всего 10 микроампер!
ESP8266 разработан так, что он может использовать подключённый к нему модуль памяти и это обычно флеш-память. Напомним, что количество циклов перезаписи в такую память составляет 10000 раз. Это вполне достаточно для случаев когда приложение записывает в память свои настройки или ведёт какой либо лог данных, но если ваше приложение записывает свои данные слишком быстро, память в скором времени перестанет работать.
Подключение к ESP8266
ESP8266 — это Wi-Fi устройство, значит и подключиться к нему можно через Wi-Fi, однако перед этим следует его настроить — процессор не знает названием вашей локальной сети и пароля для подключения к ней, а также других возможных настроек. Это, конечно, справедливо для случая когда мы хотим чтобы модуль подключался к нашей сети. Для случая когда сам модуль работает в режиме точки доступа, всё немного сложнее.
Для упрощения работы с модулем на стадии программирования и отладки своего приложения можно использовать последовательный порт (UART). ESP8266 имеет специальный последовательный порт для этого — два порта, означенных Rx и Tx. Tx — служит для передачи данных, а Rx — для приёма. Этими портами модуль соединяется с соответствующими портами партёра. Наиболее удобно подключить этот порт к компьютеру посредством переходника USB-UART. При таком подключении мы может отправлять модулю команды из программы терминала прямо с клавиатуры и получать ответы от модуля в терминал или записывать программу в модуль.
При подключении через UART следует установит одинаковую скорость портов. В процессе загрузки модуль ESP8266 пытается автоматически определить скорость подключения устройства-партнёра и установить у себя такую-же.
У модуля ESP8266 есть также второй последовательный порт. Главное его назначение — вывод диагностической и отладочной информации. Это может быть очень полезно при проверке своей программы. Пин Tx второго последовательного порта мультиплексирован с пином GPIO2.

Теория Wi-Fi
Работая с устройствами стандарта Wi-Fi, желательно иметь понимание принципе его работы в беспроводной сети. На высоком уровне, Wi-Fi — это беспроводная сеть для соединений TCP/IP. Wi-Fi — это набор протоколов беспроводной сети, описанных в стандарте IEEE 802.11.
Устройство, называемое Wireless Access Point (AP) — беспроводной точкой доступа (точкой доступа) работает как узел коммуникаций. Обычно оно подключено или работает в режиме роутера. Например, Wi-Fi роутер в вашем доме работает в таком режиме.
Модуль ESP8266 может работать как в режиме точки доступа (Access Point), так и в режиме клиента — рабочей станции (Station), а может и в обоих режимах одновременно. Чаще всего точка доступа имеет подключение к интернету и работает как мост между устройством и интернетом. Несколько рабочих станций в локальной сети общаются между собой также через точку доступа. Станция одновременно может быть подключена только к одной точке доступа. Каждое устройство в сети имеет собственный уникальный MAC-адрес — 48-битовое значение.
Если в пределах видимости находится несколько точек доступа, их потребуется как-то различать, поэтому у каждой точки доступа есть сетевой идентификатор, называемый SSID (Service Set Identifier, иногда также называемый BSSID) — это имя сети, имеющее длину до 32 символов.
Режим AT-команд
Самый быстрый способ пообщаться с модулем ESP8266 — это передать ему AT-команду и получить ответ. Набор AT-команд — это специальный набор инструкций, которые «знает» наш модуль и может выполнять определённые действия при их получении и выдавать в терминал результат их выполнения. Программа, называемая процессор AT-команд, уже установлена в модуле ESP8266 и готова к их приёму по последовательному порту. Эти команды начинаются с символов «AT».
AT-команды
Когда модуль подключён к терминалу компьютера, мы можем отправить самую простую команду — «AT«. В ответ на неё модуль должен отправить ответ «OK«.
Тип Формат Описание Тест AT+=? Запрос параметров и диапазона возможных значений Запрос AT+? Запрос текущих значений параметров Установка AT+= Установка значений параметров Выполнение AT+ Выполнение команд Все команды заканчиваются символами «\r\n».
- 0 — режим сна выключен
- 1 — режим неглубокого сна
- 2 — режим модемного сна
- ecn — защита
- 0 — OPEN
- 1 — WEP
- 2 — WPA_PSK
- 3 — WPA2_PSK
- 4 — WPA_WPA2_PSK
- mode
- 0 — Soft AP
- 1 — Station
- 2 — Soft AP + Station
- 0 — DHCP включен
- 1 — DHCP выключен
- 0 — не подключаться
- 1 — подключаться
- stat
- 2 — получен IP
- 3 — подключен
- 4 — отключен
- 0 — ESP8266 работает как клиент
- 1 — ESP8266 работает как сервер
- type — тип, TCP или UDP
- addr — удалённый IP адрес
- port — удалённый порт
- local port — локальный порт
- mode — только для UDP
- 0 — режим одиночного подключения
- 1 — режим множественных подключений
- mode
- 0 — удалить сервер (требует перезапуска)
- 1 — создать сервер
- 0 — нормальный режим
- 1 — сквозной режим
Программирование ESP8266
Модуль ESP8266 позволяет записывать собственные приложения для их запуска. Вы может скомпилировать код с языка C и загрузить в модуль. Такая процедура называется «прошивкой» (flashing). Для того, чтобы ваше приложение выполняло полезные функции, у него должна быть возможность отправлять и принимать данные по сети и/или работать с внешними датчиками, входами и выходами. ESP8266 оснащён базовыми функциями для этого, набор которых представляет собой примитивную «операционную систему». Службы этой ОС могут быть вызваны вашим приложением. Они полностью документированы и для вас будет очень полезно уметь пользоваться ими.
Например, если вам надо подключиться к точке доступа WiFi, в API есть команда для этого. Для получения IP адреса также есть API, для получения времени с запуска модуля также есть API. Таких функций очень много и они позволяют делать с модулем очень много полезных вещей. Запомнить все функции, конечно, невозможно, но стоит знать об их существовании. В интернете можно получить последнюю информацию на сайте производителя: http://espressif.com/en/products/esp8266/ или http://bbs.espressif.com/.
Режим загрузки
Когда модуль ESP8266 загружается, он проверяет значения уровней на пинах MTDO (GPIO15), GPIO0 и GPIO2. Комбинация высоких и низких уровней на этих пинах позволяет получить 3-битовое число с восемью возможными значениями от 000 до 111. Каждое значение интерпретируется модулем:
Значение Десятичное значение Пояснение 000 0 нет данных 001 1 Загрузка с данных по UART. Также данные для прошивки модуля. 010 2 Быстрый старт 011 3 Загрузка с флеш-памяти 100 4 SDIO low speed V2 101 5 SDIO high speed V1 110 6 SDIO low speed V1 111 7 SDIO high speed V2 С практической точки зрения это значит, что если нам требуется нормальный запуск модуля, нам требуется загрузить его с флеш-памяти (значение на пинах 011), а если нам требуется перепрошить модуль, то на пинах должно быть значение 001.
SDK ESP8266
SDK (Software Development Kit — набор средств разработчика) для модуля ESP8266 для языка C представляет собой набор файлов, называемых заголовочными с расширениями .h. Простым языком это файлы определений типов данных и функций, которые могут потребоваться при компиляции программы. SDK ESP8266 содержит папку includes с файлами от компании Espressif для нашего модуля:
Файл Пояснение at_custom.h определения собственных расширений AT команд c_types.h определения для языка C eagle_soc.h Низкоуровневые определения и макросы espconn.h Определения для TCP и UDP espnow.h Функции поддержки esp now ets_sys.h нет данных gpio.h Порты ввода-вывода ip_addr.h Определения для IP адреса и макросы mem.h Определения для работы с памятью os_type.h Тип ОС osapi.h Пользовательские заголовки с названием «user_config.h» ping.h Определения для ping pwm.h Определения для ШИМ queue.h Определения списков и очередей smartconfig.h Определения конфигурации sntp.h Определения SNTP spi_flash.h Определения для флеш-памяти upgrade.h Определения для обновлений user_interface.h Определения для ОС и WiFi. Компиляция
Приложения для модуля ESP8266 пишутся обычно на языке C. Перед загрузкой программы в модуль её следует скомпилировать из текста в машинные коды.
Редактировать текст программы удобнее всего в каком-нибудь редакторе, который имеет подсветку синтаксиса, встроенную справку и другие полезные функции, и ещё лучше — в интегрированной среде разработки (Iintegrated Development Enviroment). Работая в такой среде вы можете написать текст программы, скомпилировать её и сразу же загрузить в модуль.
Широко известны такие среды разработки как Eclipse и Arduino IDE.
Eclipse — очень мощная среда, разработанная компанией IBM и получившая статус открытой много лет назад. Она написана на Java, что означает возможность работы в разных ОС: Windows, Linux, OS X. К этой среде разработки можно подключать множество дополнений, а набор таких дополнений для языка C называется «C Developers Tools» (CDT). CDT не включает компилятор языка C. Его следует выбрать самому. Подробнее о компиляции приложения для ESP8266 в Eclipse будет написано в отдельной статье.
Arduino IDE — гораздо более простая среда разработки, которая, тем не менее, позволяет писать и загружать в модуль свои приложения. Как это делать описано в нашей статье «Arduino IDE + ESP8266».
Отладка
При написании программы очень часто они работают не так как ожидалось. Для модуля ESP8266 отладка (получение служебной информации и состояния системы) облегчается наличием последовательного порта специально для вывода отладочной информации. Вы можете напечатать в UART1 (GPIO2) что хотите при помощи функции os_printf(). Если подключить на пину GPIO2 модуля преобразователь UART-USB, то вы сможете видеть эту информацию на экране компьютера в реальном времени. Таким образом, имея один порт UART для прошивки модуля, а второй для отладки, вам не придётся ничего переключать при создании своей программы. Включение или выключение вывода информации управляется функцией system_set_os_print().
В следующей статье мы напишем тестовую программу — мигание светодиодом, скомпилируем её и запишем в модуль.
Ещё наши статьи о WiFI модуле ESP8266:
- Arduino IDE + ESP8266
- ESP8266 + Arduino: пример скетча
- WiFi модуль ESP8266