V zadnjih nekaj letih sem naredil veliko projektov z ESP8266 in nekaj malo bolj naprednih z ESP32. Po mojem mnenju so bili najboljši za načrtovanje Wi-Fi projektov, ki sem se jih lotil – tako glede nizke cene kot poenostavitve programiranja. V mojem primeru preprostost programiranja izhaja iz dejstva, da oba lahko hitro programiramo s pomočjo Arduino okolja.
Ker so del programskega okolja Arduino, imajo koristi od številnih knjižnic in vzorčnih programov, ki jih ustvarijo uporabniki in ki so na voljo. Z Arduino IDE sem šel še korak dlje z uporabo Visual Micro vtičnika za Visual Studio 2019. To mi omogoča, da v celoti uporabljam opremljeno Visual Studio urejevalno in programsko okolje, hkrati pa lahko še vedno uporabljam knjižnice, definicije Arduino plošč itd.
Ta vsebina je samo za naročnike
Pred kratkim me je zanimala razpoložljivost ESP32 modulov, ki vsebujejo video kamero in ponekod vgrajen mikrofon. Pri lokalnih distributerjih so na voljo različni moduli vrednosti od 10 do 20 USD. Najprej sem kupil Espressif ESP32-EYE modul. Mislil sem, da bo lažje najti primer programa za demo ploščo, ki jo izdeluje podjetje ESP32 MCU, kot pa plošče, ki jih izdelujejo druga kitajska podjetja. Ko sem razvijal kodo za ESP-32-EYE, sem ugotovil, da obstajajo tudi druge plošče, ki so imele prednosti pred ESP32-EYE in ki jih ni bilo težje zagnati.
V tem članku vam bom prikazal nekaj idej, ki sem jih razvil z uporabo ESP32 plošče / kamere, ki izvaja različne varnostne in nadzorne funkcije. Velik del vsakega projekta varovanja / spremljanja je, kaj storiti s podatki / alarmi, ko jih naprava zbere. V večini primerov jih bo potrebno poslati v neko storitev v oblaku, tako da lahko do njega dostopate na daljavo. V tem članku vam bom pokazal nekaj neobičajnih, pa vendar zanesljivih storitev v oblaku, ki sem jih načrtoval v večjem številu demo projektov.
ESP32-EYE
Poglejmo najprej ESP32-EYE modul. Slika 1A prikazuje stran modula s kamero. Kamera je OV2640, 2-megapikselna kamera z največjo ločljivostjo UXGA (1600 x 1200). Na obeh straneh kamere sta stikali RST in BOOT. Če ste že programirali ESP MCU, že veste, da zaženete Bootstrap loader tako, da držite stikalo BOOT in začasno pritisnete gumb RST. V primeru sistema ESP32-EYE, vgrajeni most SiLabs SP2103 USB-UART to opravi s pomočjo RTS / CTS signala, dokler to podpira vaša razvojna programska oprema (Arduino IDE).
Na GPIO priključke sta priključeni 2 LEDici, ki ju lahko vklopite / izklopite iz ugnezdene programske opreme.
Na dnu plošče je digitalni MEMS mikrofon (MSM261S4030HDR). Ta dostopa do ESP32 prek enih (ali dveh) I2S vrat. Mikrofon je zelo občutljiv in lahko sliši govor z nekaj metrov.
Desno od mikrofona so edine vhodno / izhodne povezave, ki so na voljo v modulu. Zagotavljajo namenska 3-žilna SPI vrata in CS pin. GPIO priključki pritrjeni na te 4 priključke, so GPIO0, 2,12,19. Te 4 priključke lahko uporabite tudi za druge funkcije poleg SPI vrat, vendar se zavedajte, da sta GPIO0 in GPIO2 zasedena med zagonom in sta zato omejena, za kaj ju lahko uporabljate. Nisem prepričan, ali se bo na fotografiji to videlo, vendar sem spajkal žice na CLK in CS linijah, ki jih bom uporabil kot I2C vrata. Med razvojem / preizkušanjem sem po naključju preveč potegnil CLK žico in s ploščice odtrgal priključek. Torej, morate biti previdni pri povezovanju žic!
Slika 1B prikazuje zadnjo stran modula. Na vrhu je kovinska Wi-Fi antena, ki je videti upognjena, vendar oba moja ESP32-EYE modula izgledata tako, zato predvidevam, da je namenoma zasnovana na ta način. Od zgoraj navzdol so ESP32 MCU, 4 MB Flash pomnilnik, 8MB PSRAM (psevdo statični RAM) in Silabs CP2103 USB-UART.
Na modulu sta nameščena 2 LDO regulatorja: eden omogoča 3V3 za ESP32, drugi pa 2V8 in 1V3 za kamero. Za razliko od drugih ESP32 modulov za kamere, ESP32-EYE ne omogoča, da kamero izklopite posebej s programskim nadzorom. Ugotovil sem tudi, če ESP32 prestavim v način globokega spanja, kamera še vedno troši približno 20 mA. ESP32-EYE resnično ne morete napajati na primer z majhno Lipo celico, brez zunanjega vezja, ki ga bom omenil pozneje. Na desni je nameščeno stransko stikalo FUNC, ki je povezano z GPIO15 in se lahko uporablja v našem programu. Njeni priključki so dejansko dovolj veliki, da lahko na njih spajkate žico in namesto tega uporabite drugo stikalo (na bolj dostopnem mestu) ali krmilite z logičnim signalom. Edina omejitev je, da je na GPIO15 vezan 0,1 uF kondenzator proti masi, tako da ne morete krmiliti nobenega signala, ki se prehitro spreminja. Rdeča puščica kaže na stikalni priključek, ki se poveže na GPIO15. Na modulu ni nobenega posebnega GND priključka – najlažji dostop do GND so 4 pritrdilne sponke microUSB porta na strani kamere.
ESP32-EYE je vnaprej programiran s precej izpopolnjeno programsko opremo. Ko ga priključite na računalnik, se bo oštevilčil kot COM vrata. V Device Managerju lahko preverite v Ports-Serial and Parallel, kjer si lahko ogledate številko COM vrat. Če nato odprete serijski terminal (tj. v Arduino okolju prek teh COM vrat), boste prejeli dolgo vrsto napak za odpravljanje napak, na koncu katerega bo stavek, ki vas bo pozval, da rečete »hi Lexin«. To prikazuje del prepoznavanja glasu. Na začetku sem ugotovil, da je prepoznavanje glasu zelo slabo. Vendar sem nekje prebral, da morate izgovoriti »Lexin« kot »lessen« in bolje deluje, če to storite.
Predprogramirana programska oprema ESP32-EYE se postavi kot samostojna brezžična dostopna točka. Pojdite v nastavitve Wi-Fi v računalniku in poiščite dostopno točko ESP32-xxxxx in jo izberite kot vir Wi-Fi. Če nato uporabite spletni brskalnik in ga usmerite na 192.168.4.1/face_stream, boste videli nadzorno ploščo kamere, kot je vidno na sliki 2.
Čeprav je na voljo veliko kontrol, lahko v bistvu preprosto izberete ločljivost na vrhu in kliknete gumb Start Stream. Ta ugnezdena programska oprema omogoča prepoznavanje obraza. S to funkcijo nisem veliko eksperimentiral, saj je nisem nameraval uporabljati. Vnaprej programirana programska oprema ESP32-EYE bo hkrati sprejemala samo enega odjemalca. To sem ugotovil, ko sem v iPadu poskusil dostopati do spletnega mesta ESP32-EYE, potem ko sem za dostop do njega uporabil spletni brskalnik računalnika. Vnaprej programirana programska oprema je bila napisana z Espressif-ovo programsko platformo IDK. Nisem pretirano iskal te izvorne kode, saj v računalnik nisem naložil programske opreme Espressif IDK. Vendar obstaja primer “camera_web_server” v oddelku Espressif ESP-ki se nahaja na njihovem Github in je verjetno podoben / enak vnaprej programirani programski opremi na ESP32-EYE.
Pred nakupom ESP32-EYE sem se prepričal, ali je obstajal primer Arduino programa, ki je na voljo s trenutno različico podpornega paketa ESP32 za Arduino. Če želite programirati ESP32-EYE v Arduino IDE, morate imeti nameščen ESP32 podporni paket. Nato izberite ESP32 Wrover Module in izberite particijsko shemo: Huge APP (3 MB no OTA). Izbrati morate modul ESP32, ki vsebuje čip PSRAM, in Wrover izpolnjuje to merilo. Programska oprema za spletni strežnik kamere zahteva veliko Flash programa, zato morate nastaviti particijo, kot je prikazano na sliki 2. Nato kliknite:
File/Examples/Examples for ESP32 WroverModule/ ESP32/Camera/CameraWebserver
našli boste vzorčni program, ki deluje podobno kot vnaprej programirana programska oprema, razen:
1) nima funkcije prepoznavanja glasu
2) Poveže se z Wi-Fi dostopno točko vašega doma in vas prek serijskega monitorja obvesti o naslovu spletnega strežnika.
Kodo programa CameraWebserver je treba urediti na naslednji način:
1) Modul ESP32-EYE morate izbrati posebej tako, da komentirate pravilno vrstico (različni moduli so navedeni v 10 vrstici)
2) Zgodaj v programu morate vnesti SSID in geslo za Wi-Fi dostopno točko:
const char* ssid = »xxxxxxxx«; const char* password = »xxxxxxxx«;
Ko sprogramirate ESP32-EYE s to prilagojeno kodo in jo zaženete, na izhodu Serijskega monitorja ne smete videti nobenih sporočil o napaki glede same kamere. Medtem ko se bo ESP32 poskušal povezati z Wi-Fi dostopno točko, bo izpisana vrsta pik. Ob predpostavki, da je uspešna, bo sporočila IP #, ki ji ga je dodelila Wi-Fi dostopna točka. Če se pomaknete do navedenega spletnega naslova, boste videli isto nadzorno ploščo, ki ste jo dobili pri uporabi tovarniško nameščene strojne programske opreme, tj. Slika 2. V tem demo delu boste verjetno želeli pogledati Arduino skico in videti, kako vse deluje. Vso srečo s tem! Nekaj časa sem pregledoval program in bil uspešen le pri ugotavljanju naslednjega:
Obstaja struktura, imenovana „config“, ki vsebuje dodelitve GPIO priključkov za vse pin funkcije kamere. Te se razlikujejo od modula do modula in morate izbrati ustrezen modul po imenu, kot smo že omenili. Dejansko preslikavanje pinov se izvede v datoteki camera_pins.h.
Dejansko inicializacijo kamere opravi:
esp_err_t err = esp_camera_init(&config);
in sporočilo o napaki kamere bo poslano na serijski monitor, če vrnjena spremenljivka „esp_err“ ni enaka ESP_OK.
Spletni strežnik zažene startCameraServer (); ki se nahaja v datoteki app_http.cpp. Spletna stran, ki jo uporablja ESP32-EYE, je zapletena z javascript-om in drugimi funkcijami na visoki ravni, s katerimi imam malo / nič izkušenj. Dejanska HTML koda ni vidna nikjer v tem demo programu. Namesto tega je v datoteki »camera_index.h« mogoče najti stisnjeno gzip datoteko (.gz), kjer je oblikovana kot const matrika 4316 bajtov. Izkaže se, da če strežnik pošlje blok podatkov, ki ga identificira kot gzip datoteko, ga bo spletni brskalnik sam razpakiral.
Večina vseh nastavitev kamere, ki jih izvajajo tipke / drsniki na plošči, se izvaja z dolgim nizom stavkov »if / else if«, ki se začnejo v vrstici 484 datoteke app_httpd.cpp. Različne nastavitve se prenesejo v registre kamere s strukturo z oznako »s«, ki vsebuje člane vseh različnih registrov OV2640.
Zagon in zaustavitev pretakanja videoposnetkov in posnetek posamezne fotografije se izvede s kodo spletnega strežnika, ki jo sproži javascript, ki teče na ESP32-EYE. V sami predstavitveni programski opremi nisem mogel najti dokazov o tej funkciji.
Obstaja nekaj načinov za pregled dejanske HTML kode, ki jo pošilja ESP32-EYE. Če se v Firefox brskalniku prikaže nadzorna plošča ESP32-EYE in z desno miškino tipko izberemo »Prikaži vir strani« bo prikazana HTML koda. To omenjam zato, da če poznate HTML na ravni, ki jo uporablja spletni strežnik ESP32-EYE, lahko uredite to HTML kodo, jo stisnete v gzip in nato ponovno formatirate v »C« polje, ki ga uporablja datoteka »camera_index.h«
Nisem tako dobro seznanjen s kodiranjem HTML-ja in me pravzaprav ni zanimalo, če bi moj ESP32-EYE modul zagotavljal video tok, do katerega dostopa spletni brskalnik – z drugimi besedami »spletna kamera«. Namesto tega sem imel v mislih nekaj drugih aplikacij, za katere sem upal, da jih bom lahko dosegel z uporabo kode, ki sem jo napisal in razumel sam. Ob zgodnjem pregledu ESP32-EYE sem ugotovil, da so na voljo drugi moduli ESP32 kamer, ki so bili cenejši in nekoliko bolj primerni za naloge, ki sem jih imel v mislih.
ESP32-CAM
Za razliko od ESP32-EYE, ki ga je zasnoval / prodal Espressif, je mnogo različnih zunanjih modulov različnih kitajskih podjetij, ki opravljajo podobno funkcijo. Priljubljen modul je modul ESP-CAM, za katerega verjamem, da ga je prvotno izdelal AI-Thinker, zdaj pa je na voljo iz številnih virov. Vsi moduli kamer ESP32 ne uporabljajo istih povezav med ESP32 GPIO linijami in kamero. Če pogledate različne module ESP32 kamer, navedene v skici »CameraWebserver«, boste videli pet različnih modulov, ki so navedeni z različnimi konfiguracijami povezav. Kupil sem ESP32-CAM modul, ki je v bistvu različica modula AI-Thinker brez imena in ga lahko vidimo na sliki 3.
Modul ESP32-CAM se od ESP32-EYE razlikuje v naslednjem:
- ESP32-EYE ima vgrajen čip za USB-serijski vmesnik. ESP32-CAM ga nima, zato je za programiranje / spremljanje serijskih vrat potreben zunanji USB serijski kabel ali modul.
- ESP32-EYE ima vgrajen I2S (digitalni) mikrofon, namensko uporabniško stikalo in nekaj LED lučk stanja, od katerih nobena ni prisotna na ESP32-CAM.
- ESP32-CAM ima vgrajeno LEDico in vtičnico za uSD kartico. LEDica deluje kot bliskavica za kamero, ki ni prisotna na ESP32-EYE.
- ESP32-CAM vsebuje 3V3 serijska vrata na logični ravni (U0R in U0T). ESP32-EYE uporablja Silabs CP2103 čip za zagotavljanje emulacije serijskih vrat prek USB-ja.
- ESP32-CAM ima 10 GPIO linij v 0,1-centimetrskih priključkih. Šest od teh je povezanih v vtičnico uSD kartice, vendar niso nikamor povezane, če SD kartica ni uporabljena. Dva se uporabljata za serijsko oddajanje / sprejem, vendar se lahko uporabljata tudi za druge stvari, če serijska komunikacija ni potrebna. Eden od zadnjih dveh se uporablja kot CS pin za PSRAM. To sem moral najti na težaven način, saj to ni posebej omenjeno. ESP32-EYE ima samo 4 majhne priključke za GPIO, od katerih sta dva potrebna med zaporedjem zagona in sta zato omejena glede uporabe.
- ESP32-CAM vsebuje P-MOS močnostno stikalo za svojo kamero OV2640. To modulu omogoča, da kamero odklopi iz napajanja s pomočjo GPIO32. V načinu globokega spanja lahko ESP32 prestavite v način majhne porabe in s tem zmanjšate skupno porabo modula na minimum. ESP32-EYE ne vsebuje tega stikala za vklop kamere.
- ESP32-CAM je namenjen pritrditvi na glavno ploščo prek 16-polnega konektorja, zato jo je razmeroma enostavno montirati v ohišje. ESP32-EYE je prostostoječi modul z le eno vgradno luknjo, zato ga je težko namestiti v ohišje.
Glede na zgornje lastnosti, čeprav sem najprej kupil module ESP32-EYE, sem se pozneje odločil, da so moduli ESP32-CAM bolj primerni za večino projektov, ki sem jih imel v mislih. Glede na 6) zgoraj sem se odločil, da bom preizkusil porabo energije modula ESP32-CAM pod nekaj pogoji, kot je razvidno iz Tabele 1.
Testni pogoji | Tok (mA) |
1-Pretočni UXGA video | 200-400 maks. |
2-Pretočni VGA video | 200-400 maks. |
3-Delujoči spletni strežnik brez pretoka vsebine | 90-180 |
4-Delovanje v prazni zanki, kamera je izklopljena | 70 |
5-Delovanje v prazni zanki, kamera je vklopljena | 122 |
6-ESP32 v režimu globokega spanja, kamera je izklopljena | 2,5 |
Tabela 1
Testa 1 in 2 sta bila izvedena s programom CameraWebserver, ki je tekel in prenašal video. Če imamo višjo ločljivost, bo posledično nižje osveževanje slike, zato je poraba energije v obeh primerih približno enaka. Vrednosti 400 mA so kratke konice, ki se pojavijo med Wi-Fi prenosom. Iz preizkusov 4 in 5 je razvidno, da ESP32 potrebuje 70 mA, medtem ko izvaja prazno zanko (vendar 2. jedro upravlja Wi-Fi) in dodatnih 50 mA za napajanje kamere.
Upal sem na veliko nižji tok v preskusu 6. ESP32 bi moral v globokem spanju potegniti le približno 0,01 mA, kamera pa se med tem testom izklopi. Vendar je AMS1117 3V3 LDO še vedno vklopljen. Njegov podatkovni list določa tipični tok 5 mA, značilen pa je tudi minimalni tok 5 mA za pravilno regulacijo. Ker porabi samo 2,5 mA, se te številke ne zdijo veljavne. Čip PSRAM deluje iz 3V3 napetosti, zato bi bil v načinu globokega spanja vključen tudi z ESP32, toda predvidoma bi bil v stanju pripravljenosti. PSRAM, ki je uporabljen v tem modulu, se vidi v spisku komponent kot „PSRAM“, zato nisem mogel najti njegovih specifikacij. Na modulu ni drugih bremen, zato mora biti poraba toka 2,5 mA kombinacija AMS1117 in PSRAM čipa. Vsekakor ni verjetno, da bi razmišljali o napajanju ESP32-CAM plošče s pomočjo povprečne LiPo celice. Skupna 2500 mAH celica bi trajala približno 1000 ur ali 40 dni. O možnostih majhne porabe bom govoril v nadaljevanju članka.
Ideje za projekt
Poglejmo si nekaj idej, ki sem jih zasnoval za enega ali drugega od obeh prej omenjenih modulov ESP32 kamere. Na splošno se te ideje nanašajo na nadzor / alarmne funkcije na domu. V večini primerov raje uporabim neko obliko storitve v oblaku, za katero menim, da bom prepričan, da bo obstajala v dogledni prihodnosti, in za katero ni potrebno plačati mesečne pristojbine. Te dve merili sta med seboj nekoliko v nasprotju, tako da omejujem število storitev v oblaku, ki jih ponavadi uporabljam.
Namesto da določim določen projekt, bom predstavil vezje in kodo, ki sta potrebna za izvajanje več nalog spremljanja in alarma. Lahko se tudi odločite, katere želite vključiti v svoj projekt. Tu je nekaj funkcij, za katere menim, da so dobro prilagojene ESP-EYE / CAM modulom:
- Zajem fotografije vhoda v dom, ki ga sproži neki senzor bližine.
- Zajem fotografije notranjega prostora v domu, ki ga sproži alarm za dim.
- Zajem fotografije notranjega prostora v domu, ki ga sproži ena od oblik senzorja vloma.
- Zaznavanje prisotnosti vode na tleh in / ali nenavadno visoke ravni vlažnosti. Pošiljanje alarmnega sporočila po e-pošti in / ali SMS z možnostjo zajemanja fotografije in shranjevanje v storitev za shranjevanje v oblaku (Drop-box).
- Zaznavanje, ko sobna temperatura presega normalne najnižje in / ali najvišje ravni, in pošiljanje alarmnega sporočila, kot je navedeno v zgornji točki 4).
- Zaznavanje CO2 in hlapnih organskih spojin (VOC) v kuhinji in pošiljanje alarmnega sporočila kot v 4) in po možnosti pošiljanje slike štedilnika v napravo za shranjevanje v oblaku (da bi se pokazalo, če je štedilnik ostal vklopljen).
Poglejmo si naštete ideje
Zajem fotografije in njeno shranjevanje v oblak
Tako ESP32-EYE ali ESP32-CAM dobro delujeta za ta namen. ESP32-CAM je najboljša izbira, če poleg kamere načrtujete tudi spremljanje drugih senzorjev. Noben modul nima dovolj majhne porabe energije, da bi napravo dalj časa lahko poganjal iz majhne LiPo celice. Če pa boste kamero sprožili s pomočjo detektorja bližine, boste morda želeli uporabiti impulz visokega nivoja, ki ga generira detektor bližine na vklopni priključek večnamenskega napajalnega čipa, kot je STMPS2151MTR. Večina detektorjev bližine zagotavlja logično visok impulz dolžine več kot 1 sekundo, kar bi omogočilo zagon katerega koli od modulov ESP32 kamere in postavilo GPIO linijo visoko, da STMPS2151 zadrži v omogočenem stanju toliko časa, kot je potrebno sliko zajeti in jo shraniti v oblak.
Slika 4 prikazuje vezje, ki je potrebno za to. STMPS2151 je močnostno stikalo 500 mA (90 miliohm) z visokim »Omogoči« nivojem. Detektor bližine signalizira gibanje z visokim impulzom, ki vklopi STMPS2151 (prek D1).
To napaja ESP32 modul. Na začetku v »setup« rutini je prost GPIO priključek (z oznako GPIO-A na sliki 4) konfiguriran kot izhod in nastavljen na HIGH. Tako ostane STMPS2151 vklopljen (prek D2) tudi potem, ko je signal za sprožitev gibanja izginil. Po izbiri lahko ESP32 konfigurira še en prost GPIO priključek (GPIO-B) kot vhod in spremlja stanje izhoda detektorja bližine. Morda se boste želeli prepričati, da je še vedno v visokem stanju, da ga neželen dogodek pred fotografiranjem in shranjevanjem po pomoti ni vklopil STMPS2151.
Če kamero uporabljate za varnostno snemanje dejavnosti na prostem, se zdaj postavlja vprašanje, kaj naredite s sliko? Če uporabljate ESP32-CAM, je vgrajena vtičnica SD kartice, ki omogoča shranjevanje fotografij na uSD kartico. Če pogledate sliko 5, lahko vidite, da uporaba vgrajene vtičnice za uSD kartico porabi do 6 GPIO priključkov na ESP32.
Zaradi tega ne bo ostalo veliko prostih GPIO priključkov. Za aktiviranje STMPS2151 lahko uporabite GPIO0 ali morda serijski izhodni pin U0T. Vendar ne morete uporabiti GPIO16. Videti je, da je prisoten na nekaterih shemah ESP32-CAM na spletu, vendar je priključen na linijo PSRAM -CS na klon modulu AIThinker, ki ga imam. Tega sem se naučil, ko sem poskusil uporabiti GPIO16 kot SDA linijo I2C vodila. Posledica tega je nenehen ponovni zagon sistema ESP32.
Drug način shranjevanja slike je storitev za shranjevanje v oblaku. Osebno uporabljam storitev shranjevanja v oblaku Dropbox že 7 let. Do njega lahko dostopam iz svojih domačih računalnikov, mobilnega telefona IOS in iPada. Moj delodajalec zagotavlja ogromno prostora za shranjevanje v oblaku na Microsoftovem OneDrive pogonu, zato uporabljam samo »brezplačno« različico Dropboxa, ki daje 5 GB prostora za shranjevanje.
Dostop do storitev v oblaku v večini primerov vključuje zapleten postopek overjanja. Amazon in Google sta se mi zdela zelo zapletena v tem pogledu. Dropbox je razmeroma enostaven. Za ESP32 uporabljam knjižnico Dropbox API, ki v osnovi potrebuje le URL spletnega mesta Dropbox in en sam (dolg) ključ za preverjanje pristnosti. Če želite dobiti ta ključ, morate najprej odpreti spletno stran Dropbox in se prijaviti v svoj račun. Če pogledate sliko 6, boste opazili polje z znakom »…«.
Ko kliknete na to, se prikaže okno z meniji, kot je prikazano. Kliknite »Developers«. Videli boste zaslon kot na sliki 7.
Izberite enake možnosti, kot je prikazano, poimenujte aplikacijo in kliknite Ustvari aplikacijo. Prepričajte se, da ste izbrali »App folder” in ne “Full Dropbox«, saj vam ni treba dostopati do več kot ene posebne mape za to aplikacijo. Tako boste dobili zaslon kot na sliki 8.
Izberite »long access token« žeton in ga kopirajte v odložišče. Ta žeton boste potrebovali v ESP32 programu. Ko je to narejeno, preverite shrambo Dropbox, kjer bi morali videti novo mapo z imenom Aplikacije, pod to mapo pa bo še ena z imenom, ki ste ga dali aplikaciji: glejte sliko 9.
V predstavljeni demo skici, ki shrani sliko v Dropbox, je razred upravitelja Dropbox nameščen z:
DropboxMan myDrop;
Razred se inicializira v namestitveni rutini na naslednji način , glej program 1.Knjižnico ESP32 upravitelja Dropbox-a je napisal Lucas Romeiro in sam sem naredil nekaj sprememb, da sem lahko obdelal datoteke JPEG, ki so Binarne (prvotna knjižnica je delovala samo z besedilnimi datotekami).
V mojem demo programu je zajem slike kamere izveden v rutini camera_capture (). Ta rutina kliče tudi myDrop.frameUpload, da pošlje JPEG sliko v Dropbox.
Opomba1: pomembno je, da uporabljate mojo različico knjižnice DropboxManager (na spletnem mestu S.E.), ne pa prvotno avtorjevo Github-ovo različico, saj moja vsebuje funkcijo frameUpload in popravke.
Opomba2: Lucas se je odločil za vdelavo URL-ja Dropboxa na naslednji način , glej program 2.
Zdi se, da je ta Dropbox IP # stabilen, vendar če stvari ne delujejo, ga lahko spremenite v »Dropbox.com«.
Opomba 3: Ko pošljete sliko v Dropbox, boste na serijskem terminalu verjetno dobili sporočilo »Potrdilo se ne ujema«. To nikakor ne vpliva na prenos datotek v Dropbox – ne vem, kako pridobiti ustrezno potrdio saj to res ni potrebno.
Zajem fotografije sprožen s senzorjem dima in pošiljanje na Dropbox
Za to idejo sem mislil, da bi bilo zanimivo zaznati, kdaj se je sprožil senzor alarm senzorja dima z uporabo vgrajenega digitalnega mikrofona na modulu ESP32-EYE. Ko sem testiral mikrofon, sem ugotovil, da je zelo občutljiv – vsekakor je sposoben zaznati glasen ton, ki ga oddajajo alarmi dima. Ta projekt bi lahko izvajal ESP32 bodisi:
- Neprekinjeno
- V režimu globokega spanja, ki pa ga zbudi RTC časovnik v časovnem intervalu, ki ga nastavi uporabnik.
V obeh primerih bi ESP32 izvedel svojo »nastavitveno« rutino, kjer inicializira kamero in se prijavi v vašo Wi-Fi dostopno točko. Digitalni mikrofon na plošči ESP32-EYE se inicializira v rjavi setupMic ().
Metoda, ki jo Espressif IDK uporablja za inicializacijo večine svojih obrobnih funkcij, je nekoliko drugačna od tiste, ki jo običajno vidite v Arduino knjižnicah. Poglejmo, kako je digitalni mikrofon konfiguriran s pomočjo I2S vrat. Najprej sta opredeljeni dve strukturi. Prva določa pravilno konfiguracijo I2S vrat, da se ujema z mikrofonom , glej program 3.
Nato so določeni priključki, ki jih uporabljajo I2S vrata , glej program 4.
Končno se pokliče inicializacijska rutina iz knjižnice I2S vrat in pokaže kazalec na ti dve strukturi , glej program 5.
Čeprav iz zgornje vrstice kode ni razvidno, je bil I2S_PORT na vrhu kode opredeljen kot I2S_NUM_1. Izkazalo se je, da kamera tudi uporablja I2S vrata in je konfigurirana za I2S_NUM_0. Preden sem ugotovil, sem I2S vrata mikrofona konfiguriral kot I2S_NUM_0 in ko se je program zagnal, se je zrušil, ko sem poklical rutino inicializacije mikrofona.
Če želite preveriti, ali je zvok, ki ga je zajel mikrofon, res dimni alarm, uporabim 512-točkovno FFT rutino, ki signal razbije na 256 frekvenčnih pasov. Izbral sem hitrost vzorčenja 20.000 vzorcev / sekundo, tako da je velikost pasu 20000/512 ali 39 Hz. Ta širina pasu je dovolj majhna, da se bo zvočni alarm za dim znašel znotraj enega ali dveh pasov, tudi če se njegova frekvenca nekoliko razlikuje glede na temperaturo.
Prva stvar, ki jo mora narediti program, je, da vstopi v način »učenja« (vnese se s pritiskom na stransko nameščeno USER tipko na ESP32-EYE modulu). Medtem ko je tipka pritisnjena, program kroži v zanki in vsakič zbere 512 vzorcev iz mikrofona in jih prenese skozi FFT rutino. Preverja se amplituda vsakega pasu in shrani največja najdena vrednost. Pasovi od 0 – 10 so prezrti, saj predstavljajo frekvence v območju DC – 400 Hz, ki so veliko nižje od tona alarma za dim, ki je v območju 2000 – 3000 Hz.
Ko učna rutina »zasliši« alarm, uporabnik sprosti USER tipko. Shranjena bo amplituda največjega najdenega pasu ter številka pasu (ki je enaka frekvenci / 39 Hz). Navajen sem, da v EEPROM razredu v Arduinu uporabljam shranjevanje spremenljivk, ki jih je treba vzdrževati, ko je napajanje MCU izključeno. Vendar pa je pri ESP32 razred EEPROM v osnovi opuščen in njegov razred se imenuje »Preferences«. Zato vstavim prednostni razred (samo poimenujem ga »nastavitve«) in shranim dve spremenljivki: številka frekvenčnega pasu, ki vsebuje največjo vrednost, je shranjena kot celo število v spremenljivki maxChannel, amplituda največjega pasu pa je shranjena kot float v spremenljivki maxAmplitude.
V normalnem delovanju ESP32 nenehno zbira podatke iz mikrofona in jih posreduje skozi rutino FFT. Če najde signal, v katerem se največje število pasov ujema znotraj +/- 1 spremenljivke maxChannel in je amplituda tega pasu vsaj 50% spremenljivke maxAmplitude, bo rutina predvidevala, da je sprožil signal alarma za dim. Nato bo postopek ponavljal večkrat, v 3 sekundnih intervalih, da se prepriča, da ni samo signal »motnja«, ki jo poleg alarma za dim povzroči še kaj drugega.
Kaj se zgodi, ko se zazna dimni alarm, bi bilo odvisno od vas. Obstaja nekaj možnosti, med katerimi imam nekatere rutine:
Uporabniku pošlje e-poštno sporočilo, v katerem je navedeno, da se je sprožil alarm za dim.
Pošlje SMS sporočili, ki sporoči enako. Pošlje fotografijo kamere, ki ga pokriva senzor dima, na Dropbox. To bi bilo uporabno, če sta uporabljeni tudi točki 1) ali 2).
Točka 3) je bila obravnavana v zadnjem razdelku. Z elementi 1, 2 se lahko ravna na različne načine, vendar uporabljam storitev v oblaku, imenovano IFTTT. IFTTT pomeni »Če je to potem to« (ang.: IF This Then That). Ta storitev v oblaku uporabniku omogoča ustvarjanje programčkov, sestavljenih iz dveh vrst storitev: prožilnik in dejanje. Za spremljanje in alarmiranje je najlažji način, da ESP32 povzroči prožitev uporabe IFTTT storitve spletne zanke (angl. web-hook). Ko povežete spletno zanko z želenim dejanjem – pošiljanje e-pošte ali SMS sporočilo (ali oboje), sta obe možni izbiri.
Če želite uporabljati IFTTT storitev v oblaku, se morate najprej prijaviti v (brezplačen) račun. To lahko storite s prijavo v Googlu ali Facebooku. Ko to storite, vas bo brskalnik samodejno prijavil na svoj IFTTT račun, kadar koli boste prešli na IFTTT.com. Na voljo je tudi aplikacija IFTTT za naprave IOS, vendar nisem ustvaril IFTTT aplikacij, ki bi to uporabljale.
Če želite določiti svoj programček po meri, morate iti na ikono profila (prazen prostor na levi strani tipke EXPLORE) in izberite Create. Nato kliknite na črn + simbol na desni strani »If« in izberite storitev Webhooks. Videlo se bo polje z naslovom »Receive a web request« – kliknite nanj in izberite ustrezno ime za dogodek (slika 10).
Sprožilec spletne kljuke je zdaj izbran – uporabili ga bomo kasneje, vendar za zdaj želimo določiti dejanje.
Če želite določiti dejanje, kliknite na črn + simbol na desni strani »That«. Izbrati morate dejanje – začnimo z izbiro “email“. Videli boste polje z naslovom Send me an email. Kliknite nanj in izpolnite različna zasenčena polja z ustreznim sporočilom – niso potrebna vsa polja (slika 11).
Prikaže se zaslon, kot ga kaže slika 12 – če je v redu, pritisnite Finish ali <Back, da ga še uredite.
Ko boste določili svoj IFTTT spletno zanko, vam bo zagotovljen edinstven URL, na katerega pošljete sporočilo iz ESP32. Ugnezden v to sporočilo je besedilni niz, ki tvori sporočilo, ki ga želite poslati, po e-pošti ali SMS-ju. Ko se pomaknete na zaslon, ki prikazuje določene spletne kljuke, pritisnite gumb “Documentation” v zgornjem desnem kotu zaslona. Takšen zaslon boste videli na sliki 13.
Na njem je prikazan vaš edinstveni ključ, ki je ugnezden v URL, ki je prikazan pod naslovom »To trigger an Event«. Na sredini URL-ja je {event}. To bo nadomeščeno s katerim koli sporočilom, ki ste ga navedli, ko ste določili spletno kljuko.
Ko prvič izberete dejanja »send email« ali »SMS«, jih morate konfigurirati s svojim lastnim e-poštnim naslovom in številko mobilnega telefona. Pri tem vam bo IFTTT poslal e-pošto (ali SMS), ki vsebuje avtorizacijsko kodo. Ko prejmete to sporočilo, morate vnesti kodo ob pozivu, ki se prikaže na računalniškem zaslonu. To vam zagotavlja, da ni mogoče ustvariti zlonamernih IFTTT programčkov, ki bi vam pošiljali nezaželena e-poštna sporočila ali SMS.
Zadnji del te sestavljanke je napisati ESP32 kodo, ki jo je treba izvesti, da sproži spletno kljuko (ki pošlje e-poštno sporočilo / SMS). Kot primer je tukaj starejši del kode, ki sem jo uporabil za detektor puščanja vode ESP8266, ki sem ga naredil nedolgo nazaj, glej program 6.
Vidite, da je {event} nadomeščen z imenom dogodka, ki sem mu dal to funkcijo – »ESP water detector«. Dolg ključ, ki sledi temu, morate nadomestiti z lastnim ključem, kot je prikazano na sliki 13.
Čeprav tega ne prikazujem, obstaja tudi nekaj kode, ki sledi zgoraj – počaka, da prejme odgovor z IFTTT strežnika. To lahko uporabite med odpravljanjem napak pri programu ali za zvočno opozorilo, če se ne uspe povezati z IFTTT (predvidevamo, da se je ESP32 uspešno povezal z vašo Wi-Fi dostopno točko ali bi bilo podobno sporočilo / dejanje napake) se je zgodilo na tisti zgodnejši stopnji setup () rutine.
Uporaba drugih senzorjev
Na seznamu idej za projekte sem omenil še nekaj senzorjev. Za merjenje temperature in / ali vlage sem se odločil za nizkocenovni senzor vlage / temperature AM2320. Gre za I2C senzor, ki ga lahko krmili kateri koli od obeh modulov ESP32 kamere, čeprav ima ESP32-EYE le dovolj razpoložljivih linij GPIO (prek priključkov na vrhu plošče) za upravljanje I2C vrat in nič drugega. Kupil sem svoje AM2320 senzorje od Adafruit-a, ki za ta čip zagotavljajo Arduino knjižnico. Vendar pa sem za pravilno delovanje za uporabo I2C priključkov, ki so na voljo bodisi v ESP32-EYE bodisi ESP32-CAM, napisal svoje rutine, ki jih v demo programih najdemo kot:
AM2320readTemperature() AM2320readHumidity()
Za kakovost zraka v sobi sem imel pri roki senzor iAQ-CORE-C podjetja ams, ki je tudi I2C naprava. Rutina v demo programu, ki bere ta senzor, je:
Ams_iAQRead()
Če je senzor pripravljen, klic v to rutino vrne logično ena. Med 5-minutnim ogrevanjem senzorja se bo vrnila logična nič. Dve globalni spremenljivki, CO2 in TVOC, je treba na začetku programa deklarirati kot uint16_t. Če kličete rutino, bosta ti dve spremenljivki napolnjeni ob predpostavki, da se je senzor ogrel. Na voljo so novejši podobni senzorji, na primer ams CCS811, ki pa ni veliko cenejši od starejših senzorjev iAQ-CORE.
Nekaj časa nazaj sem v SE opisal detektor puščanja vode na osnovi ESP8266, ki ga je mogoče vključiti v projekt ESP32-EYE / CAM. Omenil bom samo uporabljeni senzor: Atmel AT42QT1010-TSHR. Ta čip je res senzor za dotik, vendar deluje odlično za zaznavanje prisotnosti vode na svojih elektrodah. Ker na svojem izhodnem priključku zagotavlja aktivno-visok logični signal, ga lahko napajamo v EN liniji stikala STMPS2151, kot je prikazano na sliki 4, če želite vklopiti alarm za puščanje vode z ESP32. Tako se modul ESP32 popolnoma izklopi, dokler ne zazna uhajanja, kar omogoča, da celotno vezje napaja LiPo celica. Senzor vode AT42Q1010 je prikazan na sliki 14.
Končna periferna enota, ki sem jo želel dodati modulom ESP32 kamere, je bil 16-bitni I2C vhodno-izhodni razširjevalnik MCP23017 podjetja Microchip. Za ta čip uporabljam Arduino Adafruit_MCP23017 knjižnico, saj je napisana tako, da posnema standardne Arduino konvencije za GPIO operacije: t.j. mcp.pinMode, mcp.digitalWrite itd.
Uporabljam 6 linij PortB MCP23017 za pogon standardnega alfanumeričnega LCD-ja. LCD sem priključil na MCP23017 z enakimi povezavami kot Adafruit RGB LCD Shield, tako da lahko uporabim knjižnico Adafruit_RGBLCDShield. Medtem ko je treba LCD-zaslone s standardnimi znaki zagnati iz 5-V napajalnika, logični priključki delujejo brezhibno pri nivojih 3V3, zato ni potreben prilagodilnik logičnih nivojev.
Vseh 8 vrstic PortA lahko uporabljate za zaznavanje stikal ali krmiljenje relejev, LEDic itd. Na MCP23017 z ESP32 nisem povezal nobene prekinitve, vendar če to storite, lahko generirate prekinitve kadar kateri koli od vhodnih priključkov MCP23017 spremeni stanje. Slika 5 prikazuje MCP23017, LCD zaslon in AM2320 senzor, priključen na ESP32-CAM.
Zaključki
V tem članku sem poskušal zajeti več idej, ki jih lahko spremenite v projekte z moduli ESP32-EYE / CAM. Najbolj uporabni projekti bi poleg same kamere ESP32 verjetno vključevali tudi kombinacijo zunanjih senzorjev.
Za zajemanje vrednosti senzorjev ali drugih alarmnih pogojev z oddaljene lokacije je vedno potrebna neka oblika tretjih storitev v oblaku, razen če ste pripravljeni na težavo:
Vzpostavitev storitev spletnega strežnika ali posrednika MQTT z računalnikom v vašem domu, ki je stalno vklopljen.
Naročite se na neko storitev DNS, ki vam bo omogočila dostop do vašega domačega usmerjevalnika brez težav pri spremljanju njegovega zunanjega (WAN) IP naslova (ki se občasno spreminja, pri večini ponudnikov internetnih storitev).
Upravljanje varnosti na dostopni točki / Wi-Fi usmerjevalniku z namestitvijo posredovanja vrat in blokiranjem »pravil«.
Zaradi alarma menim, da so storitve v IFTTT oblaku za e-poštna sporočila in sporočila SMS brezplačna in zanesljiva metoda. Podobno uporabljam Dropbox in mi je všeč način, kako deluje. API, ki mi omogoča pošiljanje JPEG slik iz ESP32 kamere s pomočjo Dropbox datotek, se zdi dober način za oddaljen dostop do slik kamere. Nisem preveč navdušen nad tem, da do številnih poceni komercialnih spletnih kamer lahko dostopajo drugi ljudje, in dejstvo, da se vsi nekje pretakajo na nek neznani spletni strežnik.
Viri
Datoteke za ESP32 ploščo za Arduino IDE- https://github.com/espressif/arduino-esp32
ESP32-EYE modul- https://www.espressif.com/en/products/hardware/esp-eye/overview
AM2320 senzor temperatur in vlage – https://www.adafruit.com/product/3721
ams IAQ-CORE – https://ams.com/iaq-core-c
Avtor: Brian Millier
2020_283_47
program 1
myDrop.begin(»681lGv4rmtgAAAAAAAAB9ZjEw0lZghj4dStUrVnyhWRtyw8bQES7ELS4Fz5xTUzK«); // this is a “fake” token, replace with your own token
program 2
#define content_API »162.125.5.8« //line 158 of dropboxman.cpp
program 3
// I2S config const i2s_config_t i2s_config = { .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX), .sample_rate = samplingFrequency, .bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT, .channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT, .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB), .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, .dma_buf_count = 4, .dma_buf_len = BLOCK_SIZE };
program 4
// pin config i2s_pin_config_t pin_config = { .bck_io_num = 26, // I2S_SCLK .ws_io_num = 32, // I2S_LCLK .data_out_num = -1,// not used microphone only .data_in_num = 33 // I2S_DIN };
program 5
// Configuring the I2S driver and pins. // This function must be called before any I2S driver read/write operations. err = i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);
program 6
String url = »/trigger/ESP water detector/with/key/cio2W4snx_k3QCS_pAXgyg«; Serial.print(»requesting URL: »); Serial.println(url); client.print(String(»GET ») + url + » HTTP/1.1rn« + »Host: » + host + »rn« + »User-Agent: WaterLeakESP8266rn« + »Connection: closernrn«); Serial.println(»request sent«); while (client.connected()) { String line = client.readStringUntil('n'); if (line == »r«) { Serial.println(»headers received«); break; } }