Используем arduino uno с wifi на одной плате для post запроса на сервер

Введение

Эта статья рассказывает о классах, функциях и свойствах библиотеки ESP8266WiFi. Если вы новичок в C++ и Arduino, ничего страшного. Мы начнем с общих концептов и постепенно перейдем к более детальному описанию каждого класса, включая примеры использования.

Функционал библиотеки ESP8266WiFi обширен и разнообразен, поэтому в этой статье мы ограничимся лишь общим описанием классов, а более подробные описания, с примерами и описанием функций, будут выведены в отдельные статьи.

Быстрый старт

Надеемся, вы уже знаете, как загрузить на ESP8266 скетч «Blink.io» и управлять миганием светодиода. Если нет, ознакомьтесь с этим руководством о HUZZAH ESP8266 или этим руководством о ESP8266 Thing.

Чтобы подключить ESP8266 к WiFi (как мобильный телефон к точке доступа), потребуется вот такой код:

 1 #include <ESP8266WiFi.h>
 2 
 3 void setup()
 4 {
 5   Serial.begin(115200);
 6   Serial.println();
 7 
 8   WiFi.begin("network-name", "pass-to-network");
 9 
10   Serial.print("Connecting");  //  "Подключение"
11   while (WiFi.status() != WL_CONNECTED)
12   {
13     delay(500);
14     Serial.print(".");
15   }
16   Serial.println();
17 
18   Serial.print("Connected, IP address: ");
19            //  "Подключились, IP-адрес: "
20   Serial.println(WiFi.localIP());
21 }
22 
23 void loop() {}

В строчке WiFi.begin(«network-name», «pass-to-network») вместо network-name и pass-to-network впишите название и пароль к WiFi-сети, к которой вы хотите подключиться. Затем загрузите скетч на ESP8266 и откройте монитор порта. В нем будет примерно следующее:

Как это работает? В первой строчке мы пишем #include <ESP8266WiFi.h>, подключая к скетчу библиотеку ESP8266WFi. Она нужна нам, т.к. содержит функции, с помощью которых ESP8266 осуществляет подключение к WiFi.

Подключение к WiFi инициализируется вот этой строчкой:

WiFi.begin("network-name", "pass-to-network");

Процесс подключения может занять несколько секунд. Проверка подключения выполняется в этом цикле:

1 while (WiFi.status() != WL_CONNECTED)
2 {
3   delay(500);
4   Serial.print(".");
5 }

Цикл while() будет прокручивать функцию WiFi.status() до тех пор, пока она не вернет значение WL_CONNECTED. Другими словами, этот цикл завершится только тогда, когда статус WiFi-подключения поменяется на WL_CONNECTED.

Последняя строчка печатает IP-адрес, который DHCP присвоил ESP8266:

Serial.println(WiFi.localIP());

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

Примечание: Если соединение было установлено, а потом по какой-то причине потеряно, то ESP8266 автоматически переподключится к последней рабочей точке доступа, когда она снова будет доступна. Это будет выполнено автоматически самой WiFi-библиотекой, без вмешательства пользователя.

Вот и все, что нужно для подключения ESP8266 к WiFi. Ниже мы расскажем о том, на что способен ESP8266, будучи уже подключенным к WiFi-сети.

Кто есть кто

Устройства, подключаемые к WiFi-сети, называются станциями (STA). Подключение к WiFi предлагает точка доступа (AP, что значит «access point»), которая служит хабом для одной или нескольких станций. Сама точка подключена к проводной сети. Точка доступа, как правило, интегрирована с роутером, что обеспечивает доступ из WiFi-сети к интернету. Каждая точка доступа имеет SSID (что значит «Service Set IDentifier», что можно перевести как «идентификатор служебного устройства»), который является, в сущности, названием сети, которую вы выбрали при подключении устройства (станции) к WiFi.

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

Структура проекта

Файл Назначение
WaterpoolManager.ino Объявление основных переменных и констант. Инициализация. Главный цикл.
HeaterMainLogic.ino Основная логика управления реле котла (по температурам) и вспомогательными реле.
Sensors.ino Считывание данных сенсоров
Settings.ino Настройки устройства, сохранение их в флеш-памяти контроллера
LCD.ino Вывод информации на LCD
ClockTimer.ino Считывание показаний часов RTC, или симуляция часов
Relays.ino Управление включением/выключением реле
ButtonLogic.ino Логика реакции на состояния аппаратных кнопок
ReadButtonStates.ino Считывание состояний аппаратных кнопок
EEPROM_Logging.ino Логгирование данных датчиков в EEPROM
WebServer.ino Встроенный веб-сервер для управления устройством и отображением состояний
WebPages В этой папке хранятся страницы веб-сервера
index.h Основная страница отображения состояния устройства. Идет считывание текущего состояния с помощью вызова ajax. Refresh каждые 5 секунд.
loggraph.h Выводит лог данных датчиков и состояний реле в виде графика. Используется библиотека jqPlot – все построение происходит на стороне клиента. Запрос к контроллеру идет лишь на бинарный файл – копии данных из EEPROM.
logtable.h тоже, но в виде таблицы
settings.h Управление настройками устройства: установка пределов по температурам, потоку воды, периодичности логгирования данных
time.h Установка текущего времени
Библиотеки
EepromLogger.cpp Библиотека записи логов во флеш
EepromLogger.h
crc8.cpp Подсчет 8-битного CRC для библиотеки
crc8.h
TimeSpan.cpp Структура для управления отрезками времени
TimeSpan.h

Работа с устройством

Вставьте microSD карту памяти (макс. 32 ГБ) в установленный на монтажной плате адаптер и подключите все устройство к любому USB-совместимому порту (или источнику питания 5 В). Мы подали питание на устройство. Следует удостовериться, что выбранный USB порт способен обеспечить выходной ток 1 А, – модуль ESP-12E потребляет большой ток при передаче файлов.

Как только устройство получит питание, будет создана беспроводная Wi-Fi точка доступа с именем «SD Reader». Подключитесь к этой точке доступа, используя пароль, который указан в исходном коде (скетче). Затем, в зависимости от того, какое устройство вы используете для подключения к точке доступа, откройте соотвествующее приложение: если вы подключаетесь с ПК, можно использовать ПО FileZilla или WinSCP, если вы подключаетесь с Android-устройства, то можно использовать приложение AndFTP.

В приложении настройте учетные данные. Например, для AndFTP потребуется ввести имя пользователя и пароль (по умолчанию в исходном коде имя пользователя и пароль «esp8266») и адрес хоста – 192.168.12.7. После настройки подключитесь к FTP серверу; как только подключение будет установлено, вы сможете загружать любые файлы с SD-карты памяти, а также загружать файлы со своего телефона на SD-карту памяти (Рисунок 7).

Рисунок 7. Подключение к FTP серверу на ESP-12E с Android
-смартфона.

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

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

Несмотря на то, что устройство выполняет свою функцию, оно очень медленное. Для передачи четырех файлов (каждый примерно по 100 Кбайт) потребуется около 30 секунд. Если взять файл большего размера (около 10 Мбайт), то его передача займет около 3-4 минут. Есть некоторые способы  оптимизации и увеличения скорости обмена данными до 450 Кбит/с, а в случае применения Wi-Fi модуля на ESP32 – скорость обмена данными может достигать 1 Мбит/с.

Автор называет две основные причины, по которым он не пытался оптимизировать устройство. Во-первых, хотелось наряду с FTP-сервером иметь возможность использовать интерфейс USB для обмена данными, но данный интерфейс не поддерживается в ESP8266 или ESP32. Во-вторых, низкая скорость передачи данных по FTP. По этой же причине не имеет смысла использовать ESP32 вместо ESP-12E.

Тем не менее, вероятно, одну из проблем можно решить, если использовать Wi-Fi модуль ESP32 S2, который поддерживает полноскоростной USB интерфейс.

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

Улучшенная схема прошивки для модуля 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, когда вы обратитесь к нему?

ESP-07

Особенности этого модуля — керамическая антенна и разъем для внешней антенны, металлический экран.

Подключение к IoT

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

Работа с этим модулем, к сожалению, прошла не слишком гладко. Ни один из возможных вариантов подключения не сработал, и я, уже отчаявшись, решила удалять его описание из статьи. Но тут мне дали новый модуль и сказали попробовать еще раз — о чудо, он заработал с первого раза! В чем было дело и как сломался первый модуль, который я мучила, — неизвестно, но скорее всего он был убит нещадной статикой. Мораль этого лирического отступления такова — если у вас что-то не заработало по инструкции, написанной ниже, не вините инструкцию — сначала прозвоните и проверьте все контакты, а потом попробуйте на другом модуле.

1) Собираем схему

ESP-07

USB-Serial

VCC

VCC

CH_PD (рекомендуется через резистор)

VCC

TX

RX

RX

TX

GND

GND

GPIO 15 (рекомендуется через резистор)

GND

GPIO 0 — сначала не подключен, но будет использоваться для перевода в режим программирования далее, поэтому к нему уже подведен провод

все остальные контакты не подключены

RTS, CTS — не подключены

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

2) Переводим в режим программирования (необходимо каждый раз выполнять перед прошивкой модуля)

2.1) Отключаем питание от модуля2.2. Подключаем пин GPIO 0  к GND

2.2) Подключаем пин GPIO 0  к GND

ESP-07

USB-Serial

VCC

VCC

CH_PD

VCC

TX

RX

RX

TX

GND

GND

GPIO 15 

GND

GPIO 0

GND

все остальные контакты не подключены

RTS, CTS — не подключены

2.3) Подключаем модуль к питанию

2.4) Железо готово, приступаем к программной части.

Программная часть

1) Выбираем плату: Tools (Инструменты) -> Board(Плата) Generic ESP8266 Module.

2) Вставляем подготовленный код.

3) Задаем данные для подключения Wi-Fi и идентификатор своего объекта на платформе.

4) Компилируем и загружаем скетч на плату.

5) Для обычной работы модуля (не для режима прошивки) пин GPIO 0 должен быть свободен, поэтому отключаем его от GND.

6) Переподключаем питание ESP-07 (например, вытаскиваем и вставляем обратно адаптер).

7) Видим появление данных на платформе.

В Китае

NodeMCU 1.0

На AliExpress этот модуль продается под разными названиями примерно за $6,5, и это одна из дешевейших, полностью интегрированных плат с чипом ESP8266 (точнее, модулем ESP-12E). Кроме того, эта плата разработана по принципу «open source» и оснащена SPI-чипом с 4 Мб flash-памяти.

Согласно производителю, «NodeMCU можно подключить к ноутбуку при помощи кабеля microUSB и загружать прошивку безо всяких проблем». Это правда лишь отчасти. Плата оснащена USB-Serial адаптером CP2102, который работает, к сожалению, не всегда. Иногда загрузка прошивки успехом не завершается и плату приходится сбрасывать, нажимая на кнопки FLASH и RST, после чего отпуская сначала FLASH, а потом RST. В результате CP2102 включается/выключается, и Linux присваивает ему другой номер.

Плата также оснащена регулятором напряжения NCP1117, синим светодиодом на контакте GPIO16 и делителем напряжения (на 220/100 кОм) на входном контакте ADC.

Вспоминаем биты и байты

Объем EEPROM в модуле ESP8266 (например, ESP-01) является очень важным фактором для выполнения процесса прошивки. Это количество EEPROM может быть выражено в различных единицах измерения, а используемые единицы варьируются в документации от места к месту, что может внести некоторую путаницу. Ключевые моменты и таблица, приведенные ниже, включены в качестве справочной информации, чтобы свести эту путаницу к минимуму.

Обозначение для бита b, а для байта – B.
В одном байте (B) содержится восемь бит (b).
Обозначения для килобита Kb, а для килобайта – KB. Аналогично, мегабит обозначается Mb, а мегабайт – MB

И так далее.
Также хорошо бы обратить внимание, что большинство (возможно, все) модули ESP-01 на черных печатных платах содержат 1 MB EEPROM.

Единица измерения Байт (B) Килобайт (KB) Мегабайт (MB) Гигабайт (GB)  Терабайт (TB)
Количество байт 1 1 024 1 048 576 1 073 741 824 1 099 511 627 776

Печатная плата

При проектировании платы выяснилось, что обычные детали с ножками занимают слишком много места, а многие чипы в DIP исполнении непросто найти. Почитав в интернете, что SMD монтаж не так уж сложен, а при должной сноровке даже менее трудоемок, я решил проектировать плату под SMD детали. И не ошибся. Получилась компактная, красивая плата, куда я с легкостью разместил все, что мне нужно. SMD детали, при наличии хорошего паяльника, флюса и припоя, оказалось действительно очень несложно монтировать.

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

Печатную плату я сделал размером 97×97 мм. Она с легкостью помещается в стандартную разделочную электро-коробку. Кроме того, платы размерами менее 100х100 дешевы в изготовлении. Изготовление минимальной партии из 5 плат по разработанному макету обошлось в 5 USD, еще около 9 USD стоила их доставка в Беларусь.

Проект платы лежит на сайте EasyEDA и доступен каждому желающему.

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

Увеличение количества UART (RX/TX) портов

Для некоторых задач есть необходимость увеличения количества последовательных портов. Для старших моделей Arduino, например, Mega, острой необходимости в увеличении последовательных портов нет, там их достаточно. Однако для ESP8266 задача вполне актуальна, учитывая что там только один hardware serial port, да и тот нередко занят под распаянный на плате USB ковертер. Можно эмулировать работу последовательного порта на GPIO с помощью SoftSerial, но не для всех задач это приемлемо.

Расширение одного последовательного порта UART (RX/TX) на 8-мь дополнительных последовательных портов

Решение от компании AtlasScientific — 8:1 Serial Port Expander самое дорогое. Цена в районе 15$ без доставки довольно высока, хотя если сравнивать с одно и двух портовыми модулями, то цена за порт меньше 2 $, что выгоднее чем у 1-2-х портовых собратьев.

SC16IS760 модуль для конвертации I2C / SPI на один UART порт

Есть конвертеры I2C в один порт UART и 8 GPIO портов на чипе SC16IS750. Стоят порядка 4 $ с оставкой в Россию. SPI вариант на чипе SC16IS760. Учитывая, что на одну шину можно вешать несколько модулей — можно набрать нужное количество. SPI порт достаточно шустрый, чтобы обеспечить подключение достаточно большого количества таких модулей.

SC16IS762 модуль для конвертации I2C / SPI на два UART порта

Есть старший собрат ковертера I2C в два порта UART и 8 GPIO портов на чипе SC16IS752. Стоят порядка 5 $. SPI вариант на чипе SC16IS762.

Плат на чипах MAX14830, MAX3107, MAX3108, MAX3109 я на Aliexpress не нашел.

Схемное решение для получения 4-х портов UART.

Breaking changes summary

  • BREAKING: WString: return bool instead of unsigned char ()
  • BREAKING: wifi: remove pseudo-modes for shutdown, expose ()
  • BREAKING: Disable WiFi at boot by default (, , )
  • BREAKING: base64::encode() compat with esp32: no newlines by default ()
  • BREAKING: Use IRAM_ATTR in place of ICACHE_RAM_ATTR ()
  • BREAKING: Upgrade to upstream newlib 4.0.0 release (64 bits time_t) ()
  • BREAKING: Change servo defaults to safer defaults ()
  • BREAKING: Add Print::availableForWrite method ()
  • BREAKING: Change return EEPROM.end() to bool ()
  • BREAKING: Change return type of channel() ()
  • BREAKING: Change return type of RSSI() ()
  • BREAKING: Add Wrong Password wifi status case ()
  • BREAKING: analogWriteRange 8-bit default ()
  • BREAKING: HTTPClient: RequestHandler: Pass String by const reference ()

Подключение

Переключение ESP8266 в режим станции выполняется при помощи функции begin(). Параметрами для этой функции служат SSID и пароль к ней, чтобы чип можно было подключить к определенной точке доступа.

WiFi.begin(ssid, password)

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

begin()

В библиотеке ESP8266WiFi представлено несколько вариантов функции begin(). Процесс совмещения нескольких функций в одной называют «перегрузкой функции». Один вариант был показан выше – это WiFi.begin(ssid, password). Перегрузка дает гибкость в количестве и типе параметров, задаваемых в функции.

Самый простой вариант функции begin() – это…

WiFi.begin()

Вызов этой функции скомандует ESP8266 переключиться в режим станции и подключиться к последней использованной точке доступа на основе данных, сохраненных во flash-памяти.

Ниже – синтаксис еще одного варианта функции begin() со всеми возможными параметрами:

WiFi.begin(ssid, password, channel, bssid, connect)

Параметр ssid – символьная строка, содержащая SSID точки доступа, к которой мы хотим подключиться (может содержать не более 32 символов). Параметр password – это пароль к точке доступа в виде символьной строки, которая может содержать от 8 до 64 символов. Параметр channel – канал точки доступа; на тот случай, если вы хотите работать через специальный канал (в противном случае этот параметр нужно проигнорировать). Параметр bssid – MAC-адрес точки доступа (тоже опционально). Параметр connect – это параметр с булевым значением; если задать в нем false, это скомандует модулю сохранить другие параметры, не подключаясь к точке доступа.

config()

Отключает DHCP-клиент (от «dynamic host configuration protocol», что значит «протокол динамической настройки узла») и выставляет IP-настройки станции на пользовательские значения. Эти IP-настройки, в отличие от настроек DHCP, будут статическими.

WiFi.config(local_ip, gateway, subnet, dns1, dns2)

При успешном изменении настроек функция вернет true. Если настройки задать нельзя (например, если чип не переключен в режим станции или станции + точки доступа), функция вернет false.

В функции можно указать следующую информацию:

  • local_ip – IP-адрес для стационарного интерфейса ESP8266
  • gateway – IP-адрес шлюза (роутера) для доступа к внешним сетям
  • subnet – маска подсети, диапазон IP-адресов в локальной сети
  • dns1, dns2 – опциональные параметры для IP-адресов DNS-серверов, которые хранят директории доменных имен (вроде www.google.co.uk) и преобразовывают их в IP-адреса

Пример:

 1 #include <ESP8266WiFi.h>
 2 
 3 const char* ssid = "********";
 4 const char* password = "********";
 5 
 6 IPAddress staticIP(192,168,1,22);
 7 IPAddress gateway(192,168,1,9);
 8 IPAddress subnet(255,255,255,);
 9 
10 void setup(void)
11 {
12   Serial.begin(115200);
13   Serial.println();
14 
15   Serial.printf("Connecting to %s\n", ssid);     //  "Подключение к "
16   WiFi.begin(ssid, password);
17   WiFi.config(staticIP, gateway, subnet);
18   while (WiFi.status() != WL_CONNECTED)
19   {
20     delay(500);
21     Serial.print(".");
22   }
23   Serial.println();
24   Serial.print("Connected, IP address: ");       //  "Подключено, IP-адрес: "
25   Serial.println(WiFi.localIP());
26 }
27 
28 void loop() {}

Пример данных, которые могут быть показаны в мониторе порта:

Connecting to sensor-net
.
Connected, IP address: 192.168.1.22

Станции с статическими IP-адресами, как правило, быстрее подключаются к сети. У кода выше подключение занимает примерно 500 мс (в мониторе порта показана только одна точка). Дело в том, что получение IP-настроек при помощи DHCP-клиента отнимает время, а в нашем случае этот шаг попросту пропущен. Если во всех трех параметрах (local_ip, gateway и subnet) указать «0.0.0.0», это снова активирует DHCP. Снова подключитесь к устройству, чтобы получить новые IP-адреса.

Troubleshooting

Если после прошивки ESP-8266 не получается подключиться к модулю на скорости 115200, нужно попробовать скорость 9600. В некоторых прошивках эта скорость выставлена по-умолчанию.

В некоторых случаях из-за качества соединений могут возникать проблемы с синхронизацией. Одно из решений — уменьшить скорость с 115200 до 9600:

  • AT+UART_DEF=<baudrate>,<databits>,<stopbits>,<parity>,<flow control>
  • AT+UART_DEF=9600,8,1,0,0
  • AT+UART_DEF=115200,8,1,0,3

В некоторых случаях при переходе на другую скорость отклики от модуля в терминальной программе становятся очень медленными. Пока не разобрался с чем это связано. Помогает сброс к заводским настройкам командой AT+RESTORE.

Организация кода

Структура директорий

Файлы проекта распределены по директориям. В основной директории — конфигурационные файлы, необходимые для сборки. Их можно просто скопировать, и только в CMakeLists.txt изменить название проекта, если вы склонировали проект не в директорию kettle_example. Директория build генерируется при сборке и не содержит исходного кода

Основное внимание на директории main и components, которые содержат компоненты с исходным кодом. В директории components располагаются все сторонние компоненты/библиотеки

В main — написанный нами код, а именно файлы работы с Capabilities, файлы управления периферией и файл main.c с бизнес-логикой. Также в main есть файл CMakeLists.txt, необходимый для сборки проекта. Процесс сборки рассмотрим далее.

Отличие сборки проекта по сравнению с ESP8266

В примерах для ESP8266 используется система сборки Make. Для успешной сборки нужно иметь Makefile в директории проекта со следующим минимальным содержимым:

В сборке под ESP32 в дополнение используется CMake, который позволяет использовать и другие системы сборки помимо Make, например Ninja. 

В каждом проекте содержится один или несколько компонентов. Компонент — это директория, в которой есть файл CMakeLists.txt. Директория main — это особенный компонент, который содержит исходный код самого проекта. Поэтому помимо файла CMakeLists.txt в директории проекта, необходимо создать файл CMakeLists.txt в директории main. Содержимое этого файла можно скопировать с других примеров от SmartThings. В нашем примере CMakeLists.txt отличается лишь тем, что в idf_component_register, который регистрирует компонент, перечисляются не исходные файлы, а директории с исходными файлами. Для этого в idf_component_register используем не SRCS с перечислением файлов, а SRC_DIRS с перечислением директорий:

Подробнее о системах сборки ESP-проектов можно прочитать в соответствующих разделах документации для ESP32 и для ESP8266.

Подгрузка компонентов/библиотек для датчика температуры

У нас используется датчик температуры DS18B20, который работает по 1-Wire шине. В проекте используется 2 компонента, совместимых с ESP32: esp32-owb и esp32-ds18b20.

  • Компонент esp32-owb — это библиотека для работы с протоколом 1-Wire. 

  • Компонент esp32-ds18b20 — это библиотека, которая предоставляет удобное api для работы с датчиком температуры, без необходимости напрямую работать по 1-Wire протоколу.

В нашем гит-проекте эти компоненты используются как подмодули/submodules, и чтобы их подгрузить, при клонировании проекта нужно использовать флаг —recurse-submodules:

Подгрузить подмодули можно и после обычного клонирования без флага —recurse-submodules.  Для этого в основной директории проекта kettle_example инициализируем и обновляем подмодуль следующими командами:

Подробнее о подмодулях вы можете прочитать в соответствующей главе книги “Pro Git”.

Получение последней прошивки

У Espressif есть страница, на которой размещается последняя версия прошивки. Перейдите на страницу bbs.espressif.com, нажмите на запись SDKs в списке Downloads, а затем кликните на «latest release» в разделе Announcements. На момент написания статьи на этой странице можно было увидеть следующее:

Страница с последней версией прошивки ESP8266

Последняя версия Non-OS SDK (Software Development Kit) – это то, что нам нужно, и, похоже, что, если вы кликните на «Latest Version: 1.4.0», то получите последнюю версию

Но это не совсем так; обратите внимание, что имеется доступный патч, указанный как esp_iot_sdk_v1.4.1_15_10_22. Это не патч; это исправленная версия прошивки версии 1.4.0

Нам нужен он и bin файлы AT_v0.50. Кликните по очереди на каждом из них и загрузите файлы.

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

Возможно, вы заметили, что есть раздел для скачивания документов. Все они содержат качественную информацию, но иногда существенная её часть теряется при переводе с китайского на английский. На данный момен не забудьте получить последние версии ESP8266 AT Instruction Set и Espressif IOT SDK User Manual.