6.1 Povezivanje i dohvat podataka
Svaki primjer do sada bio je samodostatan: pločica je nešto izmjerila, ili nešto upalila, i rezultat ispisala na tvoj ekran preko USB kabela. Ovaj poseže dalje od stola. NULA MINI pridružuje se tvojoj Wi-Fi mreži, traži od pravog web sjedišta na internetu njegov sadržaj, i ispisuje natrag što god to sjedište odgovori.
Taj zahtjev je isti onaj koji tvoj preglednik (engl. browser) napravi svaki put kada otvoriš stranicu. Kada ga tvoja pločica može napraviti, vrata su otvorena prema podacima o vremenu, satovima koji se sami postavljaju, nadzornim pločama i daljinskim upravljanjima.
U ovoj dokumentaciji naučit ćeš:
- Kako spojiti svoj NULA MINI na Wi-Fi mrežu pomoću modula
network. - Što
urequestsradi, i zašto ni jedan modul ne treba instalirati. - Kako napraviti HTTP GET zahtjev i pročitati odgovor.
- Kako
tryiexceptsprječavaju da neuspjeli zahtjev zaustavi cijeli program. - Kako razlikovati pogrešnu lozinku od pravog problema s mrežom.
Potreban hardver
- 1× Soldered NULA MINI pločica
- 1× USB-C kabel
- 1× breadboard
- 2.4 GHz Wi-Fi mreža s pristupom internetu
Spajanje komponenti
1. Umetni NULA MINI pločicu na breadboard
Utisni pločicu u jedan kraj breadboarda tako da njezina dva reda pinova premoste središnji kanal.

2. Spoji USB-C kabel
Utisni USB-C kabel u konektor na rubu pločice, a drugi kraj u računalo. PWR LED-ica se upali, i to je cijeli sklop.

− vodilici, oba Qwiic konektora prazna. Mali ljubičasti sjaj uz PWR jedini je znak da se bilo što događa.Pridruživanje mreži
Wi-Fi mreža identificirana je dvama dijelovima teksta: svojim SSID-om, što je ime koje vidiš u listi mreža na svom mobitelu, i svojom lozinkom. Skripta drži oboje blizu vrha:
ssid = "your ssid"
password = "your password"
Zamijeni tekst između navodnika svojim podacima, a same navodnike ostavi na mjestu. Oboje razlikuje velika i mala slova: HomeNetwork i homenetwork su, koliko se pločice tiče, dva različita imena.
Za izlazak na mrežu potrebna su tri poziva:
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
network.WLAN(network.STA_IF) stvara objekt preko kojeg razgovaraš s radiom. STA je skraćeno od station, a to je naziv za uređaj koji se pridružuje tuđoj mreži, istu ulogu koju igra tvoj mobitel. Alternativa, network.AP_IF, natjerala bi pločicu da umjesto toga stvori vlastitu mrežu.
active(True) uključuje Wi-Fi hardver. connect() zatim pokreće pokušaj.
Kada je pločica na mreži, router joj predaje IP adresu, broj koji je identificira među svim drugim uređajima u tvojoj kući. Nisi ju ti odabrao, i vrlo lako može biti drugačija sljedeći put kada se pločica poveže. Skripta je ispisuje jer ti primjer 6.2 daje nešto što ćeš s njom raditi:
print("IP Address:", wlan.ifconfig()[0])
ifconfig() vraća četiri vrijednosti odjednom: adresu pločice, mrežnu masku, gateway i DNS server. [0] na kraju odabire prvu od njih, a to je ona koju želimo. Ispiši wlan.ifconfig() sam ako želiš vidjeti sve četiri.Dva modula koja već imaš
import network
import urequests
Za razliku od SHTC3 senzora u 5.1, ovdje se nema što kopirati na pločicu. Oba modula ugrađena su u standardni ESP32 MicroPython firmware, pa ako pločica uopće pokreće MicroPython, ima ih.
network upravlja radiom: nalaženjem mreže, dokazivanjem da znaš lozinku, održavanjem veze otvorenom. urequests sjedi na njemu i govori HTTP, jezik weba. Bez njega bi zahtjeve morao sam sastavljati iz sirovog teksta.
u u urequests znači micro. To je smanjena verzija biblioteke requests koja se koristi u desktop Pythonu, istog oblika ali daleko manja, tako da ulazi u mikrokontroler. Kod napisan za jednu obično se u drugoj čita isto.Zašto pločica čeka u petlji
Pridruživanje mreži traje sekundu ili dvije, dovoljno dugo da bi zamrzavanje cijelog programa radi čekanja bilo rasipno. Zato connect() samo pokreće pokušaj i vraća se odmah, ostavljajući radio da s tim nastavi u pozadini.
To znači da skripta mora čekati sama:
while not wlan.isconnected():
time.sleep(0.5)
print(".", end="")
isconnected() odgovara True kada je pločica na mreži. Petlja se izvršava dok je to još False, ispisujući jednu točku svakih pola sekunde. Svaka točka u konzoli je stoga pola sekunde čekanja, što red točaka čini grubom štopericom.
end="" je ono što drži točke u jednoj liniji. Normalno print() završava novim redom; predavanje praznog stringa kao end zamjenjuje taj novi red ničim, pa sljedeća točka sleti uz prethodnu, a ne ispod nje.isconnected() jednostavno nikada ne postane True i točke se nastavljaju unedogled. Nikakva poruka o grešci se ne pojavljuje, jer koliko se skripte tiče, ništa još nije pošlo po zlu. Ona još čeka. Pločica koja ispiše dvadeset ili trideset točaka i nikada ne prođe dalje govori ti da su podaci pogrešni, a ne da se srušila. Pritisni Stop da je prekineš.Što je GET zahtjev
GET je HTTP metoda za čitanje nečega. Kada u preglednik upišeš adresu, GET zahtjev je ono što on pošalje. Ovaj primjer pita example.com, domenu koju internetsko tijelo za imenovanje održava upravo zato da dokumentacija poput ove stranice ima na što bezopasno pokazati.
response = urequests.get(url)
Ta jedna linija šalje zahtjev i čeka odgovor. Ono što se vrati je objekt odgovora s dva dijela koji nas zanimaju:
response.status_codeje broj koji opisuje kako je prošlo. 200 je kod za "izvoli". Sve od 400 pa gore znači da je server odbio ili nije mogao naći ono što je zatraženo.response.textje tijelo odgovora kao tekst. Zaexample.comto tijelo je HTML same stranice: isti oni znakovi koje tvoj preglednik primi i zatim nacrta kao naslov i odlomak.
Na kraju:
response.close()
Ovo otpušta memoriju koju je odgovor držao. Važnije je nego što izgleda. Skripta koja pravi zahtjeve iznova a da ih nikada ne zatvori svaki put propušta malo memorije, i na kraju je ostane bez nje.
http://, a ne https://, ali samo da bi ovaj prvi primjer ostao mali. Kriptirane adrese rade: zamjena u https://example.com/ vraća isti 200 i istu stranicu. Cijena su prostor i vrijeme. Na ovoj pločici obični zahtjev završio je u oko 140 ms i držao je oko 2 kB memorije, dok je kriptirani trajao oko 410 ms i oko 29 kB, jer pločica mora dogovoriti kriptiranje prije nego može postaviti svoje pitanje. Na čipu koji ima nekoliko stotina kilobajta, to vrijedi znati prije nego počneš praviti zahtjeve u petlji.Uhvatiti neuspjeh umjesto srušiti se
Sve što ide preko mreže može pasti, a u MicroPythonu neuspjeli zahtjev ne vraća uljudno negativan broj kao Arduino HTTPClient. On diže iznimku, koja zaustavlja skriptu mrtvu i ispisuje traceback.
try i except su način na koji se s tim izlazi na kraj:
try:
response = urequests.get(url)
# ...iskoristi odgovor...
except Exception as e:
print("Request failed. Error:", e)
Sve uvučeno pod try izvršava se normalno. Ako bilo što od toga padne, Python napušta ostatak bloka i skače na except, gdje e drži razlog. Skripta zatim nastavlja umjesto da se prevrne.
Sve se događa jednom
U ovoj skripti nema while True petlje. Pločica se poveže, postavi svoje pitanje, ispiše odgovor i skripta završi.
Da je pokreneš ponovno, ponovno pritisni Run. Ako bi radije da se pokreće sama svaki put kada se pločica upali, kopiraj je na pločicu kao main.py.
Kod
# Modul network sadrži sve što je potrebno za pridruživanje Wi-Fi mreži. Ugrađen je u MicroPython, pa za njega
# nema se što instalirati.
import network
# Modul urequests omogućuje nam da govorimo HTTP, jezik kojim preglednici razgovaraju s web sjedištima. Bez njega bismo
# zahtjeve morali sami graditi iz sirovog teksta.
import urequests
import time
# Ove dvije varijable drže ime tvoje Wi-Fi mreže (SSID) i njezinu lozinku. Zamijeni tekst između
# navodnika svojim mrežnim podacima, inače se pločica nema na što povezati.
# Primijeti da se većina pločica, uključujući NULA pločicu, može povezati samo na 2.4 GHz mreže, a ne na 5 GHz.
ssid = "your ssid"
password = "your password"
# Ovo je adresa koju želimo posjetiti. URL je ista vrsta adrese koju upisuješ u preglednik, a example.com
# je mala stranica koja postoji upravo za ovakvo testiranje.
url = "http://example.com/"
print()
print("Wi-Fi GET Request Example")
# Ovdje stvaramo naš mrežni objekt, koji smo nazvali "wlan". network.STA_IF znači da želimo da se pločica ponaša kao
# stanica, a to je naziv za uređaj koji se pridružuje tuđoj mreži, na isti način kao tvoj mobitel.
wlan = network.WLAN(network.STA_IF)
# active() uključuje Wi-Fi hardver, a connect() pokreće pokušaj povezivanja koristeći ime mreže i
# lozinku koje smo definirali iznad. connect() ne čeka da se povezivanje dovrši, samo pokreće proces.
wlan.active(True)
wlan.connect(ssid, password)
print("Connecting to Wi-Fi", end="")
# Budući da se connect() vraća odmah, na vezu moramo čekati sami. isconnected() nam kaže
# jesmo li već na mreži. Ova while petlja izvršava se dokle god nismo povezani, ispisujući jednu točku svakih
# pola sekunde da vidimo da pločica još pokušava.
while not wlan.isconnected():
time.sleep(0.5)
print(".", end="")
# Kada prođemo petlju iznad, povezani smo. ifconfig() vraća četiri vrijednosti: adresu koju je router
# dodijelio našoj pločici, mrežnu masku, gateway i DNS server. Prva od njih je ona koja nas ovdje
# zanima, pa je zapiši, trebat će nam u sljedećem primjeru.
print()
print("Connected to Wi-Fi!")
print("IP Address:", wlan.ifconfig()[0])
print("Requesting data from:", url)
# get() šalje zahtjev i čeka da web sjedište odgovori. GET je HTTP metoda koja se koristi za čitanje podataka, a to
# je točno ono što preglednik radi svaki put kada otvoriš stranicu.
# Ovo omotavamo u try blok jer sve što ide preko mreže može pasti, a bez toga bi neuspjeli zahtjev
# zaustavio cijeli program greškom.
try:
response = urequests.get(url)
# status_code je broj kojim server odgovara. 200 znači "izvoli", a sve od 400 pa gore
# znači da je nešto pošlo po zlu. text je sadržaj same stranice, a za example.com to je njezin HTML.
print("HTTP Response Code:", response.status_code)
print("Received data:")
print("----------------------------------")
print(response.text)
print("----------------------------------")
# close() otpušta memoriju koju je odgovor koristio. Uvijek zatvori odgovor kada s njim završiš,
# inače će program koji pravi mnogo zahtjeva polako ostati bez memorije.
response.close()
except Exception as e:
# Ako je bilo što pošlo po zlu, ispiši razlog umjesto da dopustiš programu da se zaustavi.
print("Request failed. Error:", e)
# I to je sve. Za razliku od ranijih primjera, ovdje nema while True petlje, jer smo htjeli napraviti samo
# taj jedan zahtjev.
Što bi trebao vidjeti
Pritisni Run. Ispis dolazi u jednom naletu kroz nekoliko sekundi i onda prestaje, jer je skripta završila.
Wi-Fi GET Request Example
Connecting to Wi-Fi......
Connected to Wi-Fi!
IP Address: 192.168.75.75
Requesting data from: http://example.com/
HTTP Response Code: 200
Received data:
----------------------------------
<!doctype html><html lang="en"><head><title>Example Domain</title><link rel="icon" href="data:,"><meta name="viewport" content="width=device-width, initial-scale=1"><style>body{background:#eee;width:60vw;margin:15vh auto;font-family:system-ui,sans-serif}h1{font-size:1.5em}div{opacity:0.8}a:link,a:visited{color:#348}</style></head><body><div><h1>Example Domain</h1><p>This domain is for use in documentation examples without needing permission. Avoid use in operations.</p><p><a href="https://iana.org/domains/example">Learn more</a></p></div></body></html>
----------------------------------
Čitajući od vrha:
Prebroji točke da vidiš koliko je povezivanje trajalo. Ovdje šest točaka, po jedna svakih pola sekunde, pa je ova pločica bila na mreži u oko tri sekunde. Sve do desetak je uobičajeno. Red koji nastavlja rasti iznad dvadeset ili trideset je simptom opisan ranije: pogrešna lozinka, ili 5 GHz mreža.
IP Address: 192.168.75.75 je ono što je ovaj konkretni router dodijelio. Tvoja će biti drugačija, a broj koji počinje s 192.168. ili 10. normalan je oblik za kućnu mrežu. Zapiši je; primjer 6.2 je koristi.
HTTP Response Code: 200 je važna linija. Znači da je pravi server na internetu primio zahtjev i propisno odgovorio.
Sve između crtkanih redova je odgovor. To je HTML, isti tekst koji tvoj preglednik preuzme kada posjetiš example.com, prije nego oznake pretvori u naslov i odlomak na ekranu. Možeš raspoznati <title>Example Domain</title> i rečenicu koja počinje s This domain is for use in documentation examples. Tvoja pločica upravo je pročitala web stranicu.
print() dodaje drugi nakon njega.ESP-ROM:esp32c6-..., SPIWP, load: i entry. To je ugrađeni bootloader čipa koji se javlja na dužnost prije nego se MicroPython pokrene. Potpuno je normalno i nema ništa s tvojom skriptom.Ako ne radi
- Točke koje nikada ne prestaju. Podaci su pogrešni, ili je mreža 5 GHz, ili je router izvan dosega. Provjeri SSID i lozinku za velika slova i zalutale razmake. Navodnici moraju ostati, ali između njih i tvog teksta ne bi trebalo biti ništa.
Request failed. Error: -202. Pločica je došla do mreže, ali nije moglaexample.compretvoriti u adresu.-202je ono što prijavljuje kada se ime ne može razriješiti, a to obično znači da sama mreža nema radnu vezu s internetom. Gostinska mreža koja blokira izlazne zahtjeve izgleda isto, a tako izgleda i tipfeler u adresi.ImportError: no module named 'urequests'. Firmware na pločici nije standardni ESP32 build. Preflashaj je sESP32_GENERIC_C6slikom s micropython.org.- Ništa uopće, i nema prompta. Pločica nije spojena, ili je drži druga skripta koja je ostala pokrenuta. Pritisni Stop, pa ponovno Run. Na Windowsu, pločica koja se uopće ne pojavi kao port treba CH340 driver.
Cijeli primjer
Pogledaj cijeli kod primjera na linku ispod:
6.1_Connecting_and_Getting_Data.py
Primjer koji pokazuje kako spojiti NULA MINI pločicu na Wi-Fi mrežu i napraviti HTTP GET zahtjev na example.com, ispisujući odgovor u konzolu.