Основни операции на wifi модул ESP8266 от Arduino

Основни операции на wifi модул ESP8266 от Arduino

Основни операции на wifi модул ESP8266 от Arduino

Когато Еспресиф пусна първите модули на пазара WiFi с интегрирания ESP8266 и фърмуер с които да го обработваме с помощта на AT команди, това, от което се интересувахме потребителите, беше да го интегрираме в сборки микроконтролери и проблемите бяха сведени до познаване на (предишната) тъмнина ESP8266 AT командна таблица, хранителни нужди или Актуализация на фърмуера ESP8266.

Съдържание

    Тогава бързо се появиха алтернативи за програмиране на ESP8266 и модулни реализации WiFi на много различни формати, които повдигнаха други опасения: кой wifi модул ESP8266 да изберете в зависимост от обхвата на различните антени (включително външни) или физическото интегриране на тези нови модули в нашите модули.

    Със сигурност, поради всички тези промени, акцентът може да не е поставен върху най-основните аспекти, най-основното управление на ESP8266 wifi модул. Макар че полярност.es Можете да намерите информация за употребата на ESP8266 и има някои приложения, предназначени да обяснят по общ начин работата на ESP8266 wifi модул използване на AT команди, особено в статията за библиотека за извършване на HTTP заявки от Arduino с wifi модула ESP8266, впечатленията на читателите предполагат, че би било полезно да се добави още малко основна информация, за да помогне на потребителите на ESP8266 да извършват свои собствени реализации.

    Обсъдете основните операции за работа с ESP8266 и предлагането на общи решения е цел от няколко много различни части; За да ви помогне да следвате съдържанието на статията, следният индекс може да служи като ръководство:

    Контролирайте wifi модула ESP8266 от компютъра през серийния порт

    От чиния Arduino и използвайки вашия IDE възможно е да се наблюдава работата на a ESP8266 wifi модул, изпрати ESP8266 AT команди и вижте отговора, но е много по-удобно да го направите от компютър с приложение от терминален тип.

    Използване на CuteCom за тестване на wifi модула ESP8266 през серийния порт

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

    За Каква програма да използвате за наблюдение на ESP8266 използвайки серийния порт, има много за избор според нуждите и предпочитанията; напоследък използвам повече класическия CuteCom (този на екранната снимка по-горе), защото ми е много удобно да повтарям някои ESP8266 wifi модул AT поръчки в тестването на проекта.

    Тук вече са дадени някои препоръки за програми, които функционират като серийна конзола; Например, когато говорим за PuTTY за управление на UART серийни устройства от компютъра. PuTTYОсвен че е отлично приложение, то е достъпно за повечето настолни операционни системи. Освен това, като PuTTY може да се използва да действа като конзола както със серийния порт, така и с семейство интернет протоколи (TCP/IP), включително тези, които работят на TLS, се превръща в обичаен инструмент, който повече от възвръща (малкото) време, прекарано в конфигурирането му и свикването с използването му.

    Използване на PuTTY за тестване на wifi модула ESP8266 през серийния порт

    В допълнение към серийния комуникационен софтуер, за свързване на ESP8266 wifi модул до пристанището USB Компютърът също изисква конвертор USB към сериала TTL. Както в случая със софтуера, има няколко версии, от които те се използват само за конвертиране на порта USB на сериен порт TTL (които могат да бъдат получени от едно евро) до такива, които могат да емулират различни протоколи (като напр SPI o I2C).

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

    Хардуер за USB UART серийни комуникации за наблюдение на wifi модула ESP8266

    Преобразувателят USB a UART TTL Може също да се използва за наблюдение на поведението на верига, която използва ESP8266, за да направите това, изходите, които искате да наблюдавате, се свързват последователно към входа за данни (RX) на преобразувателя с бърз диод ( 1N4148, например) и резистор (2K2, например) успоредно един на друг. Такава настройка работи като хардуерен сериен снифър.

    Пример за снифър за ESP8266, свързан към Arduino с помощта на USB UART TTL конвертор

    Въпреки че сниферът в изображението по-горе със сигурност е елементарен (наред с други неща, той няма буфер) е достатъчен за наблюдение на работата на модул с Arduino и ESP8266.

    Премахване на снифера от предишната схема, the схема, показваща как да свържете a ESP8266 wifi модул към чиния Arduino. В допълнение към захранването му при 3V3, щифтът за нулиране и щифтът за активиране на интегрирания трябва да бъдат свързани към високо ниво (разрешаване). Разбира се, RX изводът на единия трябва да се свърже с TX на другия.

    За да се опрости предишната диаграма, е представена плоча Arduino захранван на 3V3 и за който напрежението на серийния порт също се приема, че е 3V3. Ако използвате a микроконтролер с различно ниво на сигнала на серийния порт (обикновено 5 V), ще бъде необходимо, за да не се повреди ESP8266, използвай преобразувател на ниво като тези в диаграмите по-долу. Тази схема често се среща в много търговски готови модулни реализации.

    Конвертор на ниво на сигнала от 5V към 3V3 за ESP8266 WiFi модул и Arduino

    Актуализирайте фърмуера на ESP8266

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

    За съжаление повечето от Модели с wifi модул ESP8266 Имат само 4Mbit, така че не може да им се инсталира последната версия. Най-новата (официална) версия на фърмуера, на който може да се инсталира ESP8266 wifi модули с 4 Mbit (повечето) е 0.9.4, който включва версия 0.2 на ESP8266 AT команди.

    В обобщение, за да актуализирате фърмуера, трябва:

    1. Изтеглете съответната версия на фърмуера. В най-новата (официална) версия за модул с 4 Mbit памет, намерена в папката Espressif в github, В Уебсайт на Espressif Можете да изтеглите най-новата версия на фърмуера, но е много важно да проверите дали модулът, на който е инсталиран, има достатъчно памет.

    2. Изтеглете най-новата версия на инструмента за инсталиране на фърмуера. Любимото ми е esptool което е написано в Питон, така че работи на всяка платформа. Освен че може да се изтегли, може и да се инсталира с pip install esptool (o pip2 o python -m pip…). Разбира се, Еспресиф Той също така предлага свой собствен инструмент, но в момента е достъпен само за Windows.

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

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

      Свързване wifi модул 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

    Изпращайте команди до wifi модул ESP8266

    За да контролирате ESP8266 от компютър, с който ще трябва да започнем конфигурирайте приложението за което ще бъде достатъчно ① да изберете порта, към който е свързан преобразувателят USB UART TTL, нещо като /dev/USB0 в GNU/Linux и подобни или нещо подобно COM6 в Windows, ② изберете скоростта, с която ESP8266, вероятно 115200 бода, ③ задайте 8 бита данни плюс един стоп бит, без паритет или ръкостискане, и ④ задайте край на реда, в зависимост от фърмуер, почти винаги CR+LF.

    Конфигурирайте CuteCom за наблюдение на wifi модул ESP8266 с помощта на USB UART TTL конвертор

    Конфигурирайте PuTTY за наблюдение на wifi модула ESP8266 с USB UART TTL конвертор

    След като приложението бъде конфигурирано (или, където е подходящо, съхранено и избрано), то е отворете връзката ("open device" и "open", съответно, в екранните снимки на примерите по-горе с CuteCom y PuTTY) и можете да започнете да изпращате поръчки до ESP8266.

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

    Пътят на Публикувай AT поръчки al ESP8266 wifi модул от Arduino е много проста: ① конфигурирайте комуникациите с Serial.begin(115200); (или Serial1, Serial2… на платки с няколко хардуерни серийни порта) и ② изпратете командите, като използвате формата Serial.print(orden+"\r\n");

    Примерът по-горе показва как да изпратите ESP8266 wifi модул AT поръчки от Arduino. В този случай е илюстрирано AT+CWJAP, който се използва за свързване към точка за достъп. Тази команда използва като аргументи идентификатора на точката за достъп (SSID) и ключът, и двата в кавички, така че стават обект Srtring и ги оградете в кавички, като използвате екраниращия код (\"). За да завършите поръчката, използвайте \r\n което съответства на CR y LF.

    За да запомните, че серийният порт не винаги се идентифицира с Serial (на определени чинии може да бъде Serial1, Serial2…) използваният порт обект е дефиниран чрез присвояването му на макроса PUERTO_SERIE. Откриването на вида на използваната платка може да добави малко интелигентност към избора на сериен порт; По-късно ще разгледаме как можете да разберете вида на Arduino. Останалите дефиниции са обичайните, които ви позволяват да "именувате" константните стойности, за да избегнете тяхното повтаряне (и допускане на грешки) и да улесните промяната им.

    Горният пример трябва да свърже ESP8266 wifi модул към посочената точка за достъп, но свързана ли е вече преди? Работи ли връзката? За да знаем това, ние трябва да "слушаме" какво ESP8266

    Получавайте данни от wifi модул ESP8266

    Като свържете снифера за данни, обяснен по-горе, към компютъра, можете да видите какво Arduino изпрати до ESP8266 и неговия отговор. За четене от Arduino и обработва информацията в него, с която ще е необходимо да се открие Serial.available() дали са пристигнали някакви данни и ако е така, заредете ги Serial.read(). Следващият пример показва как да прочетете отговора от AT+CWJAP?, който ще докладва дали има връзка с някоя точка за достъп.

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

    Получавайте данни от wifi модула ESP8266 от Arduino. Основен пример

    Анализирайте отговора, изпратен от wifi модула ESP8266

    Вече видяхме как се разчита информацията, която достига Arduino от ESP8266. Проблемът, с който трябва да се справите е, че не знаете кога ще започне да пристига, колко време ще отнеме да пристигне, каква ще бъде дължината... и не е много ефективно да чакате отговора от ESP8266 се получава без да се пуска на микроконтролер изпълняват други задачи междувременно.

    Лесен начин за справяне с това обстоятелство е повторете получените данни, търсейки конкретни отговори с които, например, активирайте индикатори (флагове или булеви променливи), които ще определят дали да продължи търсенето в получения текст и какви действия трябва да бъдат извършени въз основа на информацията, която пристига от ESP8266. Докато пристигне отговорът микроконтролер може да се посвети на други задачи, например получаване на данни от сензори и обработката им.

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

    За търсене в текста, който идва от ESP8266 можеш сравнете всяко получено писмо с това, което отговаря на съобщението, което търсите. Ще бъде необходимо да се използва брояч (или показалец), който сочи към буквата за сравнение; Ако знакът, който пристига от ESP8266 е същият като разглеждания в съобщението, броячът напредва, ако е различен се инициализира.

    За да се знае, че краят е достигнат, се проверява следващият знак от търсеното съобщение, който ще бъде нула (\0) или дължината на съобщението се съхранява, за да се знае, като се сравнява с брояча, дали сравнението е приключило и следователно ESP8266 wifi модул е изпратил желаното съобщение.

    Следващият пример използва командата AT+CWLAP което ще върне списък с точки за достъп и в тях се търси една, наречена "wifi polaridad.es". Въпреки че избрахме да проверим дали последният знак е нула, като буфер Съхранява само търсения текст и се знае дължината му, може и да се провери дали са получени толкова правилни букви. С Светодиод свързан към пин 2 се съобщава, че очакваният текст е намерен.

    В кода на предишния пример можете също да видите начин за изберете серийния порт в зависимост от типа платка Arduino използвани. Този пример предполага, че имате три типа дъски за проекта: една Arduino Uno, One Arduino Mega 2560 и a Ардуино Леонардо. Ако работите с a Arduino Uno ще се използва Serial и иначе Serial1.

    Ако работите с плоча Ардуино Леонардо Можете да използвате същия метод, за да спрете програмата и да изчакате конзолата (серийният порт, свързан с Serial) е на разположение.

    Търсете различни текстове в отговора на ESP8266

    Кодът в предишния пример се използва за търсене на текст в информацията, изпратена от ESP8266 но отговорът може да включва различна информация в зависимост от операцията. Да предположим, за да започнем с прост случай в следващия пример, че текстът, изпратен от MCU ESP8266 es OK когато операцията е извършена правилно и ERROR Иначе както при поръчката AT+CWJAP?, който служи за проверка дали ESP8266 wifi модул вече е свързан към точка за достъп.

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

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

    Досега не е направено позоваване на съответен въпрос: the максимално време на изчакване (таймаут), преди да се приеме, че операцията е неуспешна. Ако по някаква причина връзката с ESP8266 wifi модул, модулът с точката за достъп, точката за достъп с интернет или, например, хипотетичен сървър не е наличен, програмата може да бъде блокирана в един момент в очакване за неопределено време, така че ще трябва да се даде отговор на такива обстоятелства. Максималното време за изчакване може да бъде конфигурирано за цялото приложение, обикновено то ще бъде по-"щедро" в този случай или могат да бъдат програмирани отделни времена за изчакване за всяка операция.

    За да проверите дали (поне) определен интервал от време е изминал „Времето“ на момента, в който акаунтът е стартиран, обикновено се изважда от текущото „време“ и се проверява дали разликата е по-голяма от желания лимит. Това "време" не трябва да е в реално време, то обикновено съответства на интервала, изминал от момента на MCU започнете да отчитате времето; Това не засяга програмата, тъй като интересното е изминалото време, а не абсолютното време.

    Обикновено, за да се провери дали определен интервал е изтекъл, се използва израз от типа:

    променлив milisegundos_al_empezar съдържа стойността на millis() на определен момент от изпълнението, от който се измерва времето, така че не е необичайно името му да се отнася до думата "хронометър". Променливата intervalo_de_tiempo съдържа максималния брой милисекунди, който прави предишния израз верен, т.е. той представлява времето за изчакване; Обикновено е константа (или макрос) и, както в предишния случай, думата "TIMEOUT" често се появява в името му. Ако работите с много кратки интервали можете да използвате micros() вместо millis() (микросекунди вместо милисекунди), въпреки че е много по-рядко срещано и много по-малко прецизно.

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

    Горният код показва a много елементарно прилагане на ограничение на изчакване включвайки редовете, маркирани по отношение на примера, който го предхожда. Тъй като проверката на времето за изчакване се извършва след обработка на данните, пристигащи от ESP8266 wifi модул, операцията може да се счита за успешна дори ако приемът отнеме повече от наложеното време за изчакване.

    Изпълнете сложна операция, дефинирана от множество AT команди

    За да имате примерна справка за целта на приложението, което използва ESP8266 wifi модул, да предположим, че е така съхранява информация в база данни, достъпна чрез уеб услуга за да следите температурата. Следният код чете сензор, свързан към аналогов вход на всеки определен интервал от време, изчислява средната стойност и след по-дълъг интервал от време я изпраща на уеб сървъра (стил ИН) през a петиция HTTP (ПУБЛИКУВАЙТЕ, ВЗЕМЕТЕ...).

    В този пример за запис на температура се осъществява достъп до уеб сървър на всеки пет минути. Въпреки че наличността не е особено висока, може да се очаква, че предложението ще проработи, но ако е необходима по-висока честота на запис, ще трябва да се приложат други ресурси, например буфер за данни чакащи да бъдат изпратени, за да изпрати няколко, когато сървърът може да присъства и да ги съхрани, когато не е наличен. Ако честотата, с която данните трябва да се записват, беше още по-голяма, други видове протоколи ще трябва да бъдат предложени като алтернатива на HTTP или дори замени TCP от UDP за да можете да изпратите повечето от данните с необходимата скорост, дори с цената на загуба на някои.

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

    • Нулирайте wifi модула
    • Прекъснете връзката с текущата точка за достъп (в случай че съществува връзка по подразбиране)
    • Задайте настройките. За примера се предполага, че режимът на свързване (прост) и ролята в Wi-Fi комуникациите (станция) трябва да бъдат конфигурирани.
    • Свържете се с точка за достъп
    • Проверете дали връзката е правилна (всъщност това е входната точка) Ако няма връзка, започнете процеса отначало
    • Свържете се със сървъра
    • Изпратете заявката HTTP с данните, които ще се съхраняват

    Редът на операциите не трябва да бъде точно такъв (въпреки че операцията е) и всяка стъпка може да изисква няколко ESP8266 AT командиНапример конфигурацията, изброена по-горе, ще се нуждае от две: AT+CIPMUX=0 y AT+CWMODE=1.

    Структура от данни за представяне на операции на ESP8266

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

    В предишните примери бе търсено съобщение в отговора на ESP8266 и се тълкува като успех или грешка. В допълнение към получаване (и анализ) на целия получен текст, За да имате общ минимум, препоръчително е също да обърнете внимание на попълването на съобщението или, с други думи, до наличието на ESP8266 wifi модул за получаване на нови поръчки. По този начин промяната в състояние, което бихме могли да наречем, например „наличен wifi“, може да бъде получаване на името на точката за достъп и получаване на текста ERROR или текста OK би означавало, че ESP8266 приключихте с отговора и вече можете да изпратите следващия AT команда към ESP8266.

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

    Когато говорим за възможните отговори, вече може да се види, че този пример не е много полезен за получаване на данни с произволен формат от ESP8266 wifi модул, но работата е там, че в контекста на използване с микроконтролери не е обичайно; Най-често срещаното нещо е да изпраща данни, събрани от сензорите, които са свързали, и/или да получава информация какво да прави с задвижващите механизми, които управлява. Много ценна информация, която може да се предвиди много добре.

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

    И накрая, има още два вектора за задаване на максималното време за изчакване, преди да се откажете (timeout) и посочете (configuracion), ако операцията приключи без изчакване на отговор (ESPERAR_RESPUESTA) и съобщения, указващи края на комуникацията. Този последен вектор, за да илюстрира пример за това как може да се спести памет, работи с битовете на конфигурационния байт, за да посочи различните състояния.

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

    Когато се свържете със сървъра, моделът се променя. В този случай е необходимо ① да изпратите дължината на пакета данни за предаване и ② да съставите заявката HTTP с фиксиран текст плюс стойността (на температурата), която се изпраща за съхранение на сървъра. Подготовката на тези данни се извършва във всяка пратка и е необходимо тя да бъде разделена на две (уведомете дължината) или три (изпратете заявката HTTP) На ESP8266 AT поръчка. Само последната от частите, на които е разделена операцията, ще чака отговор.

    В този случай ще работи безпроблемно (може би предупреждение, че модулът е зает), но когато дължината на данните е по-голяма, ще се наложи блоковете с данни да се разделят на по-малки части и дори може да се наложи да се приложи изчакване, т.к. се извършва с отчитането на температурата, за да се даде време на модула да изпрати данните, без да ги запълва буфер.

    Заедно с други макроси, които вече бяха обяснени преди, примерният код по-горе показва как се дефинират различните състояния, с които да се укаже дали да се изчака отговор и, ако е приложимо, какво съобщение показва, че е приключил.

    Тъй като в различни точки на кода ще бъде изпратена операция (кога е време да се изпрати средната температура, ако времето за изчакване на операция е превишено, когато текущата операция е завършена успешно...), но как да се направи това е установено глобално, то е дефинирано като макрос ENVIAR_OPERACION който групира стъпките, включени в доставката.

    Следва кодът на основната програма на примера. Най-външната задача е тази, която отговаря за вземането на проби от температурата за изчисляване на средната стойност и на всеки определен период от време тя се изпраща на сървъра с помощта на ESP8266 wifi модул. След като всяка операция бъде изпратена, отговорът се анализира, за да се определи коя е следващата или дали задачата за изпращане на информация е изпълнена.

    Логично, няколко оптимизационни действия могат да бъдат извършени върху предишния код, но тъй като това е пример за разбиране как ESP8266 По общ начин си струва да се съсредоточите само върху някои аспекти, като първият е структурата на данните. Изглежда, че е логично използвайте структура от данни на език за програмиране (struct), за да представи информацията, която се обработва: the ESP8266 AT команди и съобщенията, които се анализират.

    Използвайте структура (struct) за съхраняване на данните вместо примерните масиви (базирани на тях) е тривиално и, въпреки че може да доведе до по-елегантен код, това не предполага никакво подобрение в резултата. Истинската алтернатива, породена от използването на struct е да се приложи, както е обяснено по-долу, променливи дължини в структури, които съдържат „вътрешни“ данни които са посочени от тях. По този начин, например, не би било необходимо една операция да има фиксиран брой отговори за анализ.

    Този подход предполага, че това е най-добрият начин за прилагане на решението, но недостатъкът е, че ще бъде необходимо използвайте динамично разпределение на паметта, рискована практика при работа с a микроконтролер което изисква внимателно измерване на това колко памет ще се използва по време на изпълнение, тъй като компилаторът едва ли ще може да ни предупреди за това и има известна възможност за изчерпване на паметта (или стека) с фатални последици за изпълнението на програмата.

    По отношение на оптимизирането на кода е интересно да се помни, че в програма от този тип, която използва голямо количество текст, може да спести място в паметта SRAM съхраняване на текстови низове в програмната памет (флаш) с макроса F(). В следващите екранни снимки можете да видите различната програма и динамично разпределение на паметта с нормално използване на текст и използване на макроса F().

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

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

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

    Като структура, която представлява операцията (данните, които се изпращат до ESP8266 wifi модул) се отнася до структурата, с която са дефинирани отговорите, и структурата на отговорите до структурата на операциите, необходимо е първо да декларирате и двете, като дефинирате новия тип данни и след това дефинирате съдържанието му.

    Предишният пример счита, че програмата, която го включва, е избрала да използва a индикатор за състояние, който трябва да съответства на променлива, достъпна от кода, който отговаря за извършването на една или други операции, както е посочено от споменатата стойност. Ако в отговора на ESP8266 Когато се анализира определен текст, състоянието приема стойността, която показва структурата на съответния отговор.

    Както беше казано по-рано, би била друга алтернатива, или да се замени, или да се допълни индикатор за състояние съхранява функция в референтната структура (указател), който ще бъде извикан при среща с определен текст в отговора от ESP8266 wifi модул.

    В предишния пример той е добавен към структурата от данни, която се използва за обработка на отговора от ESP8266 wifi модул указател към (предполагаема) функция, която връща данни от тип float (може да бъде претеглената стойност на аналогово четене) и на което два байта са предоставени като аргументи (два unsigned char който може да бъде щифтът, от който се чете аналоговият вход и този, който активира ENABLE на хипотетичен интегриран).

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

    Ако работите с този начин на представяне на данните, използвайте struct на данни с променлива дължина, ще е необходимо динамично разпределяне на памет с malloc() (o new(), ако се използват обекти), който ще използва количеството памет, разпределено като параметър и ще върне указател към началото на областта на паметта, която е запазена. с sizeof() От вида, който се съхранява, умножен по броя на използваните елементи, можете да получите необходимото количество памет. Пример със и без използването му може да видите на екранните снимки по-долу. malloc(); Внимавайте с паметта, използвана от програмата в първия случай, трябва да заредите библиотеката, която съдържа тази функция.

    Пример за разпределение на памет с malloc на Arduino

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

    Ако операциите на ESP8266 wifi модул ще варира по време на изпълнението на програмата, ще е необходимо да се освободи паметта, която не се използва с free() (o delete(), в случай че са обекти). Въпреки че е разумно да се очаква, че компилаторът (GCC) ще оптимизира програмата, за да избегне разделянето на паметта, със сигурност производителността няма да бъде толкова оптимална, колкото работата със статично разпределена памет.

    Въпреки че в този пример (и в двете реализации) няма много смисъл, за да се обобщи операцията, за да може да се приложи към други случаи, трябва да се отбележи, че Изпращането на данни винаги повтаря един и същ протокол: уведомете броя на байтовете, които ще бъдат изпратени, изчакайте индикатора (>) и изпратете данните.

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

    За да се приложи това поведение, могат да се използват последните два елемента на връзката, така че всеки път, когато данните се изпращат, данните се попълват със съответните стойности: в първия случай броят на изпратените байтове, а във втория ( част от) искането. да бъде предадено.

    За да повторите присвояването и изпращането на различните елементи, които трябва да бъдат предадени, могат да бъдат съхранени във вектор. Този нов вектор ще бъде този, който определя края на сложната операция, а не последната операция, както досега.

    1 коментар

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

    Определено има какво да разберете по тази тема. Харесвам всички точки, които отбелязахте

    Публикувай коментар

    Може да сте пропуснали