Основные операции с Wi-Fi-модулем ESP8266 от Arduino

Основные операции с Wi-Fi-модулем ESP8266 от Arduino

Основные операции с Wi-Fi-модулем ESP8266 от Arduino

Cuando Эспрессиф выпустила первые модули на рынок Wi-Fi с интегрированным ESP8266 y el прошивки с помощью которого можно было бы обрабатывать его с помощью AT-команд, нас, пользователей, интересовала интеграция его в сборки с микроконтроллеры и проблемы сводились к знанию (ранее) темного Таблица AT-команд ESP8266потребности в кормлении или Обновление прошивки ESP8266.

Содержание

    Затем быстро появились альтернативы для программирования ESP8266 и реализации модулей Wi-Fi очень разных форматов, что вызвало другие опасения: какой Wi-Fi модуль ESP8266 выбрать в зависимости от радиуса действия различных антенн (в том числе внешних) или физической интеграции этих новых модулей в наши сборки.

    Конечно, из-за всех этих изменений акцент, возможно, не был сделан на самых основных аспектах, самом базовом управлении Модуль Wi-Fi ESP8266. Хотя полярность.es Вы можете найти информацию об использовании ESP8266 и есть некоторые приложения, предназначенные для общего объяснения работы Модуль Wi-Fi ESP8266 с помощью AT-команд, особенно в статье о библиотека для выполнения HTTP-запросов от Arduino с помощью Wi-Fi-модуля ESP8266., впечатления читателей подсказывают, что было бы полезно добавить еще немного базовой информации, чтобы помочь пользователям ESP8266 осуществлять свои собственные реализации.

    Обсудим основные операции по работе с ESP8266 и предложение общих решений является целью нескольких совершенно разных частей; Чтобы лучше понять содержание статьи, в качестве руководства может служить следующий указатель:

    Управляйте модулем Wi-Fi ESP8266 с компьютера через последовательный порт.

    Из тарелки Arduino и используя свой IDE есть возможность контролировать работу Модуль Wi-Fi ESP8266, Отправить ESP8266 AT-команды и посмотреть ответ но гораздо удобнее это сделать с компьютера с приложением терминального типа.

    Использование CuteCom для тестирования модуля Wi-Fi ESP8266 через последовательный порт

    В зависимости от того, какая доска Arduino При использовании может быть доступен только один аппаратный последовательный порт, что добавляет немного неудобств при отправке и получении. Изменение скорости связи гораздо удобнее в приложении последовательной связи с компьютера и некоторых материнских плат. Arduino (и в некоторых случаях) плохо поддерживают самые высокие скорости последовательной связи, особенно 115200 бод, что является скоростью по умолчанию в последних версиях прошивки.

    О нас Какую программу использовать для мониторинга ESP8266 используя последовательный порт, есть из чего выбирать в зависимости от потребностей и предпочтений; в последнее время я больше использую классику МилыйКом (тот, что на скриншоте выше), потому что мне очень удобно повторять определенные Модуль Wi-Fi ESP8266 при заказе в тестировании проекта.

    Здесь уже были даны некоторые рекомендации по программам, работающим как последовательная консоль; Например, когда речь идет о PuTTY для управления последовательными устройствами UART с компьютера. PuTTYЭто не только отличное приложение, но и доступное для большинства настольных операционных систем. Кроме того, как PuTTY может использоваться в качестве консоли как с последовательным портом, так и с Семейство интернет-протоколов (TCP/IP), в том числе те, которые работают на TLS, становится распространенным инструментом, который с лихвой окупает (небольшое) время, потраченное на его настройку и привыкание к его использованию.

    Использование PuTTY для тестирования модуля Wi-Fi ESP8266 через последовательный порт

    В дополнение к программному обеспечению последовательной связи, подключить Модуль Wi-Fi ESP8266 к порту USB Для компьютера также требуется конвертер USB серия TTL. Как и в случае с ПО, существует несколько версий, из которых используется только конвертация порта USB на последовательном порту TTL (которые можно получить за один евро) до тех, которые могут эмулировать различные протоколы (например, SPI o I2C).

    Подобно программе, которая функционирует как последовательная консоль, аппаратное обеспечение для связи с компьютером через USB с логической схемой (не только ESP8266) будет обычным инструментом в работе разработчика микроуправляемых приложений, стоит как можно скорее иметь его в наборе инструментов и работать с ним Модуль Wi-Fi ESP8266 Это отличная возможность получить его.

    Аппаратное обеспечение последовательной связи USB UART для мониторинга модуля Wi-Fi ESP8266.

    Конвертер USB a UART TTL Его также можно использовать для мониторинга поведения схемы, использующей ESP8266, для этого выходы, которые вы хотите контролировать, последовательно подключаются ко входу данных (RX) преобразователя с быстродействующим диодом ( 1N4148, например) и резистор (например, 2К2) параллельно друг другу. Такая установка работает как аппаратный анализатор последовательного порта.

    Пример сниффера для ESP8266, подключенного к Arduino с помощью преобразователя USB UART TTL

    Хотя сниффер на изображении выше, безусловно, рудиментарен (помимо прочего, он не имеет буфер) достаточно для контроля работы сборки с Arduino y el ESP8266.

    Убрав сниффер из предыдущей схемы, схема, показывающая, как подключить Модуль Wi-Fi ESP8266 к тарелке Arduino. Помимо подачи на 3V3, вывод сброса и вывод активации встроенного должны быть подключены к высокому уровню (разрешение). Разумеется, вывод RX одного должен подключаться к выводу TX другого.

    Для упрощения предыдущей схемы была изображена пластина Arduino питание от напряжения 3 В3, для которого напряжение на последовательном порту также предполагается равным 3 В3. Если вы используете микроконтроллер с другим уровнем сигнала на последовательном порту (обычно 5 В), чтобы не повредить ESP8266, использовать преобразователь уровней как на схемах ниже. Эта схема часто встречается во многих готовых коммерческих реализациях модулей.

    Преобразователь уровня сигнала 5В в 3В3 для модуля Wi-Fi ESP8266 и Arduino

    Обновите прошивку ESP8266.

    Лас- ESP8266 AT-команды, его завершение, скорость модуля по умолчанию... зависят от версии Прошивка ESP8266. Лучше всего убедиться, что у вас установлена ​​одна и та же версия во всех модулях и, если возможно, что это самая последняя версия.

    К сожалению, большая часть Модели модулей Wi-Fi ESP8266 У них всего 4 Мбит, поэтому самую последнюю версию на них установить нельзя. Последняя (официальная) версия прошивки, которую можно установить на Модули Wi-Fi ESP8266 с 4 Мбит (большая часть) — это 0.9.4, включая версию 0.2 ESP8266 AT-команды.

    Вкратце, для обновления прошивки необходимо:

    1. Загрузите соответствующую версию прошивки. La последняя (официальная) версия модуля с 4 Мбит памяти находится в папке Espressif на github.. В Сайт Эспрессиф Вы можете скачать самую свежую версию прошивки, но очень важно убедиться, что у модуля, на котором она установлена, достаточно памяти.

    2. Загрузите последнюю версию инструмента установки прошивки.. Мой любимый инструмент что написано в Питон, поэтому он работает на любой платформе. Помимо загрузки, его также можно установить с помощью pip install esptool (o pip2 o python -m pip…). Конечно, Эспрессиф Он также предлагает собственный инструмент, но в настоящее время доступен только для Windows.

    3. Подготовьте загруженные файлы; разархивируйте их в доступную папку и при необходимости сделайте инструмент исполняемым инструментв моем случае, поскольку GNU / Linux, con chmod +x esptool

    4. Подключите модуль к компьютеру с помощью конвертера USB UART TTL это работает на 3V3 или используйте преобразователь уровней, если он работает от 5 В. Помимо питания вам придется подключить TX к RX преобразователя USB UART TTL, RX к TX, GPIO0 на низком уровне (GND) и, возможно, GPIO2 на высоком уровне (в моих тестах он работал как при подключении на низком уровне, так и при отключении). Если у модуля свободное соединение GPIO15 (как это происходит в ESP-12), его необходимо подключить к низкому уровню. RESET, который во время работы обычно находится на высоком уровне, можно оставить неподключенным или подключить к высокому уровню с помощью резистора (например, 10К), поскольку перед началом записи может потребоваться перезагрузить устройство, подключив его. до низкого уровня.
      После включения модуля его можно будет обновить, но Если отображается ошибка подключения, необходимо будет ее сбросить. подключив RESET на низком уровне на мгновение и затем оставив его в эфире (без подключения) для процесса обновления.
      Модуль имеет пики потребления на полампера (до 600 мА, по мнению некоторых пользователей), поэтому важно использовать блок питания, способный поддерживать такое потребление, особенно для обновления прошивки.

      Подключение Wi-Fi-модуля ESP8266 ESP-01 к USB UART TTL-конвертору, обновление прошивки

    5. Запустите инструмент для обновления прошивки. В моем случае я сохранил документы инструмента и прошивки на шаге 3 в одной папке, поэтому запускаю из консоли:
      cd ~/Datos/firmwareESP8266 (перейдите в папку, содержащую инструмент и прошивку)
      ./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
      0x00000 ./boot_v1.1.bin \
      0x01000 ./user1.bin \
      0x7C000 ./esp_init_data_default.bin \
      0x7E000 ./blank.bin

      --baud устанавливает скорость ESP8266 (в моем случае 115200 бод) и --port последовательный порт, к которому он подключается (в моем случае эмулируемый, первый USB). Различные документы, составляющие прошивку, остаются позади. write_flash которому предшествует адрес с документом user1.bin, содержащим полезные данные обновления.

      Обновление прошивки Wi-Fi ESP8266, захват консоли esptool

    Отправка команд на модуль Wi-Fi ESP8266.

    Чтобы контролировать ESP8266 с компьютера нам придется начать с настроить приложение для чего будет достаточно ① выбрать порт, к которому подключен преобразователь USB UART TTL, Что-то типа /dev/USB0 в GNU/Linux и подобных или что-то в этом роде COM6 в Windows: ② выберите скорость, с которой ESP8266, вероятно, 115200 бод, ③ установить 8 бит данных плюс один стоповый бит, без контроля четности или установления связи, и ④ установить конец строки, в зависимости от прошивки, почти всегда CR+LF.

    Настройте CuteCom для мониторинга Wi-Fi-модуля ESP8266 с помощью преобразователя USB UART TTL.

    Настройте PuTTY для мониторинга модуля Wi-Fi ESP8266 с помощью преобразователя USB UART TTL.

    После того как приложение настроено (или, где это возможно, сохранено и выбрано), оно открыть соединение («открыть устройство» и «открыть» соответственно на скриншотах примеров выше с МилыйКом y PuTTY) и вы можете начать отправлять заказы на ESP8266.

    Как можно видеть в Таблица AT-команд ESP8266, формат активации, деактивации, установки значения и обращения к нему вполне предсказуем, но в целом запомнить их все непросто и для обращения к нему, вероятно, потребуется иметь его под рукой.

    Форма Enviar АТ заказы al Модуль Wi-Fi ESP8266 от Arduino Это очень просто: ① настроить связь с Serial.begin(115200); (или Serial1, Serial2… на платах с несколькими аппаратными последовательными портами) и ② отправьте команды в формате Serial.print(orden+"\r\n");

    В приведенном выше примере показано, как отправить Модуль Wi-Fi ESP8266 при заказе от Arduino. В данном случае это иллюстрируется AT+CWJAP, который используется для подключения к точке доступа. Эта команда использует в качестве аргументов идентификатор точки доступа (SSID) и ключ, оба в кавычках, поэтому они становятся объектом Srtring и заключен в кавычки с помощью escape-кода (\"). Для оформления заказа используйте \r\n что соответствует CR y LF.

    Помните, что последовательный порт не всегда идентифицируется с Serial (на некоторых пластинах это может быть Serial1, Serial2…) используемый объект порта был определен путем присвоения его макросу PUERTO_SERIE. Определение типа используемой платы может добавить немного интеллекта при выборе последовательного порта; Позже мы рассмотрим, как можно узнать тип Arduino. Остальные определения — обычные, которые позволяют «называть» константные значения, чтобы избежать их повторения (и ошибок) и облегчить их изменение.

    Приведенный выше пример должен соединить Модуль Wi-Fi ESP8266 к указанной точке доступа, но была ли она уже подключена раньше? Связь сработала? Чтобы узнать это, нам нужно «прислушаться» к тому, что ESP8266

    Получение данных от Wi-Fi-модуля ESP8266.

    Подключив анализатор данных, описанный выше, к компьютеру, вы сможете увидеть, что Arduino послал ESP8266 и его ответ. Чтобы прочитать из Arduino и обрабатывать информацию в нем необходимо будет обнаружить с помощью Serial.available() поступили ли какие-либо данные, и если да, загрузите их с помощью Serial.read(). В следующем примере показано, как прочитать ответ от AT+CWJAP?, который сообщит, есть ли соединение с какой-либо точкой доступа.

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

    Получите данные от Wi-Fi-модуля ESP8266 от Arduino. Базовый пример

    Проанализируйте ответ, отправленный модулем Wi-Fi ESP8266.

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

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

    Поиск текста в информации, полученной от ESP8266

    Для поиска текста, полученного из ESP8266 может быть сравните каждое полученное письмо с тем, которое соответствует сообщению, которое вы ищете. Необходимо будет использовать счетчик (или указатель), указывающий на сравниваемую букву; Если персонаж, пришедший из ESP8266 такой же, как тот, который проверяется в сообщении, счетчик увеличивается, если он отличается, он инициализируется.

    Чтобы узнать, что конец достигнут, проверяется следующий символ искомого сообщения, который будет нулевым (\0) или сохраняется длина сообщения, чтобы путем сравнения ее со счетчиком узнать, завершилось ли сравнение и, следовательно, Модуль Wi-Fi ESP8266 отправил желаемое сообщение.

    В следующем примере используется команда AT+CWLAP который вернет список точек доступа, и в них выполняется поиск точки под названием «wifi Polaridad.es». Хотя мы решили проверить, что последний символ равен нулю, поскольку буфер В нем хранится только искомый текст и известна его длина, также можно было проверить, было ли получено такое количество правильных букв. С LED подключенный к контакту 2 сообщается, что ожидаемый текст найден.

    В коде предыдущего примера вы также можете увидеть способ выберите последовательный порт в зависимости от типа платы Arduino использовал. В этом примере предполагается, что у вас есть три типа досок для проекта: одна Arduino Uno, una Arduino Mega 2560 y una Arduino Leonardo. Если вы работаете с Arduino Uno оно будет использовано Serial и в противном случае Serial1.

    Если вы работаете с тарелкой Arduino Leonardo Вы можете использовать тот же метод, чтобы остановить программу и дождаться консоли (последовательный порт, связанный с Serial) доступен.

    Поиск различных текстов в ответе ESP8266

    Код в предыдущем примере используется для поиска текста в информации, отправленной ESP8266 но ответ может включать различную информацию в зависимости от операции. Предположим, для начала с простого случая в следующем примере, что текст, отправленный MCU ESP8266 es OK когда операция выполнена правильно и ERROR В противном случае, как и в случае с приказом AT+CWJAP?, который служит для проверки того, Модуль Wi-Fi ESP8266 уже подключен к точке доступа.

    Эта новая реализация того же метода, который ищет совпадение с несколькими возможными сообщениями, позволяет вам выбирать между различными действиями в зависимости от ответа, полученного от ESP8266, просто включите LED соответствующий.

    Ограничьте время, необходимое для получения ответа

    До сих пор не было сделано никаких упоминаний о соответствующем вопросе: максимальное время ожидания (таймаут), прежде чем считать операцию неудачной. Если по какой-либо причине соединение с Модуль Wi-Fi ESP8266, модуль с точкой доступа, точка доступа с Интернетом или, например, гипотетический сервер недоступен, программа может быть заблокирована в один момент в ожидании на неопределенный срок, поэтому придется артикулировать реакцию на такие обстоятельства. Максимальное время ожидания можно настроить для всего приложения, обычно в этом случае оно будет более «щедрым», или для каждой операции можно запрограммировать индивидуальное время ожидания.

    Чтобы проверить, что (хотя бы) прошел определенный интервал времени «Время» момента запуска учетной записи обычно вычитается из текущего «времени» и проверяется, что разница превышает желаемый предел.. Это «время» не обязательно должно быть реальным, обычно оно соответствует интервалу, прошедшему с момента MCU начать отсчитывать время; Это не влияет на программу, поскольку интересно затраченное время, а не абсолютное время.

    Обычно для проверки того, прошел ли определенный интервал, используется выражение типа:

    переменная milisegundos_al_empezar содержит значение millis() определенного момента исполнения, от которого он отсчитывается, поэтому нет ничего необычного в том, что его название отсылает к слову «хронометр». Переменная intervalo_de_tiempo содержит максимальное количество миллисекунд, которое делает предыдущее выражение истинным, то есть представляет тайм-аут; Обычно это константа (или макрос) и, как и в предыдущем случае, в ее названии часто встречается слово «TIMEOUT». Если вы работаете с очень короткими интервалами, вы можете использовать micros() вместо millis() (микросекунды вместо миллисекунд), хотя это гораздо менее распространено и гораздо менее точно.

    Длинное целое число в Arduino (unsigned long) занимает 4 байта (32 бита), поэтому наибольшее значение, которое оно может представлять, — 4294967295 (2 в 32-й степени минус один, поскольку оно начинается с нуля). на тарелке Arduino При непрерывной работе счетчик миллисекунд будет сбрасываться (возвращаться к нулю) примерно каждые 50 дней. При вычитании беззнаковых типов данных воспроизводится то же самое поведение (переворот счетчика), поэтому можно бесконечно контролировать тайм-аут.

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

    Выполнить сложную операцию, определенную несколькими AT-командами.

    Чтобы иметь примерную ссылку на цель приложения, использующего Модуль Wi-Fi ESP8266, предположим, что это хранить информацию в базе данных, доступ к которой осуществляется через веб-сервис чтобы следить за температурой. Следующий код считывает датчик, подключенный к аналоговому входу, каждый определенный интервал времени, вычисляет среднее значение и после более длительного интервала времени отправляет его на веб-сервер (стиль IoT) через Запрос HTTP (ОТПРАВИТЬ, ПОЛУЧИТЬ…).

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

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

    • Сбросьте модуль Wi-Fi
    • Отключиться от текущей точки доступа (если существует соединение по умолчанию)
    • Установите настройки. Для примера предполагается, что необходимо настроить режим подключения (простой) и роль в связи Wi-Fi (станция).
    • Подключиться к точке доступа
    • Проверьте правильность подключения (собственно, это точка входа) Если соединения нет, начните процесс с начала
    • Подключиться к серверу
    • Отправить запрос HTTP с данными, которые будут храниться

    Порядок операций не обязательно должен быть именно таким (хотя операция именно такая), и каждый шаг может потребовать несколько ESP8266 AT-командыНапример, для конфигурации, указанной выше, потребуется два: AT+CIPMUX=0 y AT+CWMODE=1.

    Структура данных для представления операций на ESP8266.

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

    В предыдущих примерах поиск сообщения осуществлялся в ответе ESP8266 и это интерпретировалось как успех или ошибка. Помимо приема (и анализа) всего полученного текста, Чтобы иметь общий минимум, желательно также уделить внимание завершению сообщения. или, другими словами, к наличию Модуль Wi-Fi ESP8266 получать новые заказы. Таким образом, переход в состояние, которое мы могли бы назвать, например, «доступен Wi-Fi», может заключаться в получении имени точки доступа и получении текста. ERROR или текст OK будет означать, что ESP8266 вы закончили ответ и теперь можете отправить следующий AT-команда для ESP8266.

    В приведенном выше коде используется вектор (operacion) для хранения текста последовательных операций, образующих полную задачу. Используется двумерный массив (mensaje) с тремя анализируемыми ответами. Как объяснялось выше, необходимо искать сообщения, обозначающие конец ответа, в дополнение к сообщению, обозначающему правильный или неправильный ответ. Не все операции будут иметь одинаковое количество возможных ответов; Когда ответов меньше, можно использовать пустое сообщение, занимающее на анализ минимально возможное количество циклов (даже в этом случае это не самый оптимальный способ). По логике вещей, необходимо, чтобы минимальное количество искомых ответов (три в примере) включало все рабочие возможности, даже если они не все возможны.

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

    В предыдущей структуре данных, так же, как это делается для выражения возможных анализируемых ответов, также используется двумерная матрица для определения операции, которую необходимо выполнить в каждом случае (siguiente_operacion). В частности, мы решили отвечать на три типа сообщений: ① произвольный текст (LITERAL) для проверки наличия соединения с точкой доступа Wi-Fi и сервером, ② текст для обнаружения ошибок в процессе (FALLO) и ③ текст, указывающий на успешное завершение операции (ACIERTO).

    Наконец, есть еще два вектора для установки максимального времени ожидания перед тем, как сдаться (timeout) и укажите (configuracion), если операция завершается, не дождавшись ответа (ESPERAR_RESPUESTA) и сообщения, указывающие на окончание связи. Этот последний вектор, иллюстрирующий пример экономии памяти, работает с битами конфигурационного байта, указывая различные состояния.

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

    При подключении к серверу картина меняется. В этом случае необходимо ① отправить длину передаваемого пакета данных и ② составить запрос. HTTP с фиксированным текстом плюс значение (температуры), которое отправляется для хранения на сервере. Подготовка этих данных осуществляется в каждой отправке и ее необходимо разделить на две (сообщить длину) или три (отправить запрос HTTP) в ESP8266 при заказе. Ответа будет ждать только последняя из частей, на которые разбита операция.

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

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

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

    Ниже приведен код основной программы примера. Самая внешняя задача — это задача, отвечающая за выборку температуры для расчета среднего значения, и каждый определенный период времени она отправляется на сервер с помощью Модуль Wi-Fi ESP8266. После отправки каждой операции ответ анализируется, чтобы определить, какая операция следующая и завершена ли задача отправки информации.

    Логично, что с предыдущим кодом можно выполнить несколько действий по оптимизации, но, поскольку это пример, позволяющий понять, как ESP8266 В общем, стоит сосредоточиться только на некоторых аспектах, первым из которых является структура данных. Кажется, что логично использовать структуру данных языка программирования (struct) для представления обрабатываемой информации: ESP8266 AT-команды и сообщения, которые анализируются.

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

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

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

    Пример кода Arduino с использованием текста, хранящегося в памяти программы (флэш-памяти)
    Пример кода Arduino с использованием текста в SRAM

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

    Ниже приведен пример структур для хранения данных запросов к ESP8266 (тип данных operacion_esp8266) и их ответы (тип данных respuesta_esp8266).

    Поскольку структура, представляющая операцию (данные, отправляемые в Модуль Wi-Fi ESP8266) относится к структуре, с помощью которой определяются ответы, а структура ответов — к структуре операций, необходимо сначала объявить оба, определив новый тип данных, а затем определив его содержимое.

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

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

    В предыдущем примере он был добавлен в структуру данных, которая используется для обработки ответа от Модуль Wi-Fi ESP8266 указатель на (предполагаемую) функцию, которая возвращает данные типа float (может быть взвешенное значение аналогового чтения) и которому в качестве аргументов предоставляются два байта (два unsigned char это может быть контакт, с которого считывается аналоговый вход, и тот, который активирует РАЗРЕШЕНИЕ гипотетического интегрированного устройства).

    В разработке для MCU, в отличие от того, что происходит в стиле разработки для более крупных систем, не так уж и редко используются глобальные переменные при определении (глобального) поведения приложения, управляющего сборкой, поэтому не будет особой редкостью встретить такого типа определения как функции без параметров и не возвращающие значения, что-то вроде void (*accion)();

    Если вы работаете с таким способом представления данных, используя struct данных переменной длины, необходимо будет динамически выделять память с помощью malloc() (o new(), если используются объекты), который будет использовать объем выделенной памяти в качестве параметра и возвращать указатель на начало зарезервированной области памяти. С sizeof() От типа, который хранится, умножив на количество используемых элементов, можно получить тот объем памяти, который необходим. Пример с его использованием и без можно увидеть на скриншотах ниже. malloc(); Будьте осторожны с памятью, используемой программой: в первом случае вам необходимо загрузить библиотеку, содержащую эту функцию.

    Пример распределения памяти с помощью malloc на Arduino

    Пример присвоения текста без malloc в Arduino

    Если операции над Модуль Wi-Fi ESP8266 будет меняться на протяжении всего выполнения программы, необходимо будет освободить память, которая не используется при free() (o delete(), в случае, если они являются объектами). Хотя разумно ожидать, что компилятор (НКУ) оптимизирует программу, чтобы избежать разделения памяти, производительность наверняка не будет такой оптимальной, как при работе со статически выделенной памятью.

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

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

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

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

    1 комментарий

    пользователь комментариев
    ดู บอล สด

    На эту тему определенно есть что узнать. Мне нравятся все пункты, которые вы сделали

    Оставить комментарий

    Вы могли пропустить