blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
3
SLEDUJETE BLOG
PHP, Arduino programátor
deadawp



Podpora ESP-IDF do projektu Hladinomer
pridal deadawp 4.6. 2021 o 15:02



Mikrokontróler ESP32 je možné programovať v rôznych vývojových prostrediach. Arduino IDE je jedno z najpopulárnejších najmä z dôvodu ľahkej programovej implementácie aj pre začiatočníkov. Existuje však aj framework pre vývoj IoT aplikácii - ESP-IDF priamo z produkcie Espressif Systems, ktorá tieto mikrokontroléry vyrába. Umožňuje pristupovať bližšie k fyzickej vrstve mikrokontroléra, má rôzne vývojárske nástroje cez Python scripty a implementované nástroje pre spustenie systémových funkcionalít.

Framework obsahuje rôzne ukážkové implementácie projektov pre obsluhu zberníc, komunikáciu, ktoré využívajú FreeRTOS - operačný systém reálneho času, ktorý značne uľahčuje vývoj projektu, keďže umožňuje spúšťať podprogramy ako procesy, ktoré sú priradené k jadru, ktoré ho obsluhuje. Každý proces má pridelenú vlastnú pamäť (stack), ktorú môže využívať. Výhodou v porovnaní s programovaním v Arduino IDE je fakt, že jadro dokáže obsluhovať viacero funkcií zároveň, teda pri štandardnom programovaní dochádza napríklad pri použití funkcie delay() k zastaveniu celého programu, ktorý beží v tasku loop().

V tomto prípade sa zastaví na daný čas iba proces, pričom ostatné procesy dokážu fungovať ďalej. Každá úloha má priradený stack (zásobník), prioritu s možnosťou zvolenia jadra ESP32 na ktorom bude daná úloha vykonávaná. Úlohy súvisiace s WiFi prenosom, Bluetooth konektivitou môžu byť na žiadosť používateľa spúšťané na jadre protokolu, kde je obsluhovaný aj WiFi / BT stack. Štandardné podporogramy pre meranie je vhodné spúšťať na druhom tzv. aplikačnom jadre procesora Xtensa.

FreeRTOS som využíval posledný rok pri vytváraní demonštračnej aplikácie senzorového uzla na ESP32 v diplomovej práci. Rozhodol som sa vytvoriť ukážkovú implementáciu aj do projektu Hladinomer, ktorý ESP32 využíva, avšak program bol vytvorený iba v prostredí Arduino IDE. Pri vytváraní aplikácie som sa zameral a dal si za cieľ vytvoriť celkom 2 tasky, pričom využijem inter-task komunikáciu s využitím frontu - Queue. Queue využíva FIFO buffer, t.j. prvá položka pridaná do fronty je čítaná druhým taskom čítaná ako prvá (First in, First out).

Využitie frontu umožňuje jednému z taskov čakať na prijatie hodnoty ktorú mu odošle iný task. V mojom prípade bude jeden task obsluhovať ultrazvukový senzor vzdialenosti a vykonávať merania a druhý task bude čakať v cykle na hodnotu z merania, ktorú následne odošle na server, ukážkovo HTTP POST metódou. V praxi sa Queues využívajú aj na zamknutie prístupu k zbernici, periférii, ktorú môže v reálnom čase využívať iba aktívna Queue, ostatné úlohy sú v "blokovacom" režime, nakoľko čakajú na hodnotu z aktívnej Queue.

Pri vytváraní programu som najprv vytvoril testovací "offline" program, ktorý umožňuje iba vyčítavať nameranú hodnotu z ultrazvukových senzorov HC-SR04, prípadne vodotesnej verzie JSN-SR04T a vypísať ju na UART monitor. Knižnicu pre senzor som našiel na Githube. Druhým krokom bola implementácia HTTP requestu, ktorý je v ESP-IDF dostupný ako ukážkový projekt. Programová implementácia bola dostupná iba pre statickú cestu a GET metódu. Z toho dôvodu som musel existujúcu HTTP hlavičku requestu pozmeniť, doplniť encoding dát prenášaných POST metódou.

Kombinácia oboch projektov bola jednoduchá, nakoľko oba využívali FreeRTOS, teda funkcia bola spustená cez tento plánovač. Stačilo teda iba nakopírovať funkcie a jeden riadok inicializácie úlohy do .c programu. Prvý testovací program obsahoval odosielanie dát na webserver každých 5 minút a meranie dát každých 5 sekúnd, pričom dáta boli zapísané v globálnej premennej - dát. typ uint32, ku ktorej mali obe úlohy prístup. Task pre HTTP request obsahoval aj inicializáciu WiFi adaptéru spoločne s možnosťou konfigurácie SSID a hesla cez Menuconfig.

Po pripojení na WiFi sieť získa ESP32 okrem IPv4 aj IPv6 link-local adresu. Následne som implementoval jednoduchú Queue podľa vzoru pre Inter-task komunikáciu: https://icircuit.net/esp32-inter-task-communication-using-freertos-queues/1946 V tomto prípade bol producer task meracia úloha a consumer task odosielacia úloha.

HTTP request task tak nevyužíval vTaskDelay, ale funkciu xQueueReceive, ktorou sa vykonáva blokovanie úlohy po prijatie dát. Jedným z parametrov je časový interval po ktorý je čakacia slučka aktívna. Maximálne je možné zvoliť maximálnu 32-bitovú hodnotu, ktorú je možné získať premennou portMAX_DELAY, čo odpovedá rozsahu cca 50 dní. Okamžite po prijatí dát sa HTTP request vykoná. Meracia úloha opakuje meranie s priemerovaním (10 hodnôt priemerovaných) každých 300 sekúnd.

Vyskúšajte projekt Hladinomer: http://arduino.clanweb.eu/studna_s_prekladom/ s vašim hardvérom pre implementáciu v prostredí Arduino IDE, alebo ESP-IDF pre mikrokontróler ESP32. Implementácie sú dostupné aj na Githube v repozitári projektu: https://github.com/martinius96/hladinomer-studna-scripty



Prístupov 1985
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDUJETE
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
ULP aplikácie - ESP8266 / ESP32
[ 14.11.2021] (príspevkov 0)
Detekčná charakteristika - MATLAB
[ 8.8.2021] (príspevkov 0)
Práca s obrázkami - MATLAB
[ 19.7.2021] (príspevkov 1)
Flash Encryption a jeho implementácia v ...
[ 18.7.2021] (príspevkov 0)
Secure Boot V1 a jeho implementácia v ES...
[ 13.7.2021] (príspevkov 0)
Senzor Bosch BME280 v prostredí ESP-IDF
[ 8.7.2021] (príspevkov 0)
Podpora ESP32 do projektu WiFi termostat
[ 1.7.2021] (príspevkov 0)
Beamforming vizualizácia - MATLAB
[ 29.6.2021] (príspevkov 0)
Výroba DPS - AISLER - RFID DOMINATOR
[ 18.6.2021] (príspevkov 0)