Članek opisuje digitalni prikazovalnik, ki uporablja nizkocenovne LED matrične plošče, ki so enostavno dobavljive.
Avtor: Brian Millier
E-pošta: bmillier1@gmail.com
2022-307-28
Na voljo so v različnih velikostih in konfiguracijah, vendar na splošno temeljijo na 8×8 matriki LED-ic, ki jih poganja en sam LED gonilnik MAX7219. Uporabil sem štiri plošče 32×8 slikovnih pik, od katerih vsaka vsebuje štiri MAX7219 (za skupno ločljivost 128×8 slikovnih pik).
Ta vsebina je samo za naročnike
Ta projekt omogoča prikaz besedila (do 300 znakov) z gladkim pomikanjem katerega koli sporočila, ki presega 21 znakov širine zaslona. Občasno prikažem tudi trenutni čas.
Ker bi bil tak zaslon verjetno nameščen nekje, kjer je lahko viden, iz tega sklepamo, da bi bilo verjetno neprijetno vnašati besedilo, ki bi ga želeli prikazati, če bi to bilo treba narediti na samem zaslonu. Zato je bila zaželena neka oblika brezžične povezljivosti. LED matrični zasloni potrebujejo samo 3-žični vmesnik SPI, zato je bil izbran poceni MCU ESP8266, saj ima tako WiFi kot Bluetooth zmožnosti brezžične povezave.
Poleg vnosa besedila, ki ga želite prikazati, na zaslon ni treba poslati veliko. Zdi se, da je Bluetooth povezava najboljši način za dosego tega. Bluetooth protokol je precej zapleten, saj pokriva veliko različnih primerov uporabe. Vendar pa obstaja preprost Bluetooth UART protokol, ki ga je enostavno implementirati na ESP8266.
Vendar pisanje aplikacije, s katero bi uporabnik komuniciral s prikazovalnikom prek Bluetootha, ni preprosto. Domneval sem, da bi uporabnik na splošno želel vnesti besedilo za prikaz znaka s pametnim telefonom ali tabličnim računalnikom (ker računalnik morda ni blizu ali ima zmožnosti Bluetooth). Osebno uporabljam tablico iPhone in iPad.
Ne da bi se poglobili v podrobnosti, je težko napisati katero koli aplikacijo za te IOS naprave, ne da bi postali Apple razvijalec in lastnik Apple Mac računalnika (potreben je za zagon programske opreme za razvoj aplikacij). Nisem razvijalec in ne uporabljam Apple Mac računalnika. Adafruit je napisal aplikacijo za iOS, ki lahko komunicira z Bluetooth napravo po UART protokolu.
To je prijetna generična aplikacija, ki je uporabna za testiranje Bluetooth projekta, vendar se tej aplikaciji ne prilega popolnoma. Nimam telefona ali Android tablice, zato ne poznam načinov, kako napisati aplikacije za ta operacijski sistem.
Namesto tega sem se odločil uporabiti WiFi možnost ESP8266 modula. V ESP8266 skico implementiram preprost spletni strežnik. Ko se uporabnik pomakne na to spletno mesto, se prikažejo polja, v katera vnesete besedilo, ki ga želite prikazati, pa tudi polje, povezano s prikazom časa (več o tem kasneje).
Glede izbire uporabe spletnega vmesnika sem videl dve različni situaciji:
- Znak se nahaja na območju, ki že ima WiFi dostopno točko. ESP8266 se lahko poveže z javno WiFi dostopno točko z uporabo WPA2 (SSID in geslo) zaščite. Če pa je uporabljena varnost na ravni WPA2 Enterprise, potem standardne Arduino WiFi knjižnice tega ne podpirajo. Poskušal sem zagnati primere Arduino skic, ki naj bi delovale z WPA2 Enterprise varnostjo, medtem ko sem še delal na Dalhousie univerzi (ki je uporabljala to varnostno možnost). Nikoli mi ga ni uspelo spraviti v delo.
- Kadar nima uporabne WiFi dostopne točke, lahko ESP8266 postavite v način dostopne točke. Nato lahko komunicirate z njim tako, da preklopite WiFi povezavo telefona/tabličnega računalnika na ESP8266 in se nato pomaknete do fiksnega URL-ja:
http://192.168.1.4
Za ta projekt sem napisal dve ločeni skici – po eno za vsako od zgornjih dveh situacij. Poleg različic kode, ki so potrebne za obvladovanje dveh različnih WiFi načinov, obstajajo tudi razlike v strojni in drugi programski opremi med obema različicama. Ena od teh različic je način implementacije ure realnega časa.
Zdaj, ko imate splošno predstavo o digitalnem prikazovalniku, poglejmo, kako delujejo LED matrični zasloni in kako so povezani z ESP8266.
MAX7219 krmilnik za LED displej
Poceni LED matrične plošče, ki so na voljo, običajno uporabljajo LED 8 x 8 matriko s spremenljivim številom takih modulov, povezanih skupaj na eno tiskano vezje, v različnih geometrijah. Vsi moduli, ki sem si jih ogledal, temeljijo na Maximovem IC LED gonilniku MAX7219. Slika 1 prikazuje eno od štirih enot, ki sem jih uporabil za ta projekt. Na način, na katerega so ti zaslonski moduli zasnovani, je MAX7219 nameščen pod LED matričnim modulom, tako da niso vidni.
To omenjam zato, ker me zanima izvor MAX7219 naprav, ki se uporabljajo na teh ploščah. Ko poiščem Maxim MAX7219 na spletnem mestu mojega distributerja, je cena teh čipov približno 11 kanadskih dolarjev v količini 500 kosov in navedena cena ne pade veliko več, ko dosežete prag 250. LED 32×8 matrične plošče, ki sem jih uporabil v tem projektu, zahtevajo štiri MAX7219, pa tudi štiri 8×8 LED module in seveda TIV.
Za te plošče sem od kanadskega dobavitelja plačal samo 9 kanadskih dolarjev in mislim, da so veliko cenejše, če jih kupite neposredno od kitajskih prodajalcev. Glede na to neskladje predvidevam, da te plošče vsebujejo Maxim MAX7219 klone. Ne glede na vir, ti moduli delujejo dobro, če se uporabljajo z Arduino knjižnicami, napisanimi za LED gonilnik zaslona MAX7219.
Poglejmo, kako delujejo MAX7219 LED gonilniki. Vsak MAX7219 lahko poganja do 64 LED-ic z uporabo multipleksirane razporeditve z 8 stolpci in 8 vrsticami. To zmanjša LED ožičenje na samo 16 linij, MAX7219 pa je na voljo v 24-pinskem DIP ali SOIC ohišju. Pri takšni shemi multipleksiranja so posamezne LED-ice prižgane le 1/8 časa. Vendar pa lahko pri tako nizkem delovnem ciklu LED-ice poganja tok, ki je veliko višji od običajnega najvišjega dovoljenega trajnega toka, ki lahko teče skozi LED.
Vsekakor pa ti paneli zagotavljajo zelo svetel zaslon, ki ga je mogoče videti na daljavo. MAX7219 vsebuje PWM generator intenzitete, ki omogoča različne stopnje svetlosti v razponu od 1/32 do 31/32 polne svetlosti v 16 korakih. Obstaja pin za intenziteto (ISET), ki programira največjo svetilnost, ki jo nastavi zunanji upor. Ta upor ni viden na ploščah matričnega zaslona, saj se nahaja pod LED modulom.
MAX7219 je povezan z MCU z uporabo serijskega protokola, ki je v bistvu enosmerni SPI vmesnik. DIN linija MAX7219 se poveže z MOSI priključkom, CLK priključek se poveže z linijo SCLK in linija LOAD se poveže s CS MCU linijo SPI vmesnika. Kar se MAX7219 razlikuje od običajnega SPI vmesnika, je način, na katerega upravlja povezavo večjega števila naprav. Naprava MAX7219 poleg zgoraj omenjenih vsebuje tudi DOUT priključek.
Podatke serijsko pomikamo v DIN priključek MAX7219 in se premikajo skozi notranji 16-stopenjski pomikalni register in se nato pojavijo na DOUT priključku. Če torej želite krmiliti štiri MAX7219, preprosto pošljete štiri 16-bitne vrednosti prek SPI vrat: eno 16-bitno število na napravo. Nato postavite CS linijo na logično enico in vsi štirje MAX7219 bodo naloženi s specifično 16-bitno vrednostjo, ki je ciljno usmerjena za to napravo. MAX7219 lahko prenese SPI hitrost do 10 MHz, tako da lahko veliko teh enot povežete v serijo in še vedno dosežete dostojno hitrost posodabljanja zaslona.
MAX7219 je 5-volten čip in ne bo deloval pri 3,3 V, ki jo uporabljajo številni sodobni MCU-ji. Glede na to, katere barve LED so bile uporabljene, lahko LED-ice same potrebujejo do 3,5 voltov, zato je specifikacija 5-voltnega napajanja za MAX7219 smiselna. Vendar pa je digitalne linije MAX7219 mogoče poganjati neposredno s 3,3-V logiko, tako da je povezava s SPI vrati ESP8266 neposredna (niso potrebna vezja za prilagajanje napetostnega nivoja).
MAX7219 lahko deluje v dveh različnih načinih. Če je povezan z multipleksiranim 7-segmentnim LED displejem, bi bil nastavljen za način dekodiranja. V tem primeru je za vsako številko ločen register in vsak register naložite s 4-bitno vrednost, ki ustreza BCD vrednosti števila, ki ga želite prikazati (ali črkam H,E,L,P).
Vendar pa se za LED matriko uporablja način brez dekodiranja. V tem primeru je vsak od osmih registrov številk naložen z 8-bitno vrednostjo, ki prižge ustreznih 8 LED-ic v danem stolpcu glede na to vrednost.
Vse podrobnosti, ki so potrebne za krmiljenje MAX7219, urejajo Arduino knjižnice na visoki ravni in na voljo jih je več. V nekaterih primerih so te knjižnice zgrajene na Adafruit GFX knjižnici, ki je v bistvu abstraktna plast, ki omogoča grafične operacije na številnih različnih LED matričnih zaslonih, ki jih poganja več različnih MCU.
Eno od pomembnih dejstev pri izbiri določene knjižnice se nanaša na postavitev LED-ic na matričnem zaslonu, ki ga uporabljate. Zaslon, ki ga uporabljam, ima štiri 8×8 LED module, nameščene drug ob drugem. Kot lahko vidite na sliki 2, so njihovi vhodno/izhodni priključki nameščeni tako, da lahko kaskadno povežete toliko modulov v vrsti, kolikor jih potrebujete, da dosežete matriko “N” z 8 LED, ki je potrebna za vaš zaslon.
Ko sem prvič priključil enega od teh zaslonov in ga krmilil s pomočjo Arduino knjižnice, ki sem jo našel, je zaslon deloval v redu. Vendar je bila orientacija znakov taka, da jih je zaslon obravnaval kot da je 8 LED-ic širok in 32 LED-ic visok. Ker sem želel vodoravni znak, ne navpičnega, je bil to problem. Za ta prejšnji projekt sem spremenil to knjižnico tako, da sem zasukal orientacijo za 90 stopinj.
Za ta projekt me je skrbelo, da bi lahko imela široka paleta 32×8 LED matričnih zaslonov, ki so na voljo, svoje LED-ice ožičene v kateri koli od dveh usmeritev. Zato sem si natančneje ogledal različne knjižnice, ki so združljive z Arduino, in našel eno, v kateri lahko izberete orientacijo znakov posebej, za vsak 8×8 matrični modul. To je knjižnica “Max72xxPanel”. Te knjižnice ni več mogoče najti na URL-ju spletnega strežnika, kjer je prvotno gostovala, vendar sem z globljim iskanjem našel njeno kopijo.
Zato skupaj s svojimi datotekami skic vključujem tudi mapo z imenom “arduino-Max72xxPanel-master”, ki vsebuje potrebne datoteke. Ta knjižnica potrebuje Adafruit GFX knjižnico za delovanje, vendar jo je mogoče enostavno dodati v vaš Arduino IDE z uporabo funkcije dodajanja knjižnice in iskanjem Adafruit GFX knjižnice.
Slika 3 je shema projekta. Izkazalo se je, da bi tiskana vezja ESP8266 z nizko porabo energije, ki sem jo zasnoval kot del mojega prejšnjega članka Svet Elektronike na to temo, delovala za ta projekt. Zato sem ga izkoristil. Sestavljen TIV je prikazan na sliki 4.
Ta TIV je bil zasnovan tako, da ga napaja LiPo celica, in vsebuje vezje za zmanjšanje porabe energije. Za ta projekt ni bila uporabljena LiPo baterija, poraba energije ESP8266 pa je nepomembna, saj LED matrika črpa skoraj vso moč. Ta projekt napaja kateri koli 5-voltni napajalnik, ki lahko zagotovi 1,0-1,5 amperov toka (odvisno od tega, kako visoko nastavite intenzivnost svetilnosti LED matrike).
U3 je MIC5323 LDO, ki sem ga uporabljal za regulacijo iz 5 voltov na 3,3 volte, s katerimi napajamo EPS8266. Za ta projekt morate premostiti terminale 1,2 konektorja X3, da omogočite LDO regulator MIC5323. Ker ESP8266 med prenosom potegne približno 350 mA v zelo kratkih konicah, sem na izhod LDO postavil kondenzator C3 s kapacitivnostjo 470 uF, da se spopade s temi kratkimi tokovnimi konicami.
5-voltni vir napajanja neposredno napaja štiri LED matrične zaslone, nanj pa sem postavil kondenzator 1000 uF za obvladovanje morebitnih tokovnih sunkov, ki se lahko pojavijo, ko prvič vklopite enoto. Preden lahko ESP8266 pošlje ukaze MAX7219, da ga konfigurira, se zasloni pogosto vklopijo z vsemi LED-icami vklopljenimi.
3 digitalne krmilne linije na LED matričnih zaslonih so povezane s standardnimi SPI linijami ESP8266:
CLKIN -> ESP8266 IO14 (SCLK) DIN -> ESP8266 IO13 (MOSI) CS -> ESP8266 IO16 (lahko katera koli IO linija, vendar je bila ta na voljo na konektorju X4)
Kot del prvotne zasnove tega TIV-a sem namestil čip MCP79401, uro realnega časa. Za ta projekt je to morda potrebno ali pa tudi ne:
Če je digitalni znak konfiguriran z ESP8266 v načinu “Station mode” (STA), se poveže z razpoložljivo WiFi dostopno točko in uporabnik konfigurira besedilno sporočilo tako, da se pomakne na spletno stran, ki jo ponuja ta enota. V tem primeru ima digitalni znak dostop do interneta in lahko pridobi čas z NTP protokolom, zato MCP79401 RTC (in vse njegove podporne komponente niso potrebne).
Če je digitalni znak konfiguriran z ESP8266 v načinu “Access Point” (AP), mora uporabnik izbrano WiFi dostopno točko telefona/tablice/računalnika preklopiti na dostopno točko digitalnega znaka. V tem primeru digitalni znak nima dostopa do zunanjega interneta, zato ne more uporabiti časovnega NTP strežnika za nastavitev časa. V tem primeru potrebujete MCP79401 RTC in pripadajoče podporne komponente in baterijo.
Ker je bilo to tiskano vezje prvotno zasnovano za zelo nizko porabo, nanj nisem namestil serijski (UART) na USB čip (tj. Silicon labs CP2102 ali enakovreden). Zato je za programiranje potreben USB-Serial kabel, ki mora biti tak, ki uporablja 3,3-voltne logične nivoje. Uporabljam kabel Adafruit ID 954. Namestil sem dve stikali, potrebni za programiranje:
Programiranje: držite to stikalo pritisnjeno, medtem ko je pritiskate tipko za reset, da vstopite v način programiranja.
Reset: standardna tipka za reset MCU.
Na ploščo sem namestil majhen piezo piskač, ki ga krmili IO12 in zunanji 2N3904 tranzistor. Piskač zapiska vsakič, ko se dostopa do spletnega strežnika projekta. To je bilo izključno za moje lastne diagnostične namene, vendar bi bil dober način, da ugotovim, ali je nekdo poskušal motiti zaslon z nekakšnim trolanjem za zavrnitev storitve (DOS).
TIV vsebuje tudi QWIIC/STEMMA vtičnico. To je običajen “standard” ožičenja za priključitev I2C plošč na gostiteljski MCU modul. Čeprav je ne uporabljam za ta projekt, bi tako lahko zelo enostavno priključili modul senzorja temperature/vlažnosti/barometričnega tlaka, da bi prikazali te odčitke. Večina razvojnih plošč za senzorje, ki jih dobavlja Adafruit ali Sparkfun, je opremljena s QWIIC/STEMMA vtičnicami in kabli.
Čeprav prikazujem, da so v projektu uporabljeni štirje LED matrični zasloni, je po potrebi enostavno dodati več displejev. Za vsako 32×8 ploščo bi morali dovoliti približno 0,25 ampera toka (pri 25-odstotni intenzivnosti, ki jo zahtevam v svoji ugnezdeni programski opremi). Sumim, da bi projekt lahko trošil do 4 ampere, če bi LED matrične module zagnal pri 100 % intenzivnosti, vendar tega nisem poskusil, ker se mi zdi 25 % intenzivnost povsem ustrezna. Dodajanje več LED matričnih plošč bi zahtevalo nekaj sprememb ugnezdene programske opreme, vendar ne bi bile preobsežne.
Arduino knjižnica Max72xxPanel
Tako kot večina Arduino knjižnic tudi Max72xxPanel knjižnica deluje z ESP8266 in AVR MCU-ji, na katerih je prvotno temeljil Arduino IDE. Ker uporablja strojna SPI vrata ESP8266, se uporabljajo standardni SPI GPIO priključki, vendar ko ustvarite primerek razreda v skici, morate določiti, kateri GPIO priključek uporabljate za CS linijo:
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerti
calDisplays);
Tukaj ustvarite primerek Max72xxPanel razreda in ga poimenujete matrika. Tukaj določite tudi število MAX7219 naprav, ki se uporabljajo v vašem displeju tako v navpični kot v vodoravni ravnini. Intenzivnost prikaza nastavite v 16 korakih z ukazom matrix.setIntensity(intensity). Prej sem omenil, da bi te matrične zaslonske plošče lahko imele priključke MAX7219 čipa povezane z nizom LED na različne načine, zaradi česar so znaki prikazani v napačni usmerjenosti za vašo predvideno uporabo. To je mogoče popraviti z naslednjimi ukazi v skici:
for (uint8_t i = 0; i < numberOfHorizontalDisplays; i++) { matrix.setRotation(i, 1); }
Navedeni ukazi bodo spremenili vse povezane zaslone v orientacijo »1«, ki je za mojo ploščo pravilno prikazala znake za vodoravno vrsto LED matričnih modulov. Ko sem to zamenjal z “0”, so bili vsi znaki zasukani za 90 stopinj. Z uporabo “2” oziroma “3” lahko dosežete dve drugi možni usmeritvi.
Ukaz matrix.fillscreen(LOW) bo zbrisal zaslon in predvidevam, da lahko preizkusite vse LED tako, da za parameter določite HIGH. Če želite postaviti znake na zaslon, uporabite naslednji ukaz:
matrix.drawChar(i * 6, 0, message[i],
HIGH, LOW, 1);
Message[i] je niz znakov, ki vsebuje besedilo, ki ga želite prikazati. Izraz »i*6« je v bistvu odmik slikovnih pik od leve strani zaslona, pri katerem želite, da se prikaže ASCII znak. Ker je velikost pisave široka 6 slikovnih pik in visoka 8 slikovnih pik, spremenljivka “i” ustreza odmiku glede na število znakov z leve strani zaslona.
Odkril sem, da je vrednost tega horizontalnega odmika slikovnih pik lahko negativna vrednost. Izkazalo se je, da je to pomembno, če implementirate premikajoč zaslon za sporočila, ki so predolga, da bi ustrezala velikosti zaslona. Za pomikanje znakov na zaslonu želite, da se novi znaki pojavijo na desni, stari pa izginejo na levi. Za gladko pomikanje želite, da vsak premik pomeni 1 pomik vodoravnih slikovnih pik.
To pomeni, da bo skrajni levi znak izginil z leve strani zaslona za en stolpec naenkrat. Da bi to dosegli, bi ta skrajni levi znak postavili na odmik, ki se začne pri nič in se nato zmanjša za 1 do 5. Po tem bi ta znak popolnoma zavrgli, naslednji znak postavili na odmik 0 in ponovili postopek.
Funkcija drawChar() pravzaprav ni del Max72xxPanel knjižnice. Namesto tega je vsebovan v Adafruit GFX knjižnici, ki izvaja funkcijo prikaza znakov z uporabo primitiva putpixel() Max72xxPanel knjižnice. Zadnji trije parametri so barva ospredja, barva ozadja in velikost. V resnici ne veljajo za enobarvno LED matrično ploščo, lahko pa obrnete HIGH in LOW parametre in dobite inverzni prikaz, če želite.
Vse operacije, ki postavljajo ali spreminjajo slikovne pike na zaslonu, dejansko izvajajo to funkcijo z manipuliranjem bitov v ESP8266 RAM polju, ki ga nastavi in nadzira Max72xxPanel knjižnica. Če želite dejansko videti te spremembe na samem prikazu matrike, morate po izvedbi teh drugih stavkov priklicati matrix.write() stavek. Adafruit GFX knjižnico sem uporabil za druge vrste LED zaslonov in enako velja tudi tam.
WiFi konfiguracija – Station Mode (STA)
Če ste že uporabljali ESP8266, se uporablja ta standardna konfiguracija. Potrebna je naslednja koda:
const char* ssid = "yourWiFiSSID"; const char* password = "your WiFiPassword"; const char* DisplayPassword = "1234"; // this password must be entered on the web-page to allow user entries IPAddress IP; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP); // this instantiates the NTP Client class
Poleg tega je potrebna tudi naslednja koda znotraj Setup()
// Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); DisplayIPNumberOnLEDMatrix(); // display the sign's IP address on Matrix display // following connects to an NTP server + corrects for local time- UTC difference timeClient.begin(); RetrieveTimeOffsetFromEEPROM(); // user-entered time offset is stored in ESP8266 EEPROM timeClient.setTimeOffset(timeOffset); timeClient.setUpdateInterval(3600000UL); // fetch NTP update every hour (= 3600000 ms) timeClient.update();
WiFi konfiguracija – Access Point Mode (AP)
To se nekoliko razlikuje od zgornjega STA načina:
const char* ssid = "DIGITAL_SIGN"; const char* password = "12345678"; // this is an optional passphrase for the AP const char* DisplayPassword = "1234"; // this password must be entered on the // web-page to allow user entries
Sledi koda v Setup()
WiFi.mode(WIFI_AP); WiFi.softAP(ssid, password); IPAddress myIP = WiFi.softAPIP(); DisplayIPNumberOnLEDMatrix(); // show the AP IP# (this will always be 192.168.1.4)
V tem načinu ne moremo pridobiti časa iz internetnega NTP strežnika, zato koda za NTP odjemalca ni potrebna. Namesto tega je koda za inicializacijo RTC ure narejene z MCP79401:
Wire.begin(); // initialize the I2C port boolean status = RTC_isRunning(); // has the RTC been started up yet? (won't be at first power-up) if (status == true) { Serial.println("RTC is runnning"); } else { Serial.println("RTC is not running- time set to 1:30"); RTC_Write_Time(); // This will start the clock, as well as writing the time } RTC_Read_Time(); // get current time
Če nimate nameščene gumbne baterije, se bo MCP79401 zagnal in nastavil s časom 1:30 vsakič, ko se napajanje vklopi.
Spletni strežnik
Velik del kompleksnosti pisanja kode za spletni strežnik obravnava WebServer ESP8266 razred, ki je postavljen na čelu skice, kot sledi:
ESP8266WebServer server(80);
To bo odprlo razred spletnega strežnika z imenom strežnik, ki bo obravnaval zahteve HTML spletnih strani na privzetih vratih 80. V preteklosti ste za to morda napisali kodo, ki razčleni TCP/IP podatke, ki prihajajo na vrata 80, in jih nato obdela v HTML zahteve, ki ste jih razčlenili.
ESP8266 WebServer razred deluje na višji ravni. V bistvu WebServer knjižnica pričakuje, da v svojo kodo napišete rutine za obdelavo pričakovanih HTML zahtev in jih nato dodelite različnim funkcijam povratnega klica. Povratni klic je v bistvu funkcija prekinitve: ko WebServer knjižnica najde določeno HTML zahtevo v dohodnem podatkovnem toku, se izvede klic rutine, ki ste jo definirali za obdelavo te HTML zahteve.
Z drugimi besedami, ni nujno, da je vaša koda za skico v zanki in nenehno preverja, katere (če sploh kakšna) HTML zahteve so prispele. Ustrezne rutine se pokličejo samodejno. Tukaj je koda, ki nastavi te rutine in zažene spletni strežnik, v primeru AP načina digitalnega displeja:
// enable server callbacks for different web requests received server.on("/", handleRoot); server.on("/postplain/", handlePlain); // this request is received when the Password SUBMIT button is pressed server.on("/postform/", handleForm); // “ “ when the Text box SUBMIT button is pressed server.on("/posttime/", handleTime); // “ “ when the Time box SUBMIT button is pressed server.onNotFound(handleNotFound); server.begin();
Oglejmo si enega od teh povratnih klicev:
server.on("/postplain/", handlePlain);
Ko je sporočilo “/postplain/” prejeto, (kot posledica pritiska na tipko POŠLJI gesla), bo opravljen klic handlePlain() funkcije. V tej funkciji bomo priklicali server.arg(0) funkcijo, ki bo priklicala vsebino polja z geslom na spletni strani.
V bistvu se podobna stvar zgodi, ko pritisnete tipko SUBMIT za polje z znakom Besedilo ali trenutno časovno polje – vrednosti nizov so shranjene v ustreznih lokalnih spremenljivkah RAM-a.
Tabela definicij povratnega klica je podobna za digitalni displej v STA načinu. Vendar v tem primeru ni polja za vnos trenutnega časa. Namesto tega je polje za vnos odmika med lokalnim časom in UTC, ta vrednost pa je shranjena v RAM spremenljivki (shranjena tudi v EEPROM-u ESP8266) in se nato uporablja za prilagoditev časa, ki ga sporoči NTP strežnik, z uporabo naslednjih ukazov:
RetrieveTimeOffsetFromEEPROM(); timeClient.setTimeOffset(timeOffset);
Čeprav sem že prej omenil, da ta shema povratnega klica odpravlja potrebo, da vaša skica nenehno posluša za dohodna HTML sporočila, to ni povsem res. Občasno morate poklicati to funkcijo:
server.handleClient()
Brez občasnega klicanja te funkcije ne bi prišlo do nobene od zgornjih obdelav HTML podatkov.
Zaradi varnosti sem na vrh spletne strani postavil vnosno polje, kamor mora uporabnik vnesti geslo. Definirano geslo je trdo kodirano v skici in ga lahko najdete v glavi skice (prikazano tudi v razdelkih o WiFi konfiguraciji v članku). Da bi digitalni znak prepoznal kateri koli uporabniški vnos v polje Besedilo sporočila ali polja Čas/časovni odmik, je treba to geslo pravilno vnesti za vsak nov vnos besedila sporočila.
Zadnji element spletnega strežnika je dejanska HTML koda, ki jo spletna stran postreže. Koda je shranjena v dolgem nizu v bloku glave blizu vrha programa. Tudi če niste zares seznanjeni s kodiranjem HTML (jaz nisem), ni preveč težko slediti, kako je spletna stran zgrajena. Te HTML kode nisem sestavil sam – prilagodil sem jo le iz primera spletnega strežnika Arduino ESP8266. Slika 5 prikazuje to spletno stran kot servirano za način delovanja dostopne točke.
Slika 6 je fotografija enote med testiranjem, ki deluje iz napajalnika, ki napaja s 5 volti. Slika 7 je fotografija enote v načinu Station. Ob zagonu se poveže z vašim WiFi usmerjevalnikom in za nekaj sekund prikaže IP #, ki mu je dodeljen.
Arduino skici za oba načina delovanja ter uporabljeno knjižnico LED matričnih gonilnikov najdete na spletni strani Svet Elektronike.