Avtor: dr. Simon Vavpotič
2020_284_36
ESP8266 Wi-Fi moduli, kot majhna, enostavna in učinkovita 32-bitna osnova za gradnjo naprav in sistemov Internet of Things (IoT), že leta buri domišljijo programerjev. Čeprav so novi navadno že predprogramirani kot brezžični Wi-Fi modemi, jih lahko z lastno programsko opremo spremenimo v samostojne krmilnike enostavnih IoT naprav.
Zamisel o programiranju ESP8266 je stara že skoraj desetletje, vendar so pri kitajskem proizvajalcu teh miniaturnih dvočipnih modulov z mikrokontrolerjem Tensilica Diamons L106 in Flash RAM pomnilnikom, Espressif Systems, šele v zadnjem času uredili prijazno spletno stran, na kateri so objavili tudi dovolj podrobno programersko dokumentacijo v angleškem jeziku (prej samo v kitajščini), ki jo potrebujemo za uspešno načrtovanje elektronskih vezij in programiranje.
V preteklem nadaljevanju smo izdelali TTL RS-232 vmesnik, preučili možnosti zagona ESP8266, osvetlili novoletno jelko, krmilili električne porabnike z relejskim vezjem, vzpostavili dostopno točko in spletni strežnik tako, da smo lahko z mobilnim telefonom krmilili digitalni izhod ter z ESP8266 povezali pomnilniško kartico SD. Tokrat si bomo najprej ogledali tudi zgradbo zelo zmogljivega in svojevrstnega Tensilica L106 procesorja v jedru ESP8266 modulov ter nadaljevali s primeri njegove uporabe.
Ta vsebina je samo za naročnike
Srce ESP8266
Cadence Tensilica Diamons L106 Processor Core
V preteklih nadaljevanjih smo omenili kitajskega proizvajalca ESPRESSIF Systems, pri katerem so razvili originalne ESP8266 module, kasneje pa tudi zmogljivejše ESP32, ter zagonsko vgrajeno programsko opremo zanje. V vseh bijejo izjemno zmogljivi in inovativni 32-bitni mikrokontrolerji z enim (ESP8266) ali dvema jedroma (nekateri ESP32) z RISC arhitekturo Xtensa ameriškega podjetja Cadence Tensilica iz Silicijeve doline, ki omogočajo celo dopolnjevanje osnovnega nabora strojnih ukazov. Gre za konkurenčni dizajn, v svetu uveljavljenih ARM procesorjev (predvsem za pametne telefone), katerih načrte kupujejo proizvajalci čipov, jih prilagodijo svojim potrebam in izdelajo lastne procesorske čipe. Tensilicina Xtensa arhitektura je sicer javnosti manj poznana, vendar pa velja izpostaviti nekaj njenih ključnih odlik, kot so: možnost programske implementacije v FPGA vezjih, nizko energetska zasnova in napreden dizajn, s katerim se lahko kosa s procesorskimi in mikrokontrolerskimi družinami ARM in Cortex.
Družina Diamonds mikrokontrolerskih in procesorskih jeder obsega: 106Micro, 108Mini, 212GP, 232L in 570T. Jedro 106Micro je najmanjše, ima najmanjšo porabo energije ter vključuje lastni statični RAM, kljub temu pa dosega zmogljivost precej večjih procesnih enot. Še posebej primeren je za gradnjo sistemov v enem čipu (SoC). Je pa res, da ne premore lastnega EEPROMa, ali drugega bralnega pomnilnika, v katerega trajno shranimo svoje programe, zato ga moramo dodati v posebnem čipu.
Jedro Diamond Standard 106Micro, na katerem temelji procesor L106 in so ga pri Tensilici prvič predstavili že leta 2007, je namenjeno enostavnim krmilnim aplikacijam, hkrati pa omogoča migracijo programske kode iz starejših 8-bitnih in 16-bitnih mikrokontrolerjev. Za izgradnjo lastnih procesorjev na njegovi osnovi so na voljo različna načrtovalska orodja; tako za gradnjo strojne opreme, kakor tudi za načrtovanje dodatnih strojnih ukazov, s katerimi lahko v svojem dizajnu pohitrimo kritične funkcije, ne da bi za to potrebovali dodatna namenska vezja. Prav tako imamo na voljo širok nabor perifernih enot, od krmilnikov digitalnih vhodov in izhodov, A/D in D/A pretvornikov, vmesnikov za zaporedne komunikacije, do USB vmesnika ter žičnih Ethernet in Wi-Fi vmesnikov, ki zagotavljajo različne možnosti za izdelavo krmilij in njihovo komunikacijo z internetnimi omrežji, še posebej IoT. Čipe s procesorskimi jedri 106Micro je mogoče izdelati z različno natančnimi tranzistorskimi tehnologijami. Z bolj natančnim, denimo 90 nm proizvodnim procesom, lahko izdelalo procesorje z enim ali več jedri, ki delujejo pri taktu do 400 MHz in imajo vgrajenega do 256 kB SRAM. Kljub temu ne preseneča, da procesorska jedra ESP8266 in ESP32 delujejo pri precej nižjih taktih (80 MHz ali 160 MHz), saj je pri IoT krmilnikih navadno ključna nizka poraba energije.
106Micro Diamond Standard core (LX3), ima harvardsko procesorsko arhitekturo, oziroma ločena pomnilnika SRAM za ukaze in podatke s po največ 128 kB, s tem pa tudi hitrejše delovanje. Pri Espressif Systems v specifikaciji ESP8266 navajajo, da je za uporabniške programe in podatke na voljo okoli 50 kB pomnilnika, sicer pa je vsega pomnilnika za ukaze 64 kB, za podatke pa 96 kB. Obenem je vgrajenega še 64 kB ROM za zagonske programe, ki omogočajo različne načine zagona in programiranje preko vmesnika UART (protokol TTL RS-232). Vsekakor ne smemo pozabiti, da mora biti del pomnilnika uporabljen tudi za komunikacije Wi-Fi. Kakorkoli, mikrokontroler L106 omogoča, da preko vodila SPI dodamo še do 16 MB Flash RAM-a, vendar ga je v znanih različicah ESP8266 precej manj.
Nabor strojnih ukazov Xtensa ISA vsebuje 16-bitne in 24-bitne ukazne besede, ki jih lahko v programih medsebojno izmenjujemo, s čemer lahko znatno zmanjšamo oziroma optimiziramo velikost pomnilnika, potrebno za hrambo strojne kode. Razvojno okolje Xtensa Xplorer z grafičnim vmesnikom, temelječe na IBMovem Eclipsu, povezuje vsa programska orodja za razvoj programske kode za Tensilica mikrokontrolerje. Za prevajanje programske kode so razvili programski prevajalnik XCC C/C++. Periferne enote mikrokontrolerja L106 so: UART (RS-232 in drugi zaporedni komunikacijski protokoli), SDIO, SPI, I2C, I2S, in infrardeči vmesnik.
Čeprav je Mikrokontroler L106 v ESP8266 kar se da minimalističen in se osredotoča predvsem na zagotavljanje Wi-Fi komunikacije za druge mikrokontrolerske sisteme ter podatkovno komunikacijo prek vodil I2C in SPI, ESP32 ni več le komunikacijski vmesnik, ampak združuje tudi najpogosteješe mikrokontrolerske funkcionalnosti, med katerimi so tudi strojna podpora za impulzno-širinsko modulacijo (PWM), veliko več vhodno-izhodnih priključkov, naprednejši A/D pretvornik z vhodnim multiplekserjem in celo D/A pretvornik.
Srce ESP32
Cadence Tensilica LX6 Processor Core
Večina ESP32 mikrokontrolerjev ima po dve procesorski jedri, pri čemer model ESP32-S0WD, z enim jedrom, zmore do 200 MIPS, zmogljivejši, ESP32-D2WD, pa do 400 MIPS. Omenjena ESP32 imata tudi 448 kB ROMa in 520 Kb SRAMa ter 16 Kb SRAMa v uri realnega časa (funkcijska enota RTC). Med funkcijskimi enotami so 18-kanalni 12-bitni A/D pretvornik, priključki 10 tipal, občutljivih na dotik, 4 SPI enote, po dve I2S in I2C enoti, enota SDIO/SPI, trije UART vmesniki, vmesnik za Ethernet (potrebujemo še zunanje prilagoditveno vezje z ločilnim transformatorjem), vmesnik za vodilo CAN 2.0, infrardeči vmesnik, enote za impulzno-širinsko modulacijo za krmiljenje motorja (motor PWM) ter enota za PWM za krmiljenje do 16 posameznih izhodov. ESP32 omogoča tudi uporabo varnostnega kodiranja zunanjega Flash RAMa in varni zagon. Na voljo so algoritmi za varnostno kodiranje AES, RSA in SHA-2. Slednjega uporabljamo pri izračunu kod za preverjanje pristnosti vsebin (hash codes). Poleg tega imamo na voljo tudi varnostno kodiranje z odpravo napak, ECC, vsekakor pa tudi generator naključnih števil.
Tako, opisali smo nekaj podrobnosti zgradbe ESP8266 in ESP32, zdaj se spet lotimo praktičnih primerov uporabe…
Kako omrežno napravo pravilno povezati z dostopno točko?
Čeprav se zdi ustvarjanje samostojnih dostopnih točk v ESP8266 odlična rešitev, s katero se izognemo potrebi po siceršnji omrežni infrastrukturi, ki jo predstavlja npr. domači Wi-Fi usmerjevalnik, ima tudi nekatere slabosti. Wi-Fi usmerjevalniki navadno podpirajo storitev DHCP, s katero na novo povezanim računalnikom dodelijo začasne IP naslove, enostavna dostopna točka v ESP8266 pa take storitve navadno nima. Zato moramo v računalnik, s katerim se želimo povezati z dostopno točko predhodno sami vnesti ustrezen IP naslov, ki je v enakem segmentu omrežja, kot dostopna točka.
Denimo, če dostopni točke izberemo naslov 192.168.4.1 in omrežno masko 255.255.255.0 (segment z 256 različnimi IP naslovi), lahko v odjemalski računalnik vnesemo naslov 192.168.4.2. Če imamo več odjemalskih računalnikov, moramo vsakemu izbrati unikatni naslov. Če tega ne storimo, bomo po morebitni uspešni povezavi z ESP8266 kot dostopno točko ugotovili, da se ne moremo povezati z nobeno od njenih spletnih storitev. Kako napako odkrijemo? Denimo, če pri poskusu s spletno storitvijo, npr- HTTP(S) ali telnetom, dobimo napako Connection refused (slov. povezava zavrnjena) pa za njeno uporabo v programu nismo zahtevali vnosa poverilnic, je skoraj gotovo težava v omrežni povezavi in ne v spletni storitvi. Pri tem moramo upoštevati tudi, da navadno identifikacijska oznaka dostopne točke (SSID) in geslo vzpostavite Wi-Fi povezave z njo nimata nič skupnega z morebitnim uporabniškim imenom in geslom za dostop do posamezne spletne storitve v omrežji Wi-Fi.
Hitre komunikacij
Telnet za krmiljenje robota
Telnet se morda res zdi kot zastarela oblika tekstovne komunikacije, ki izvira še iz časov analognih modemov, vendar je vseeno več kot dobrodošla, kadar si želimo preproste in učinkovite komunikacije preko internetnih omrežij. Denimo, če bi hoteli iz PC z igralno palico preko Wi-Fi krmiliti robota, bi bil telenet enostavnejša in odzivnejša rešitev od krmiljenja preko robotovega spletnega strežnika, saj omogoča pošiljanje kratkih krmilnih kod, brez nepotrebne »strukturne navlake«, ki jo moramo posredovati, na primer pri protokolu HTTP. Slednjega lahko sicer vseeno vzpostavimo in spletno stran uporabljamo za razne nastavitve robotovega delovanja.
Denimo, za krmiljenje robotskega avtomobila na daljavo potrebujemo le štiri ukaze: naprej, nazaj, levo in desno, pri čemer lahko skupaj nastopata največ po dva ukaza. Pri tem trajanje vsakega ukaza ustreza trajanju premikanja robota, ukaza naprej in nazaj ter ukaza levo in desno pa se medsebojno izključujeta. Če želimo uravnavati tudi hitrost premikanja, lahko namesto omenjenih ukazov uporabimo enoten ukaz, v katerem vsakokrat navedemo hitrosti vrtenj pogonskega motorja in motorja za obračanje prednjih koles. Pri tem odsotnost ukazov pomeni, da se mora robot ustaviti… Zdaj, ko imamo motivacijo, se lahko lotimo implementacije telneta…
Primerov, kako vzpostaviti Telnet povezavo je v spletu kar nekaj, vendar skoraj noben ne podpira celotnega protokola z vsemi standardnimi ukazi RFC, temveč večina le zaporedni prenos podatkov, kot ga poznamo pri protokolu RS-232. Zato bomo morda razočarani ugotovili, da Telnet v nekaterih primerih ne deluje pravilno. Telnet v primerjavi s HTTP(S) strežnikom kljub temu ni kdove kako zapletena funkcionalnost in moram priznati, da z (ne)RFC implementacije telneta nisem imel težav.
Zato pa sem se kar nekaj časa ukvarjal z zloveščo napako Connection refused. Po tem sta terminalska odjemalca Terminus(Termius-4.5.3.apk) in Telnet (Simple Telnet Client_v2.15_apkpure.com.apk), ki ju lahko zastonj prenesemo iz Google Play ali neposredno iz spletne strani avtorjev, delovala odlično. Še posebej moram pohvaliti Teminus, ki razume tudi osnovne terminalske ukaze, tako da lahko kontrolno besedilo (npr. koliko časa je minilo od zagona aplikacije ipd.) izpisuje tudi v eni vrstici, medtem ko je Telnet kar se da preprost odjemalec, ki razume samo ukaz za prehod v novo vrstico, kar je podobno, kot če bi medsebojno povezali dva ESP modula, bi delovalo pod pogojem, da bi na enem od modulov uporabili primer za Telnet strežnik, Arduino primer WiFiTelnetToSerial, na drugem pa za Telnet odjemalca, Arduino primer TelnetClient.
Napredni spletni strežnik
Funkcionalnosti spletnega strežnika lahko obogatimo z različnimi grafičnimi elementi, zaradi česar je še posebej zanimiv primer AdvancedWebServer, v katerem lahko vidimo, kako narišemo graf izmerjenih vrednosti. Tehniko lahko uporabimo, na primer za izris časovnega diagrama izmerjenih digitaliziranih vrednosti iz A/D pretvornika. Tak način prikaza lahko izkoristimo, denimo tudi pri meritvah temperature v določenem časovnem obdobju.
Za izris grafa je uporabljena tehnika sprotne tvorbe grafične vsebine v obliki tekstovnega zapisa svg+xml, ki ga lahko prikažemo s spletnim strežnikom. Pri tem moramo opredeliti več grafičnih elementov, ki se izrišejo v pravilnem zaporedju. V beli pravokotnik s črnim robom velikosti 400 x 700, ki dobro izkoristi prikazovalnik pametnega telefona, narišemo zvezni graf kot zaporedje med seboj povezanih premic, ki jim lahko poljubno določimo barvo in debelino. Pri tem sproti nastaja tekstovni zapis celotnega grafa v XML obliki, ki ga lahko v obliki znakovnega niza posredujemo funkciji server. send, ki ga izriše na prikazovalnikih odjemalcev.
Prikaz naprednih funkcionalnosti spletnega strežnika in funkcionalnosti dostopne točke je tudi v primeru WiFiEvents, v katerem so primeri treh povratno klicanih funkcij za štiri dogodke: povezava s strežnikom, prekinitev povezave, zahteva za osnovno podatke strežnika iz oddaljene delovne postaje (angl. probe request). Povratno klicane funkcije vzpostavimo z ukazi, kot je: stationConnectedHandler = WiFi.onSoftAPModeStationConnected(&onStationConnected). Pri tem mora biti stationConnectedHandler tipa WiFiEventHandler. V opisanem primeru je tako onStationConnected ime povratno klicane funkcije, v katerih obdelamo dogodek onSoftAPModeStationConnected. V splošnem imamo tako <ime strukture za upravljanje z dogodki>= WiFi.<ime dogodka>(<naslov povratno klicane funkcije, ki se sproži, ko se dogodek zgodi>. Primer povratno klicane funkcije za omenjeni dogodek je Program 2. Vhodni parameter je struktura s podatki o dogodku. V našem primeru vsebuje le MAC naslov delovne postaje, ki se je povezala s spletnim strežnikom ob dogodku onSoftAPModeProbeRequestReceived.
Kot vidimo, lahko s pomočjo dogodkov tudi v enostavnem spletnem strežniku vodimo zgodovino prijav in odjav s strežnika. Preverjamo lahko tudi, kolikokrat so druge delovne postaje od strežnika zahtevale naj sporoči svoje javno dostopne podatke, oziroma SSID in MAC, ki naj bi enolično določala vsako dostopno točko. Ob tem omenimo, da ima vsaka dostopna točka v ESP8266 vsaj 2 MAC, eno kot delovna postaja in drugo kot dostopna točka. Kadar deluje damo kot delovne postaja je v rabi MAC za delovno postajo, kadar deluje kot dostopna točka, MAC za dostopno točko, kadar pa je v obeh vlogah pa oba MAC.
Spletna stran PC USB Projects na SD kartici
SDWebServer je še nekoliko zanimivejši in poučnejši primer naprednega spletnega strežnika, ki lahko prikaže spletne strani, katerih vsebino hranimo na SD kartici. Glede na pomnilniške zmogljivosti današnjih SD kartic lahko trdimo, da je 32 GB ali več vsekakor kot dovolj, da lahko tako izkoristimo prav vse večpredstavne možnosti, ki nam jih daje ESP8266 kot spletni strežnik. Prenos podatkov preko Wi-Fi poteka dovolj hitro, da lahko spletne strani z želeno oblikovno in grafično podobo hitro prikažemo na pametnem telefonu ali drugem odjemalskem računalniku z Wi-Fi povezavo. Vsekakor pa lahko novo vsebino spletne strani naložimo na SD kartico brez ponovnega programiranja ESP8266. Dovolj je, če po vstavitvi SD kartice z novo vsebino ESP8266 ponovno zaženemo.
Zdaj pa še nekaj o testiranju zmogljivosti. Osnovi primer spletne strani je priložen in ga najdemo v datotečni mapi SdRoot, ki jo moramo predhodno skopirati v korenski imenik SD kartica. Je pa res, da mapo SdRoot ni ravno enostavno poiskati, saj je pot do njega običajno naslednja C:Users<ime uporabnika windows, za katerega je nameščeno razvojno okolje Arduino>AppDataLocalArduino15packagesesp8266hardwareesp82662.5.2librariesESP8266WebServerexamplesSDWebServer. Vsebina je kljub temu enostavna, saj vsebuje le sliko pins.png, datoteko index.htm ter mapo edit z datoteko index.htm, ki omogoča urejanje vsebine SD kartice. Vendar slednja vsebuje kodo v javascriptu, ki se lahko izvede le, če imamo na voljo povezavo v Internet, preko katere iz javnega spletnega oblaka zaženemo urejevalnik ace.js (koda: <script src=”https://cdnjs.cloudflare.com/ajax/libs/ace/1.1.9/ace.js” type=”text/javascript” charset=”utf-8″></script>). Vseeno je dobra novice za vse, ki si želijo implementacije ACE v lastnem omrežju, da so izvorna koda in navodila za izgradnjo in uporabo na voljo na spletni strani: https://github.com/ajaxorg/ace.
Na koncu sem želel preizkusiti še prikaz kompleksne spletne strani. Kopijo spletne strani PC USB Projects hranim na domačem računalniku. Zato si nisem mogel kaj, da ne bi preizkusil kako deluje na nekoliko prilagojenem naprednem spletnem strežniku SDWebServer na ESP8266-13 z 32 GB mikroSD kartico z datotečnim sistemom exFAT. Resda grafika ni bila popolna, zato pa je bila vsebina, razen slik, od katerih nekatere ESP8266-13 ni uspel prikazati, na pametnem telefonu odlično berljiva in bi se jo vsekakor dalo dokaj hitro prilagoditi tudi za celosten prikaz na ESP8266. Posebno poglavje je video, ki je shranjen YouTubovih strežnikih, a tudi tega bi lahko v obliko originalni datotek shranil v spletno stran.
Še nekaj o prilagoditvah spletnega strežnika! Originalni SDWebServer ne ve, da je vsebino datotek tipa *.html mogoče prikazati na enak način kot datoteke *.htm. Prav tako mora vedeti, da je prva datoteka spletne strani raje index.html kot index.htm. Vse, kar moramo spremeniti je torej ime prve datoteke spletne strani in dodati pogojni stavek (if), s katerim določimo tip vsebine datotek *.html enako kot za *.htm. Nato je dovolj, da vsebino spletne strani prekopiramo na SD kartico in zaženemo z ESP8266.
Espruino in Javascript
ESP8266 in ESP32 lahko programiramo tudi v Javascriptu, ki je priljubljen programski jezik med programerji spletni strani. Za vstop v svet Espruina moramo v ESP modul najprej naložiti ustrezne binarne datoteke, ki jih lahko prenesemo iz spletne strani http://www.espruino.com. A poudarimo, da je Espruino sicer veliko širši projekt, saj podpira veliko množico podobnih razvojnih plošč, le da večina nima vgrajenega Wi-Fi vmesnika.
Implementacija Espruina za ESP8266 podpira vse tri načine delovanja: kot dostopna točka, kot delovna postaja in kot kombinacija obeh. Kljub temu avtorji opozarjajo, da je delovanje na način dostopne točke nekoliko omejujoče, saj se lahko hkrati z ESP8266 povežejo največ štirje odjemalci, ki pa prek ESP8266 ne morejo medsebojno komunicirati. D/A pretvornika, ki ga imajo nekatere druge razvojne plošče Espduino, ESP8266 nima, zato tudi ni podpore zanj. Impulzno-širinska modulacija (PWM) je zaradi odsotnosti stroje podpore zanjo podprta le programsko. Kritika avtorjev Espruina leti tudi na sorazmerno majhno število splošno namenskih vhodno-izhodnih priključkov (GPIO), kar pa je mogoče spremeniti le, če namesto njega uporabimo novejši ESP32 z 32 GPIO.
Podpora Espruino za ESP32 je pestrejša, saj vključuje strojne SPI, I2C, A/D in D/A pretvornik, UART in Wi-Fi. A žal podpore za osveževanje vgrajene opreme preko Wi-Fi še ni. Prav tako ni mogoče komunicirati z napravami Bluetooth in BLE. Ostalo je podobno, kot pri ESP8266.
Poglejmo še nekaj podrobnosti implementacije Espruino za ESP8266: GPIO pri ESP8266 lahko nastavimo kot digitalne vhode, digitalne izhode, ali digitalne izhode z odprtim kolektorjem. Pri slednjem načinu delovanja je v L106 čip vgrajena izhodna upornost proti napajanju med 20 kOhm in 50 kOhm, kar je pogosto premalo in moramo zato dodati tudi zunanje upore. Preslikava priključkov od GPIO0 do GPIO15 na bite krmilnih registrov, od D0 do D15, je neposredna, vendar sta GPIO6 in GPIO11 uporabljena za SPI povezavo s Flash RAMom, zato nista dostopna na zunanjih priključkih modula. Nedolgo nazaj je bil v Espruinu podprt je tudi priključek GPIO16, vendar ga naj ne bi uporabljali, če uporabljamo tudi način delovanja globoko spanje, v katerem porabi ESP8266 najmanj energije.
Med podprtimi funkcionalnostmi velja omeniti še digitalPulse (funkcionalnosti digitalnega impulza), ki je implementirana s pomočjo strojne podpore in omogoča tvorjenje vlaka digitalnih impulzov, daljših od 10 ms. Po drugi strani, funkcija setWatch zajema zunanje impulze in jih uvršča v časovno vrsto z največ 16 elementi. Na ta način lahko programi v Javi obdelajo vse zahteve.
Funkcija analogRead, kot že samo ime pove, bere digitalizirane vrednosti iz A/D pretvornika, povezanega z analognim vhodom A0, oziroma priključkom TOUT (GPIO6). Zanimiva je tudi funkcija analogWrite, s katero krmilimo generator signalov PWM, deluje s pomočjo časovnika. Nastavljamo lahko razmerje trajanje stanja 0 in 1 ter frekvenco impulzov.
RTC (ura realnega časa) je pri ESP8266 poglavje zase. Čeprav nam dajo sistemske funkcije, kot sta system_get_time() in system_get_rtc_time() zmotno misliti, da imamo na voljo uro realnega časa s koledarjem, obe vračata le 32-bitni vrednosti sistemskih števcev. Prvi se poveča za 1 na vsako 1 µs, drugi pa na vsakih 57 µs. Espruino se merjenja realnega časa zato raje loteva s funkcijo jshGetSystemTime(), pri kateri le začetno vrednost nastavi s pomočjo sistemskega časovnika. Programerju, po drugi strani, ponudi funkciji getTime() in setTime(), s katerima lahko nastavimo in beremo realni čas v urah, minutah in sekundah.
ESP8266 navadno deluje z 80 MHz, vgradna programska oprema Espruino pa ob zagonu frekvenco poviša na 160 MHz. Z ukazom require(“ESP8266”).setCPUFreq(80) jo lahko ponovno znižamo za polovico. Vsekakor slednje vpliva tudi na porabo energije.
Okolje Espduino porabi za svoje delovanje več kot 400 kB Flash RAM, zato ga pri prvih različicah ESP8266 s 512 kB Flash RAMa ostane za uporabniške aplikacije bore malo. Novejše različice s 4 MB Flash RAMa so tu v veliko prednosti, vendar Espruino lahko uporabi največ 1 MB Flash RAMa, več naj bi zmogle prihajajoče različice datotečnega sistema spiffs.
Celotno kodo večine primerov najdete v razvojnem okolji Arduino, nekaj primerov pa je objavljenih tudi na spletni strani https://sites.google.com/site/pcusbprojects.
Prihodnjič
Če smo tokrat največ časa namenili delu s spletnim strežnikom, se bomo prihodnjič bolj posvetili konkretnim problemom in razmišljali o domačih projektih, pri katerih bi lahko koristno uporabili ESP8266. Zgraditi hočemo programsko opremo za krmilnik, s katerim bomo lahko upravljali domače gospodinjske aparate in celo otroške igrače. Popravili bomo tudi motoriziran model traktorja s prikolico, ki je po odpovedi daljinskega upravljalnika nesrečno obležal na omari. Poleg novega krmilnika mu bomo dodali še tipala, da bomo vedeli, koliko energije je še v bateriji, kako daleč je od ovir ipd.______________
Program 1: Funkcija za izris poljubnega črtnega grafa v spletno stran
void drawGraph(){ String out = »«; char temp[100]; out += »<svg xmlns=«http://www.w3.org/2000/svg« version=«1.1« width=«400« height=«700«>n«; out += »<rect width=«400« height=«700« fill=«rgb(250, 230, 210)« stroke-width=«1« stroke=«rgb(0, 0, 0)« />n«; out += »<g stroke=«black«>n«; int y = 340; for (int x = 10; x < 390; x += 10) { int y2 =x*(1+x/10) % 680; sprintf(temp, »<line x1=«%d« y1=«%d« x2=«%d« y2=«%d« stroke-width=«1« />n«, x, 700 - y, x + 10, 700 - y2); out += temp;y = y2; } out += »</g>n</svg>n«;server.send(200, »image/svg+xml«, out); }
Program 2: Funkcija za procesiranje dogodka ob priklopu nove delovne postaje na dostopno točko
void onStationConnected(const WiFiEventSoftAPModeStationConnected& evt) { Serial.print(»Station connected: »); Serial.println(macToString(evt.mac)); }
Program 3: Funkcija v Javi v okolju Espruino za vzpostavitev dostopne točke
var wifi = require(»Wifi«); wifi.connect(ssid, {password:password}, function(e) { if (e) { console.log('Error during connect:',e); wifi.disconnect(); } else { console.log('Connected to',ssid); wifi.stopAP(); } });