Основні операції з Wi-Fi модулем ESP8266 від Arduino

Основні операції з Wi-Fi модулем ESP8266 від Arduino

Основні операції з Wi-Fi модулем ESP8266 від Arduino

Коли Еспресиф випустив на ринок перші модулі Wi-Fi з інтегрованим ESP8266 у-ель- Firmware за допомогою якого можна обробляти його за допомогою AT-команд, ми, користувачі, цікавилися інтеграцією його в збірки мікроконтролери і проблеми зводилися до пізнання (колишньої) темряви Таблиця команд AT ESP8266, потреби в годівлі або Оновлення мікропрограми ESP8266.

Зміст

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

    Звичайно, через усі ці зміни наголос, можливо, не було зроблено на найосновніших аспектах, найпростішому управлінні Wi-Fi модуль ESP8266. Хоча полярність.es Ви можете знайти інформацію про використання ESP8266 і є деякі програми, призначені для загального пояснення роботи Wi-Fi модуль ESP8266 за допомогою AT-команд, особливо в статті про бібліотека для виконання HTTP-запитів від Arduino за допомогою модуля wifi ESP8266, враження читачів свідчать про те, що було б корисно додати ще деяку базову інформацію, щоб допомогти користувачам ESP8266 здійснювати власні реалізації.

    Обговоріть основні операції для роботи з ESP8266 і пропонування загальних рішень є ціллю кількох дуже різних частин; Щоб допомогти слідкувати за змістом статті, наведений нижче покажчик може служити орієнтиром:

    Керуйте Wi-Fi модулем ESP8266 з комп'ютера через послідовний порт

    З тарілки Arduino і використовуючи ваш IDE можна контролювати роботу a Wi-Fi модуль ESP8266, надішліть Команди ESP8266 AT і подивіться відповідь, але це набагато зручніше робити з комп’ютера з програмою термінального типу.

    Використання CuteCom для тестування модуля Wi-Fi ESP8266 через послідовний порт

    Залежно яка дошка Arduino використовується лише один апаратний послідовний порт може бути доступним, що додає невеликі незручності для надсилання та отримання. Змінювати швидкість зв’язку набагато зручніше в програмі послідовного зв’язку з комп’ютера та деяких материнських плат. Arduino (і за деяких обставин) погано підтримують вищі швидкості послідовного зв’язку, особливо 115200 бод, що є швидкістю за замовчуванням для останніх версій Firmware.

    Про нас Яку програму використовувати для моніторингу ESP8266 за допомогою послідовного порту, є багато на вибір відповідно до потреб і вподобань; Останнім часом я більше використовую класику CuteCom (той, що на скріншоті вище), тому що мені дуже зручно повторювати певне Замовлення модуля wifi ESP8266 AT у тестуванні проекту.

    Деякі рекомендації вже були надані тут щодо програм, які функціонують як послідовна консоль; Наприклад, коли говорять про 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, наприклад) і резистор (2K2, наприклад) паралельно один одному. Така установка працює як апаратний серійний сніффер.

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

    Хоча сніффер на зображенні вище, безумовно, рудиментарний (між іншим, він не має буфера) достатньо для моніторингу роботи збірки Arduino у-ель- ESP8266.

    Видалення сніфера з попередньої схеми, схематично показує, як підключити a Wi-Fi модуль ESP8266 до тарілки Arduino. На додаток до живлення на 3V3, контакт скидання та контакт активації інтегрованого повинні бути підключені до високого рівня (увімкнути). Звичайно, контакт RX одного повинен підключатися до TX іншого.

    Для спрощення попередньої діаграми була зображена пластина Arduino з живленням 3V3 і для якого напруга на послідовному порту також передбачається рівною 3V3. Якщо ви використовуєте a мікроконтролер з іншим рівнем сигналу на послідовному порту (зазвичай 5 В), щоб не пошкодити ESP8266, використовуйте a перетворювач рівня як на діаграмах нижче. Ця схема часто зустрічається в багатьох комерційних готових модулях.

    Перетворювач рівня сигналу 5 В в 3 В 3 для модуля WiFi ESP8266 і Arduino

    Оновіть мікропрограму ESP8266

    The Команди ESP8266 AT, його завершення, швидкість модуля за замовчуванням... залежать від версії Прошивка ESP8266. Найкраще переконатися, що у вас однакова версія в усіх модулях і, якщо можливо, що це остання версія.

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

    Таким чином, щоб оновити мікропрограму, вам потрібно:

    1. Завантажте відповідну версію прошивки. Остання (офіційна) версія для модуля з 4 Мбіт пам'яті, знайдена в папці Espressif на github. У Веб-сайт Espressif Ви можете завантажити останню версію мікропрограми, але дуже важливо переконатися, що модуль, на якому вона встановлена, має достатньо пам’яті.

    2. Завантажте останню версію засобу встановлення мікропрограми. Моїм улюбленим є esptool який написано в Python, тому він працює на будь-якій платформі. Окрім завантаження, його також можна встановити за допомогою pip install esptool (o pip2 o python -m pip…). Звичайно, Еспресиф Він також пропонує власний інструмент, але наразі доступний лише для Windows.

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

    4. Підключіть модуль до комп'ютера за допомогою конвертера USB UART TTL який працює на 3V3 або використовуйте перетворювач рівнів, якщо він працює при напрузі 5 В. Окрім живлення, вам доведеться підключити TX до RX перетворювача USB UART TTL, RX до TX, GPIO0 на низькому рівні (GND) і, можливо, GPIO2 на високому рівні (у моїх тестах це спрацювало як підключення на низькому рівні, так і відключення). Якщо модуль має вільне підключення GPIO15 (як це відбувається в ESP-12), він повинен бути підключений до низького рівня. RESET, який зазвичай має високий рівень під час роботи, можна залишити не підключеним або підключити до високого рівня за допомогою резистора (10K, наприклад), оскільки перед початком запису може знадобитися скинути пристрій, підключивши його до низького рівня.
      Увімкнувши модуль, він стане доступним для оновлення, але Якщо відображається помилка з'єднання, її необхідно скинути підключивши 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 містить корисне навантаження оновлення.

      wifi ESP8266 оновлення прошивки esptool console capture

    Надсилайте команди модулю Wi-Fi ESP8266

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

    Налаштуйте CuteCom для моніторингу модуля Wi-Fi ESP8266 за допомогою конвертера USB UART TTL

    Налаштуйте PuTTY для моніторингу модуля Wi-Fi ESP8266 за допомогою конвертера USB UART TTL

    Після того, як програму налаштовано (або, якщо необхідно, збережено та вибрано), вона є відкрити з'єднання ("відкрити пристрій" і "відкрити", відповідно, на скріншотах прикладів вище з CuteCom y PuTTY) і ви можете почати надсилати замовлення на адресу ESP8266.

    Як видно в Таблиця команд AT ESP8266, формат для активації, дезактивації, встановлення значення та посилання на нього цілком передбачуваний, але загалом запам’ятати їх усіх непросто, і вам, ймовірно, знадобиться мати його під рукою, щоб звернутися до нього.

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

    Наведений вище приклад показує, як надіслати Замовлення модуля wifi ESP8266 AT від 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, One Arduino Mega 2560 а Ардуїно Леонардо. Якщо ви працюєте з a Arduino Uno це буде використано Serial і інакше Serial1.

    Якщо працювати з плитою Ардуїно Леонардо Ви можете використати той самий метод, щоб зупинити програму та дочекатися консолі (послідовний порт, пов’язаний з 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 днів. Під час віднімання з беззнаковими типами даних відтворюється та сама поведінка (перевертання лічильника), тому можна контролювати час очікування на невизначений термін.

    Наведений вище код показує a дуже проста реалізація обмеження тайм-ауту включаючи рядки, позначені відносно прикладу, який йому передує. Оскільки перевірка тайм-ауту виконується після обробки даних, що надходять від Wi-Fi модуль ESP8266, операцію можна вважати успішною, навіть якщо прийом займає більше часу, ніж встановлений час очікування.

    Виконайте складну операцію, визначену кількома AT-командами

    Щоб мати приклад посилання на призначення програми, яка використовує Wi-Fi модуль ESP8266, припустимо, що так зберігати інформацію в базі даних, доступ до якої здійснюється через веб-службу стежити за температурою. Наступний код зчитує датчик, підключений до аналогового входу, кожен певний проміжок часу, обчислює середнє значення та, після більшого проміжку часу, надсилає його на веб-сервер (стиль IoT) через a клопотання 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 AT замовлення. Лише остання частина, на яку розділено операцію, чекатиме відповіді.

    У цьому випадку він працюватиме без проблем (можливо, попередження про те, що модуль зайнятий), але коли довжина даних більша, необхідно буде розділити блоки даних на менші частини, і навіть може знадобитися реалізувати очікування, оскільки виконується зі зчитуванням температури, щоб дати модулю час для надсилання даних без заповнення буфера.

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

    Оскільки в різних точках коду буде надіслано операцію (коли прийшов час відправити середню температуру, якщо час очікування операції перевищено, коли поточну операцію успішно завершено...), але як це зробити створений у всьому світі, він був визначений як макрос ENVIAR_OPERACION який групує етапи доставки.

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

    Логічно, що кілька оптимізаційних дій можна виконати на попередньому коді, але, оскільки це приклад, щоб зрозуміти, як ESP8266 У загальному плані варто зосередитися лише на деяких аспектах, першим з яких є структура даних. Здається, це логічно використовувати структуру даних мови програмування (struct) для представлення інформації, що обробляється: the Команди ESP8266 AT і повідомлення, які аналізуються.

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

    Цей підхід припускає, що це найкращий спосіб реалізації рішення, але недоліком є ​​те, що це буде необхідно використання динамічного розподілу пам’яті, ризикована практика роботи з a мікроконтролер що вимагає ретельного вимірювання того, скільки пам'яті буде використано під час виконання, оскільки компілятор навряд чи зможе попередити нас про це і існує певна ймовірність виснаження пам'яті (або стека) з фатальними наслідками для виконання програми.

    Що стосується оптимізації коду, цікаво пам’ятати, що в програмі такого типу, яка використовує велику кількість тексту, може заощадити місце в пам'яті SRAM збереження текстових рядків у пам'яті програми (спалах) з макросом F(). На наступних знімках екрана ви можете побачити різні програми та динамічний розподіл пам’яті зі звичайним використанням тексту та використанням макросу F().

    Приклад коду Arduino з використанням тексту, збереженого в пам’яті програми (flash)
    Приклад коду Arduino з використанням тексту в SRAM

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

    Нижче наведено приклад структур для зберігання даних запитів до ESP8266 (тип даних operacion_esp8266) та їхні відповіді (тип даних respuesta_esp8266).

    Як структура, яка представляє операцію (дані, які надсилаються в Wi-Fi модуль ESP8266) відноситься до структури, за допомогою якої визначені відповіді, а структура відповідей до структури операцій, спочатку необхідно задекларувати обидва, визначивши новий тип даних, а потім визначивши його вміст.

    У попередньому прикладі враховується, що програма, яка його включає, вибрала використання a індикатор стану, яка має відповідати змінній, доступній із коду, який відповідає за виконання тих чи інших операцій, як зазначено у зазначеному значенні. Якщо у відповіді о ESP8266 При аналізі певного тексту стан приймає значення, яке вказує на структуру відповідної відповіді.

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

    У попередньому прикладі його було додано до структури даних, яка використовується для обробки відповіді від Wi-Fi модуль ESP8266 вказівник на (імовірну) функцію, яка повертає дані типу float (може бути зваженим значенням аналогового зчитування) і якому два байти надаються як аргументи (два unsigned char який може бути контактом, з якого зчитується аналоговий вхід, і тим, що активує ENABLE гіпотетичного інтегрованого).

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

    Якщо ви працюєте з таким способом представлення даних, використовуючи struct даних змінної довжини, потрібно буде динамічно виділяти пам’ять malloc() (o new(), якщо використовуються об’єкти), який використовуватиме обсяг виділеної пам’яті як параметр і повертатиме покажчик на початок зарезервованої області пам’яті. с sizeof() На основі типу, який зберігається, помноженого на кількість використаних елементів, ви можете отримати необхідний обсяг пам’яті. Приклад із його використанням і без нього можна побачити на скріншотах нижче. malloc(); Будьте обережні з пам'яттю, яку використовує програма, у першому випадку потрібно завантажити бібліотеку, яка містить цю функцію.

    Приклад розподілу пам'яті за допомогою malloc на Arduino

    Приклад присвоєння тексту без malloc в Arduino

    Якщо операції на Wi-Fi модуль ESP8266 змінюватиметься під час виконання програми, необхідно буде звільнити пам'ять, яка не використовується free() (o delete(), у випадку об’єктів). Хоча розумно очікувати, що компілятор (GCC) оптимізує програму, щоб уникнути розділення пам’яті, звичайно, продуктивність не буде такою оптимальною, як робота зі статично виділеною пам’яттю.

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

    Оскільки в цьому прикладі він використовується лише один раз (весь запит робиться в одному пакеті), він не здається дуже корисним, але, загалом, може знадобитися виконати кілька надсилань під час однієї операції, включаючи випадки, коли вони повинні передаватися значні обсяги даних, які мають бути фрагментовані, щоб уникнути переповнення пам’яті ESP8266.

    Щоб реалізувати цю поведінку, останні два елементи з’єднання можна використовувати так, що кожного разу, коли дані надсилаються, дані заповнюються відповідними значеннями: у першому випадку кількість надісланих байтів, а в другому – ( частина запиту. для передачі.

    Щоб повторити призначення та відправку, різні елементи, які потрібно передати, можна зберегти у векторі. Цей новий вектор буде тим, що визначає кінець складної операції, а не останньою операцією, як досі.

    1 коментар

    коментарі користувача
    dūbxls̄d

    Про цю тему, безумовно, можна багато дізнатися. Мені подобаються всі ваші зауваження

    Дати коментар

    Можливо, ви пропустили