Avtor: Brian Millier
2017_258_36
V kolikor uporabljate mikrokontrolerje za projekte, ste brez dvoma že slišali za EPC8266 podjetja Espressif. To je majhen modul, ki vsebuje mikrokontroler z vgrajenim Wi-Fi vmesnikom. Za ceno med 2 do 10 USD lahko dobite različne variante modulov, ki se pričnejo z minimalnim številom GPIO linij do približno 18 I/O priključkov pri dražjih modelih. Te module sem uporabil pri več projektih, ki sem jih opisal v reviji Svet elektronike.
Sredi leta 2016 je Espressif najavil ESP32 modul. To je bil velik korak naprej od ESP8266, zato sem ga nabavil in preizkusil. Kot pri ESP8266 je ESP32 čip kot tak integriran v različne module, ki omogočajo dostop do večjega števila GPIO priključkov, kot jih najdemo na obstoječih ESP8266 modulih. Podjetje Espressif izdeluje WROOM-32 modul, ki vsebuje ESP32 čip, anteno in serijo priključkov na robovih vezja za priklop napajanja, GPIO itd. Ta WROOM-32 modul je bil preimenovan v ESP32 Core Board, ki je znan tudi kot ESP32 Development board.
Ta vsebina je samo za naročnike
Kupil sem torej dve ESP32 razvojni plošči v podjetju Adafruit (ZDA) za približno 15 USD. Kot dodatek WROOM-32 modulu vsebuje CP2102 USB-serijski vmesnik podjetja Silabs, ki se obnaša bodisi kot bootloader med programiranjem in USB serijski pretvornik ves ostali čas. Za razliko od ESP8266 modulov ta modul ne zahteva, da pritisnete »Program« stikalo zato, da bi pričeli s programiranjem. Namesto tega čip CP2102 in njegovi priključki poskrbijo za to, da postavijo ESP32 v reset z ustreznim GPIO priključkom. Nalaganje se prične avtomatično, kar je simpatično.
ESP32 razvojni modul se napaja s 5V, ki jih lahko dobimo iz vgrajene mikro-USB vtičnice ali preko Vin priključka na modulu. Vgrajen napetostni regulator zniža vhodno napetost na 3,3 V, ki jih za napajanje potrebuje ESP32. 3,3 V napajanje lahko uporabljamo za napajanje tudi drugih vezij, ki bi jih imeli v vašem projektu. Pri tem pa pazite, da ne obremenite napetostnega regulatorja preveč. Napetostni regulator je NCP1117, ki z minimalnim hladilnikom lahko prenese približno 1W moči. Torej pri 1,7V padcu napetosti na njemu (5V-3,3V) lahko NCP1117 obremenite s približno 580 mA. Če pa je modul napajan preko USB upoštevajte, da USB vrata zmorejo 500mA toka. Že ESP32 modul pri oddajanju na polni moči potrebuje 240 mA toka, zato ostane od 260 do 340 mA na voljo za zunanja vezja, ki delujejo na 3,3V. Uporabil sem 2,8” in 3,2” TFT LCD displeja skupaj z ESP32, ki sem ju napajal s 3,3V iz NCP1117 regulatorja in vse je delovalo dobro.
Bodite pozorni na to, da GPIO priključki ESP32 NISO 5V tolerantni – morate jih omejiti na 3,3V logične nivoje. Fotografija 1 kaže ESP32 razvojno ploščo, ki jo imam.
WROOM-32 modul se nahaja na levi, regulator je na sredini, USB priključek pa na desni . Eno od dveh mini stikal je ENable stikalo (reset), drugo (BOOT) je povezano na IO0. Kot že omenjeno, sta DTR in RTS liniji vezja CP2102 povezani na te dve liniji in bosta pričeli programiranje avtomatično, če bo gostiteljska PC programska oprema konfigurirana ustrezno. Pa tudi če programska oprema gostitelja ni konfigurirana ustrezno, lahko namesto tega uporabimo te stikali (držite BOOT stikalo in vmes pritisnite EN stikalo).
Poleg samega modula vas verjetno zanima, v katerih jezikih lahko programirate ESP32. ESP32 uporablja Xtensa LX6 32-bit dvojedrni procesor podjetja Tensilica. To NI ARM MCU, kot večina 32-bit popularnih MCU-jev. Ta dvojedrni procesor je to, kar razlikuje ESP32 od ESP8266. Pri ESP8266 ste v svoji programski kodi morali poskrbeti za Wi-Fi funkcije, kot recimo poskrbeti za TCP/IP ali UDP sklad. To je pomenilo, da ste morali pustiti dovolj časa MCU-ju, da je obdelal kompleksni protokol za podatke, ki so prihajali asinhrono. To je bilo lahko neprijetno, če je vaša koda hkrati obdelovala tudi časovno kritične funkcije. Čeprav točne funkcije dvojedrnega procesorja v ESP32 niso poznane poprečnemu uporabniku (meni na primer) je jasno, da procesorske moči, ki jo uporablja vaša aplikacija ni potrebno deliti z Wi-Fi funkcijami, kar olajša vse skupaj.
Ker Xtensa LX6 MCU ni član ARM družine, ne morete uporabiti ARM prevajalnika. Espressif brezplačno omogoča polno »C« programsko orodje za ESP32, vendar ga nisem uporabil: to orodje je mišljeno, da se uporablja na Linux operacijskem sistemu, ki ga jaz ne uporabljam. Če želite iti po tej poti predlagam, da preberete celovit članek v oktobrski reviji Elektor 2017.
Vendar pa je Espressif podobno, kot pri ESP8266, priredil programsko orodje za Arduino IDE. Zaradi tega je ESP32 »C« programiranje precej lažje za veliko Arduino uporabnikov.
Uporaba Arduino IDE z Atmel AVR in ARM čipi je enostavno, saj je podpora za veliko Atmel AVR/ARM vezij že vgrajena. Uporabljam tudi Arduino IDE za Teensy ARM MCU (NXP ARM MCU). S tem, ko so dodali podporo za Teensy vezja, je programiranje tako enostavno kot instaliranje Teensyduino instalacijskega programa. Dodajanje ESP32 podporo v Arduino IDE v Windows okolju je malce bolj komplicirano, ampak odlično dokumentirano: https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/windows.md
To Github spletno mesto vsebuje tudi instrukcije za instalacijo na MAC OS in Linux operacijskih sistemih.
Ta instalacijska metoda vsebuje “git” program za “kloniranje” ESP32 respozitorija z orodji na trdi disk vašega PC-ja. Ta metoda omogoča, da so orodja posodobljena, ker jih lahko ponovno klonirate kasneje, ko so na voljo nove knjižnice oz. posodobitve.
Ko ste končali lahko odprete Arduino IDE, izberete Tools, kjer boste opazili celo serijo ESP32 razvojnih plošč, ki so na voljo. Nekaj jih je prikazanih na Fotografiji 2.
Naj opomnim, da je hitrost nalaganja 921.600 Baud. To omogoča zelo hitro nalaganje vaših programov.
Če uporabljate Arduino IDE verjetno to počnete zato, ker je na voljo veliko Arduino rutin, razredov itd. na voljo v originalnih Arduino knjižnicah skupaj s številnimi knjižnicami drugih avtorjev. To veliko število funkcij je bilo v prvi vrsti napisano za AVR MCU-je, pa tudi za Freescale ARM MCU-je, ki se uporabljajo v Teensy ploščah. V primeru Xtensa LX6 MCU, ki je uporabljen v ESP32 je bila večina osnovnih knjižnic prevedena tako da omogočajo delo z ESP32. Prav tako veliko knjižnic drugih avtorjev, ki so napisane za obdelavo različnih perifernih čipov bodo delale na ESP32 pod pogojem, da uporabljajo standardni »Wire« (I2C), SPI ali protokol za serijski vmesnik, ki so del osnovne Arduino knjižnice. Vendar pa nekatere knjižnice drugih avtorjev, ki uporabljajo neposredni dostop do AVR MCU registrov namesto do hardversko abstraktnega nivoja uporabljenega v osnovni Arduino knjižnici, ne bodo delovale kot take in bodo morda potrebovale veliko dela za spremembe.
Spletno mesto Hackaday je predstavilo temo glede Arduino knjižnic za ESP32. Tema je zdaj stara približno 1 leto in ESP32 knjižnice zdaj omogočajo več Arduino združljivih funkcij, je pa ne glede na to zanimivo branje:https://hackaday.com/2016/10/31/whats-new-esp-32-testing-the-arduino-esp32-library/
Primerjava lastnosti med ESP32 in ESP8266
Poglejmo si nekaj novih periferij v ESP32, ki niso bile vgrajene ali niso bile tako napredne v ESP8266. Kot optimist sem sklepal, da ima večina nove periferije na volji tudi svoje gonilnike. Vendar se to še ni zgodilo. Nekaj najboljše nove periferije v ESP32 zahteva programske gonilnike, ki so na voljo samo v primeru, če uporabljate Espressif razvojno orodje, imenovano IDF (IoT Development Framerwork). Ta situacija se bo spremenila, saj so C programerji »težke kategorije« pričeli s pretvorbo kode iz IDF knjižnic v obliko, ki bo delovala znotraj Arduino IDE.
Sprehodimo se preko različnih perifernih vezij, ki jih najdemo znotraj ESP32. Po vsaki postavki bom dodal zaključek z oklepajem [Arduino Da] ali [Arduino Ne] s čemer bom označil ali lahko to periferijo uporabite neposredno z Arduino knjižnicami:
- GPIO- več GPIO, kot jih ima ESP8266, I/O priključke, ki jih potrebujejo periferni bloki lahko preklapljamo med različnimi GPIO priključki z uporabo interne programsko nastavljive matrike. [Arduino Da]
- Wi-Fi- interni Wi-Fi blok lahko nastavimo s pomočjo Wi-Fi knjižnice, kar je podobno, čeprav ne popolnoma enako, kot pri obstoječi Arduino/AVR Wi-Fi knjižnici. [Arduino Da]
- BlueTooth/LE- dosegljiv samo znotraj IDF [Arduino Ne]
- ADC- na prvi pogled je ta ADC boljši/zmogljivejši, kot AVR ADC. Njegovih 12 bitov lahko multipleksiramo med 12 priključki. Vsebuje zmerno programabilen atenuator, s katerim razširimo osnovnih 1,0V za polno skalo na 1,3; 2,0 in 3,5V z uporabo analogSetAttenuation funkcije. Vendar pa v praksi ta ADC ni tako dober. Njegova natančnost ni posebej dobra, zato imamo na voljo samo 10 bit resolucijo. Prav tako ADC prebere vrednost 0 V kot 0 V pa do 0,05V na 1,0 obsega. Ta “mrtva cona” se zviša na 0,1V pri 3,5 V celotnem obsegu, prav tako obseg pri 3,0 in 3,5V skali ni linearen. Če potrebujete rail-to-rail ADC delovanje, potem ESP32 ne bo vaša izbira. [Arduino Da] Več informacij o tem je na voljo na spodnji spletni povezavi: https://www.esp32.com/viewtopic.php?t=1045 ali https://github.com/espressif/esp-idf/issues/164
- DAC- obstajata dva 8-bit DAC pretvornika, ki ju lahko preklapljamo med različnimi GPIO priključki (razen IO25, 26). Nisem seznanjen s pomanjkljivostmi tega DAC. [Arduino Da]
- LED PWM. Arduino funkcija analogWrite, ki je uporabljena v AVR MCU na različnih PWM kanalih s čemer dosežemo “pseudo-analogni” izhod, ko ga kombiniramo z RC vezjem. ESP32 Arduino knjižnica ne vsebuje analogWrite funkcije, lahko pa uporabi 16 kanalni LED PWM blok, ki omogoča podobno funkcionalnost. Ta uporablja hal-ledc.c knjižnico. To je zelo uporaben PWM blok, ki je krmiljen z 80 MHz taktom, ki mu sledi 18-bitni preskaler in deluje s 16-bitno resolucijo. Zmore generirati signal med dvema različnima PWM vrednostima pri različnih stopnjah brez intervencije programa. Faza pulza (to je relativno na štartni položaj) se lahko spreminja, zato je možno – na primer, da sprogramiramo 4 LED PWM kanale s čemer omogočimo krmilno sekvenco za krmiljenje koračnega motorja brez intervencije programa, ko so enkrat LED PWM kanali inicializirani [Arduino Da].
- RMT- To je blok, ki je načrtovan za obdelovanje sprejema in oddaje IR brezžičnih signalov. Obstaja 8 takšnih kanalov, čeprav ne vem zakaj bi sploh potrebovali več kot 1 takšen kanal, če se striktno uporablja samo za IR funkcije. To so zelo visokonivojske funkcije, ki praktično ne potrebujejo intervencije s strani procesorja razen za inicializacijo. Za IR oddajo je potrebno zapolniti spominski blok s 128 vrednostmi signala za trajanje in nivo. Ko jim ukažete oddajo, bo začel pošiljati signale na določenih GPIO priključkih za čas, ki mu ga določimo. Lahko imate do 128 impuls/presledek kombinacij. In ker komercialni IR oddajniki modulirajo te signalne nivoje (s frekvenco od 30-54 kHz), vsebuje RMT blok znotraj ESP32 opcijski generator nosilca, s katerim modulira ta izhodni signal in ga lahko nastavimo na zahtevano frekvenco. Podobno obstaja sprejemni blok, ki lahko zajema vzorec na GPIO vhodu in napolni spominsko polje z nivoji vhodnega nivoja/dolžino trajanja signala. Dodatno obstaja polje 128 16-bit dolgih besed, ki je na voljo za zapolnitev: 15-bitov za trajanje in 1 bit za vrednost. 128 blokov lahko razširimo z do 512 besed, če IR oddajnikov ne potrebujemo. Ta periferija trenutno ni del ESP32 Arduino knjižnice, vendar pa sem kodo našel na spletni povezavi: https://github.com/ExploreEmbedded/ESP32_RMT
- Poizkusil sem NEC IR kodo za oddajanje in vse je delovalo brez problemov. Ker je na voljo 8 kanalov, jih lahko uporabite kot več kanalni logični analizator (v režimu sprejema) ali kot logični generator (v načinu oddaje). [Arduino Da]
- Pulzni števec- je namenjen štetju impulzov in ima 8 neodvisnih kanalov 16-bitnih števcev. Vsak kanal ima vhod in opcijski priključek za kontrolo, ki nadzira smer štetja gor/dol (ali druge funkcije). Obstaja tudi programabilni filter, s katerim lahko filtriramo kratke pulze (konice). Mislim, da bi to lahko uporabili za branje rotacijskega enkoderja brez angažiranja procesorja, ki pa bi ga potrebovali v postopku inicializacije in občasnega periodičnega branja registra števca. Poizkusil sem uporabiti Espressif-ov IDE API števec pulzov iz Arduino skice za branje enkoderja, vendar še nisem uspel. [Arduino Ne]
- Vhodi za zaznavanje dotika – obstaja 10 vhodov, ki zaznavajo dotik na ESP32. Ta funkcija je vključena v ESP32 Arduino knjižnici, vendar je še nisem preizkusil. [Arduino Da]
- SD/MMC gostitelj – SD/MMC kartice delujejo v dveh načinih: način SDIO z veliko hitrostjo (4 bit paralelni prenosi) in v SPI načinu. Običajno se uporablja SPI način, ko dostopamo do teh kartic, vendar lahko ESP32 obdeluje tudi hitrejši SDIO način z uporabo tega perifernega bloka. Trenutno ESP32 Arduino knjižnica ne podpira tega bloka, vendar pa Arduino skice lahko še vedno uporabljajo SPI način z uporabo standardne “sd” knjižnice.. [Arduino Ne]
- Ura realnega časa (RTC)- ESP32 vsebuje ULP (ultra-low power) soprocesor. Poleg ostalih stvari ta soprocesor omogoča uro realnega časa, ki jo lahko uporabimo za bujenje ESP32 procesorja ob uporabniško določenih terminih. Te funkcije še nisem uporabil. Če bi to želeli dodajte v skico:
#include <sys/time.h>
- Primer uporabe RTC, pa tudi Wi-Fi NTP klienta je vsebovano v skici projekta tega članka. [Arduino Da]
- I2S- Ta blok omogoča ESP32, da zajema avdio z visoko resolucijo z ADC-ji, DAC-e in Codeke. [Arduino Ne]
- Obstaja še nekaj hardverskih enkripcijskih blokov, CAN periferija in Ethernet MAC v ESP32, vendar o tem ne bom pisal.
Osnovni projekt domače avtomatizacije z ESP32
Nekateri zanimivi projekti, ki sem jih imel v mislih, bi potrebovali te napredne periferne bloke, za katere Arduino gonilniki še niso na voljo. Porabil sem nekaj časa, da bi jih napisal in da bi delovali v Arduino skicah, vendar sem imel omejen uspeh. Zato sem se odločil, da bom pričel s projektom, ki ne bo zahteval teh naprednih periferij.
Zamislil sem si spletni krmilnik, ki bi krmilil moj domači HRV sistem (Heat Recovery Ventilation – sistem za rekuperacijo). Sistem za rekuperacijo vsebuje enega ali več zmogljivih ventilatorjev, ki odstrani vlažen in porabljen zrak iz hiše in ga nadomesti s svežim zrakom. Glede na Sliko 1 lahko vidite, da to napravi tako, da oba – vhodni in izhodni zrak tečeta preko učinkovitih toplotnih izmenjevalnikov in pri tem se zajame nekaj toplote segretega notranjega zraka (med zimo), s katero se ogreje vhodni hladni zrak.
Nasprotno se poleti vhodni zrak, ki je lahko prevroč, ohlajen s hladnejšim notranjim zrakom, ki ga izpihavamo. Toplotni izmenjevalnik minimizira energetske izgube in pri tem prihrani energijo za ogrevanje in hlajenje.
Poleg ogrevanja in hlajenja je glavni namen sistema rekuperacije to, da postan in vlažen zrak ni ujet znotraj prostorov hiše. Moj sistem za rekuperacijo je bil opremljen z enostavnim merilnikom vlage (ki je bil montiran v enoti v kleti). Merilnik vlage bi moral zagnati enoto, če bi le-ta ugotovila, da je vlaga previsoka. To je bilo pravzaprav neuporabno, saj zrak v kleti ne odraža stopnjo vlažnosti v zgornjih nadstropjih. Ko sem premaknil merilnik vlage v bivalne prostore, se je situacija poboljšala. Vendar pa tudi to ni preprečilo stalnega delovanja takrat, ko je bila notranja stopnja vlažnosti visoka, hkrati pa je bila tudi zunanja vlažnost zraka visoka. Nič ni preprečevalo enoti, da ne bi delovala ure in ure z namenom zniževanja vlažnosti med hladnejšimi deli zime. Prav tako nič ni preprečevalo napravi , da ne bi ves čas delovala med poletnim vročim dnem. Prepričan sem, da moderni sistemi za rekuperacijo vsebujejo mikrokontroler, s katerim obvladujejo te pogoje, vendar moj 25 let stari sistem tega ni sposoben. Kar sem želel je to, da bi sistem za rekuperacijo delal sledeče:
- spremljal notranjo temperaturo in vlažnost v bivalnem prostoru hiše;
- spremljal zunanjo temperaturo;
- z ustreznim algoritmom krmilil sistem za rekuperacijo tako, da bi upošteval navedene 3 meritve, vendar glede na točko 4 spodaj;
- zagotovi tabelo s 24 urami dneva razdeljeno v tri režime delovanja: ON, OFF in FAVOURED;
- uporabniški vmesnik naj bo narejen za dostop preko spletnega strežnika, ki mi bo omogočil nastavljanje enote zgolj preko spletnega brskalnika na mojem računalniku ali pametnem telefonu;
- spremljaj čas s sinhronizacijo MCU-jevega RTC z NTP klientom (Network Time Provider, ki omogoča natančni spletni čas);
- podpira naj dva letna časa: zima in poletje. Algoritem, ki je omenjen v točki 3) se modificira glede na to, ali je zima ali poletje.
Postavka 4 potrebuje nekaj razlage. V položaju ON bo enota delala v tej uri ne glede na katerega od naštetih pogojev. Zato je pomembno, da postavite malo blokov z ON oznako vsak dan s čemer zagotovite, da je hiša minimalno prezračena, s čemer se odstrani postan zrak ali vonjave po kuhanju. Izberete tiste ure dneva, kadar pričakujete, da bodo zunanje temperature čim bližje temperaturam notranjosti v tistem dnevu in/ali po kosilu in večerji, ko se pripravlja hrana.
OFF bloki ne dovolijo enoti, da bi delovala, zato te bloke postavljamo preko noči in nekajkrat podnevi.
FAVOURED bloki so tiste ure, v katerih krmilnik gleda notranjo/zunanjo temperaturo in vlago ter se odloča, ali je zdaj primeren trenutek za vklop naprave (s predpostavko, da je notranja vlažnost višja, kot nastavljena vlažnost). Te bloki povzročijo, da sistem rekuperacije deluje večkrat, kot če je nastavljen na nekaj ON blokov.
Uporabil sem ESP32 s čemer sem zagotovil WI-Fi povezljivost. Spletni vmesnik mi omogoča, da ga nastavljam iz katerega koli računalnika v hiši. Sam krmilnik se nahaja v kleti povezan s kratkimi kabli na senzorje vlage/temperature v notranjosti, zunaj in v sami enoti za rekuperacijo.
Naj omenim, da sem vrsto let uporabljal drugačen krmilnik za rekuperacijo, ki je bil povezan preko Ethernet povezave. Ko sem nedavno zamenjal spletnega ponudnika novi ruter ni imel dovolj Ethernet konektorjev, na katere bi med drugim povezal tudi ta krmilnik, zato sem se odločil, da bom naredil to Wi-Fi verzijo namesto njega.
Vezje
Na Sliki 2 se nahaja električna shema krmilnika. Lahko bi uporabil cenejši ESP8266 modul skupaj z zunanjim več-kanalnim ADC ali z analognim multiplekserjem, na katerega bi priključil 3 senzorje. Vendar pa sem želel poizkusiti novi ESP32 in zato sem ga tudi uporabil.
Blok na zgornji levi strani je ESP32 razvojna plošča: WROOM-32 modul je prikazan znotraj. Večina I/O priključkov na ESP-WROOM-32 modulu so na voljo v DIP formatu, (0,1” centrirano) na ESP razvojni plošči. Tukaj sta še GND in Vin priključka (kamor lahko priključimo napajanje, če se plošča ne napaja preko mikro-USB priključka in 5V adapterja.
Izbral sem senzor za notranjo temperaturo/vlago CC2A23 podjetja Amphenol Advanced Sensors. Originalno ga je prodajal GE in datasheet, ki ga prilagam k dokumentom je dokument podjetja GE. To vezje lahko nabavimo bodisi z I2C ali analognimi (PWM) izhodi. Izbral sem analogno verzijo, saj sem vedel, da bo povezovalni kabel dolg približno 6m in nisem popolnoma zaupal I2C na tej razdalji. Fotografija 3 kaže ta senzor z majhnim oknom na vrhu, ki izpostavi senzor vlage.
Ker se nahaja v SOIC8 ohišju sem ga moral montirati na majhno adaptersko ploščico. Upora R5, R6 ter kondenzatorja C3 in C4 tvorijo integrator, s čemer pretvorim PWM izhod iz senzorja v DC napetost. Kondenzatorja C1 in C2 sta določena s strani proizvajalca in morata biti montirana blizu priključkov senzorja.
Moj starejši krmilnik je uporabljal drugi CC2A23 za zaznavanje zunanje temperature/vlage. Ugotovil sem, da meritev zunanje vlažnosti ni bila natančna, kadar je bila zunanja temperatura različna od sobne temperature – kar običajno je večino časa. To sem popravil s precej kompleksno formulo za temperaturo rosišča. Vendar pa v realnem življenju CC2A23 senzor ni dobro prenesel zunanjih vremenskih vplivov, čeprav je bil zaprt v ohišju. Vendar pa je to ohišje moralo imeti nekaj velikih lukenj za prezračevanje, zaradi česar je bil senzor ves čas izpostavljen. Zato sem se sprijaznil z branjem zgolj zunanje temperature tako, da sem uporabil 10k termistor in 10,0k referenčni upor. Vse tri analogne napetosti iz senzorjev so ratiometrične – to je temeljilo na napetosti vzbujanja, ki je v tem primeru reguliranih 3,3V iz ESP32 razvojnega modula. Te napetosti preberejo trije ESP32 ADC kanali (nastavljeni na 3,5V obseg). V članku sem omenil slabosti/omejitve ADC pretvornika ESP32 modula, vendar v tem primeru so napetosti na senzorju v obsegu ¼ VDD -> ¾ VDD, zato omenjene omejitve ne vplivajo pomembno na točnost meritev.
GPIO22 priključek krmili K2 rele s 5V tuljavo preko 2N3904 krmilnega tranzistorja. Moj rekuperator uporablja industrijsko standardno vezje, ki porabi malo toka s 24V napajanjem in rele K2 je lahko kateri koli majhen rele, ki zmore preklapljati 1Amper toka.
GPIO21 krmili majhen zvočnik preko še enega 2N3904 krmilnega tranzistorja. Oba, rele in zvočnik, se vklopita za med samodejnim testom za nekaj sekund ob vklopu napajanja oziroma reset-u. V kolikor ESP32 ne bo mogel zagnati njegovega mDNS responderja ali če ne bo mogel inicializirati polja svojega EEPROM-a, bo zvočnik izmenično piskal. Priznam, da nisem vgradil približno toliko funkcij za spremljanje napak z uporabo zvočnika in kod piskanja, kot bi lahko.
Fotografija 4 kaže enoto z odstranjenim pokrovom. Napajanje za enoto je možno iz 5V, 500 mA adapterja, ki se vklopi neposredno v ESP32 razvojno ploščo v USB vtičnico. Priključek za zunanji/notranji senzor se nahaja na 3-pin letvici, kontrolna linija za rekuperator je povezana na zeleni vtič nasproti releja.
Programska oprema
Programska oprema je pisana v “C”-ju in jo lahko prevedete ter naložite v Arduino IDE. Osebno mi je bolj všeč Visual Studio 2015 z Visual Micro dodatkom. Visual Studio/Visual Micro uporabljata Arduino IDE za prevajanje in programiranje, medtem ko nudita precej bolj profesionalen IDE za pisanje programa. Na voljo imate boljšo kontrolo napak, pomoč oglede na vsebino in precej boljši dostop do vseh “vključenih” knjižnic, definicij itd.
Program je organiziran kot katera koli druga Arduino skica z blokoma Setup in Loop. Poglejmo si vsak blok posebej.
Setup
2 GPIO liniji ste nastavljeni kot izhodni in zvočnik/rele sta aktivirana za nekaj sekund. ADC je nastavljen na 3,5V polni obseg skale in na poprečno 32 zajemanj na vzorec. ESP32 WiFi.begin funkcija se kliče v Vrstici 94 z uporabo SSID in geslom, kar definiram v vrsticah 30 in 31. V the vrsticah morate vnesti svoj SSID in geslo. Nato počakam, da se vzpostavi povezava z dostopno točko. To pomeni, da bo program obvisel v tej točki, če ne najde WiFi povezave. Zaradi lažjega reševanja je na USB serijsk port poslan znak “.” vsakih 500 milisekund, dokler ni vzpostavljena veljavna povezava. Nato je pridobljena IP številka, ki jo dodeli DHCP dostopne točke preko serijskega porta.
Za tem se zažene mDNS storitev. To uporabniku omogoča, da vnese uporabniku prijazno ime URL v spletnem brskalniku namesto dejanske IP številke. Izbral sem “esp32” kot ime vezja, lahko pa izberem katero koli ime (glej vrstico 33, če bi to želeli spremeniti). Moja enota odgovori z “esp32.local”.
Nato pokličem GetNTPTime(), ki uporablja UDP protokol, s katerim pošlje zahtevo na NTP strežnik na spletu. IP naslov za časovni strežnik je definiran v vrstici 37, ki ga lahko spremenite v bolj lokalni strežnik, če to želite.
Čas, ki ga sprejmemo od NTP strežnika, se nahaja v Unix “epoch” formatu (sekunde od 1. januarja 1900) . Od vrstice 490 naprej popravim to v moj časovni pas v Atlantski, Kanada. Vi ga boste morali spremeniti v 10800 (GMT-3 x 3600) za vaš časovni pas.
IDF od ESP32-ja uporablja strukture “timecal” za shranjevanje časa. Ta struktura vsebuje dva člana: timeval.sec in timeval.usec. Želim, da je spremenljivka “currentTime” strukturnega tipa in da nastavim currentTime.sec spremenljivko z določenjem, koliko sekund dneva je preteklo od vrednosti NTP epoch. Ko je popravljen trenutni čas naložen v to spremenljivko, ESP32 ažurira to spremenljivko avtomatično in s tem prikaže trenutni čas. Rutina GetNTPTime() NE blokira izvajanja programa – v kolikor strežnik ne odgovori v roku 5 sekund, se rutina zaključi brez nastavitve spremenljivke časa. Ob zagonu morate preveriti spletno stran krmilnika in ugotoviti, ali je čas pravilno nastavljen glede na NTP strežnik. Enkrat na dan se pokliče rutino GetNTPTime() zato, da je interni RTC modula ESPP32 sinhroniziran na omrežni čas.
Nazadnje se kreira polje v EEPROM-u za shranjevanje vrednosti operacij posameznega načina za vsak blok znotraj 24 ur, pa tudi za nekaj dodatnih spremenljivk, kot relativna vlažnost in letni čas. To polje v EEPROM-u je narejeno znotraj IDF kode, ki uporablja sekcijo ESP32 Flash programskega spomina s čemer emulira spominsko polje znotraj ESP32.
Loop
Loop rutina opravlja 3 osnovne funkcije:
- bere senzorje, ki spremljajo trenutno zunanjo/notranjo temperaturo in notranjo relativno vlažnost;
- z uporabo RTC v eno urnih intervalih prebere vrednosti senzorja in v kombinaciji z ON/OFF/FAVOURED statusom se odloči, ali naj vklopi rekuperator ali ne. Dejanski algoritem bo odvisen od vrednosti spremenljivke Season (torej poletje ali zima);
- deluje kot spletni strežnik, ki odgovarja na vhodne HTTP zahteve in vrne spletno stran ki odraža status krmilnika;
- periodično preverja, če je WiFi povezava še vedno veljavna in če ni, jo ponovno vzpostavi.
Poglejmo podrobneje kako je spletna stran organizirana. Fotografija 5 je zaslonska slika spletne strani na mojem iPad-u. Trenutni čas, pa tudi nekaj relevantnih spremenljivk, so prikazani zgoraj.
Nadalje sta dve vrstici z 12 enournimi bloki (AM in PM), označenimi v 24-urnem formatu. Te bloki kažejo status ON/OFF/FAVOURED za vsako uro dneva. Pod tem se nahajajo vrednosti prebrane iz treh senzorjev. Na dnu so okenca za vpis vhodnih nastavitev, kjer definirate številko bloka in način delovanja tako, da vnesete številko bloka (0-23) v ustrezni vrstici in potem pritisnete gumb desno od tega. Vrednosti za Relativno vlažnost in Del leta vnesete na enak način.
Obstaja tudi gumb za brisanje celotnega bloka polja, pa tudi gumb OverRide. Ta zadnji bo nepreklicno vklopil rekuperator za čas treh ur. To lahko uporabite v primeru močnih neprijetnih vonjav ob kuhanju ali če se želite znebiti vonjav od recimo barvanja in podobno.
Uporabil sem spletni strežnik s popolnoma svojim programom. Lahko ga razdelimo na 2 dela:
- Ko vtipkate “esp32.local” URL v vaš spletni brskalnik, bo HTTP zahteva sporočena v krmilnik, ki bo dogovoril tako, da bo poslal spletno stran kot jo vidite na Fotografiji 5. To se dogaja v vrsticah 298 do 446. Uporablja tekstovne bloke, gumbe, radio gumbe itd. Štiriindvajset enournih časovnih blokov je postavljenih v HTML “Table” objekte. Nekateri od poslanih HTML stringov morajo biti dinamično generirani saj berejo vrednosti senzorjev, trenutni las pa tudi uporabniško nastavljeni 24-urni bloki nastavitev. Trije senzorji se berejo v vrsticah od 392 do 404. Njihove vrednosti so pretvorjene v temperaturo ali vlažnost preden jih integriram v izhodni HTML string.
- Po prejemu kasnejših HTTP zahtev bodo prejete HTML linije, ki vsebujejo različne spremenljivke, katerih vrednosti so zdaj postavljene, saj jih je uporabnik vnesel v različne bloke in pritisnil ustrezen gumb. String z imenom “readString”, ki vsebuje vsako HTML vrstico ki jo prejme, je razčlenjena na definicije spremenljivk. Sledi del kode, ki izgleda kot HTML koda, ki jo pošlje spletni brskalnik, kadar , uporabnik vnese ON blok in pritisne “ON time” gumb, , glej program 1:
program 1 int indx0 =readString.indexOf("GET"); int indx1 =readString.indexOf ("?ON+time="); int indx2 =readString.indexOf("&",indx1); if (indx0 ==0 && indx2 > indx1+9) { String tmp1 = readString.substring(indx1+9,indx2); int onTime= tmp1.toInt(); if (onTime >= 0 && onTime <24) { EEPROM.write(onTime,1); EEPROM.commit(); }
Polje EEPROM-a [0] – [23] shrani vrednosti Mode za 24 ur dneva. Vrednost Mode 1 določa ON, medtem ko 255 pomeni OFF in 2 pomeni FAVOURED. Opazili boste, da EEPROM.commit() funkcija za razliko od Arduino/AVR funkcij ESP32 EEPROM rutine zahteva, da pokličemo commit() za tem, ko pišemo vrednost v EEPROM, sicer ne bo shranjeno v ESP32 Flash spomin!
Vsi gumbi, Radio gumbi in bloki za vnos pošiljajo podobna sporočila in vsak od teh je razdeljen na posamezne sekcije, programa v krmilniku (linije 218 – 289). Nato so uporabnikove nastavitve shranjene v ustrezno SRAM spremenljivko, zapisano v polje EEPROM-a in uporabljeno za popolnitev HTML vrstic, ki so poslane nazaj v spletni brskalnik kot odgovor uporabnikovim vnesenim podatkom.
Zaključki
Najtežji del tega projekta je bilo napisati kodo za spletni strežnik glede na moje minimalne izkušnje s HTML programiranjem. Vendar sem ta del naredil, ko sem gradil predhodne projekte z AVR-ji in žično povezanim Ethernetom. Ker sta oba projekta napisana kot Arduino skici, ni bilo težko prirediti kodo. Ni za pričakovati, da bi bralci želeli točno duplicirati moj projekt, vendar pa bi “C” program, ki lepo teče na ESP32 lahko priredili za drugačne krmilnike, kjer je potreba za spremljanje neke pogoje z uporabo senzorjev in kjer je potrebno narediti določene kontrolne funkcije, ki lahko temeljijo na dejanski RTC uri.
Omenil sem že v tem članku nekaj pomanjkljivosti ADC na ESP32, ki bi jih bralec moral upoštevati, v kolikor bi se odločil delati projekt, ki bi zahteval natančen ADC z vhodnim obsegom, ki presega Vcc in GND. Vendar pa sta oba, I2C in SPI porta in krmilniki na voljo na ESP32, zato je zunanji ADC lahko dodan kot možnost. Zdaj, ko je projekt kompleten pričakujem, da bom pogledal v ESP32 projekte z upoštevanjem ESP32 sofisticirano Remote (RMT) periferijo v povezavi z LIRC (Linux Infrared Remote Control) specifikacijo/bazo podatkov. Tudi LEDC periferija je precej dobro opremljena, da bi krmilila koračni motor in imam namen, da bi delal na tem tudi.
Mislim, da boste uživali, ko boste delali s tem sofisticiranim novim Wi-Fi omogočenim MCU-jem. Pričakujem, da ne bo dolgo trajalo, da bo v naslednjih verzijah vključena tudi Bluetooth/BLE v ESP/Arduino knjižnica.
Brian_firmware_and_docs