Skip to main content

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.
  • Što rade biblioteke WiFi i HTTPClient, i zašto ni jednu ne treba instalirati.
  • Kako napraviti HTTP GET zahtjev i pročitati odgovor.
  • 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
ℹ️
Nema komponenti, nema otpornika, nema jumper žica. U ovom primjeru na pinove pločice ne spaja se ništa. Jedina žica koja je uključena je USB-C kabel koji već koristiš za prijenos. Sav posao odvija se u softveru.
ℹ️
Mreža mora biti 2.4 GHz. ESP32-C6 čip na NULA MINI nema 5 GHz radio uopće, pa mu je mreža koja radi samo na 5 GHz nevidljiva. Većina kućnih routera odašilje oba pojasa pod jednim imenom i to se samo posloži, ali ako ih tvoj razdvaja u dva imena, odaberi onaj na 2.4 GHz. Pločica usmjerena na 5 GHz mrežu pada točno na isti način kao pločica kojoj je dana pogrešna lozinka, što je opisano niže.

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.

NULA MINI pločica postavljena na breadboard
Korak 1: pločica postavljena na breadboard
ℹ️
Breadboard ovdje ne radi nikakav električni posao. Ne koristi se ni jedna rupica. On samo drži pločicu ravno i stabilno da ne odjuri preko stola kada utisneš USB kabel. Ako pločicu radije ostaviš izvan breadboarda u potpunosti, primjer radi točno isto.

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.

NULA MINI pločica na breadboardu sa samo priključenim USB-C kabelom i upaljenom PWR LED-icom
Korak 2: gotov sklop. Ni jedna rupica breadboarda nije u upotrebi
ℹ️
Usporedi ovo s fotografijom iz bilo kojeg ranijeg primjera i vidjet ćeš koliko ga je malo: nema jumper žica koje prelaze središnji kanal, nema ničega u 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. Skica drži oboje blizu vrha:

const char* ssid = "your ssid";
const char* 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.

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. Skica je ispisuje jer ti primjer 6.2 daje nešto što ćeš s njom raditi.


Dvije biblioteke koje već imaš

#include <WiFi.h>
#include <HTTPClient.h>

Za razliku od SHTC3 senzora u 5.1, ovdje se nema što instalirati. Obje biblioteke dolaze s definicijom pločice koju si dodao još u 0.2, pa je odabir Soldered NULA Mini ESP32C6 sve što treba da ih učini dostupnima.

WiFi.h upravlja radiom: nalaženjem mreže, dokazivanjem da znaš lozinku, održavanjem veze otvorenom. HTTPClient.h sjedi na njemu i govori HTTP, jezik weba. Bez njega bi zahtjeve morao sam sastavljati iz sirovog teksta.

ℹ️
Primijeti veliko F u WiFi.h. Windowsu ta razlika nije važna, ali datoteka se tako zove, a drugim sustavima jest.

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 WiFi.begin() samo pokreće pokušaj i vraća se odmah, ostavljajući radio da s tim nastavi u pozadini.

To znači da skica mora čekati sama:

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

WiFi.status() prijavljuje trenutno stanje veze, a WL_CONNECTED je vrijednost koju vraća kada je pločica na mreži. Petlja se izvršava dokle god se te dvije razlikuju, ispisujući jednu točku svakih pola sekunde. Svaka točka u Serial Monitoru je stoga pola sekunde čekanja, što red točaka čini grubom štopericom.

ℹ️
Ova petlja nema vremensko ograničenje, i to je važno. Ako je lozinka pogrešna, ili je mreža 5 GHz, ili je router ugašen, WiFi.status() jednostavno nikada ne dosegne WL_CONNECTED i točke se nastavljaju unedogled. Nikakva poruka o grešci se ne pojavljuje, jer koliko se skice 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.

Š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.

HTTPClient http;
String url = "http://example.com/";

http.begin(url);
int httpCode = http.GET();

http.begin() priprema zahtjev govoreći klijentu kamo da ide. Preko mreže još ništa ne putuje. http.GET() je linija koja ga stvarno pošalje i čeka odgovor, i vraća broj koji opisuje kako je to prošlo:

  • 200 ili više znači da je server odgovorio. 200 sam je kod za "izvoli".
  • Negativan broj znači da odgovor nikada nije došao: zahtjev je pao prije nego je ijedan server mogao odgovoriti. http.errorToString() taj broj pretvara u kratku rečenicu, na koju je daleko lakše reagirati nego na broj sam.

Ako je kod pozitivan, http.getString() vraća tijelo odgovora kao tekst. Za example.com to tijelo je HTML same stranice: isti oni znakovi koje tvoj preglednik primi i zatim nacrta kao naslov i odlomak.

Na kraju:

http.end();

Ovo zatvara vezu i otpušta memoriju koju je klijent držao. Važnije je nego što izgleda. Skica koja pravi zahtjeve iznova a da nikada ne pozove end() svaki put propušta malo memorije, i na kraju je ostane bez nje.

ℹ️
Adresa je http://, a ne https://. Kriptirana veza traži da pločica provjeri sigurnosni certifikat servera, što traži više koda i više memorije (WiFiClientSecure na mjestu običnog klijenta). Početak s običnim HTTP-om drži ovaj prvi primjer na onom dijelu zbog kojeg si tu.

Sve se događa jednom

Cijela skica živi unutar setup(), a loop() je ostavljen prazan:

void loop() {
//Ovdje se ništa ne događa, zahtjev je napravljen jednom u setup()
}

Pločica se dakle poveže, postavi svoje pitanje, ispiše odgovor, i onda tamo sjedi ne radeći ništa. Da je pokreneš ponovno, pritisni tipku RST. To ponovno pokreće skicu od vrha, pa se i veza i zahtjev događaju iznova.


Kod

/**
**************************************************
*
* @file 6.1_Connecting_and_Getting_Data.ino
* @brief Primjer koji pokazuje kako spojiti NULA pločicu na Wi-Fi mrežu i onda od web sjedišta zatražiti podatke.
* Pločica pravi HTTP GET zahtjev na example.com i ispisuje što god web sjedište pošalje natrag u
* Serial Monitor. To je prvi korak prema svakom projektu kojem trebaju podaci s interneta.
* Za detalje, shemu spajanja i više, pogledaj dokumentaciju primjera na: <link placeholder>
* @author Soldered
***************************************************
*/

/*
Biblioteka WiFi sadrži sve što je potrebno za pridruživanje Wi-Fi mreži. Dolazi zajedno s definicijom pločice, pa
za nju nema se što instalirati.
*/
#include <WiFi.h>

/*
Biblioteka HTTPClient omogućuje nam da govorimo HTTP, jezik kojim preglednici razgovaraju s web sjedištima. Bez nje bismo
zahtjeve morali sami graditi iz sirovog teksta.
*/
#include <HTTPClient.h>

/*
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.
*/
const char* ssid = "your ssid";
const char* password = "your password";

void setup() {

/*
Serial.begin() uspostavlja serijsku komunikaciju između tvoje pločice i tvog računala preko USB kabela. U ovom
primjeru je Serial Monitor jedino mjesto gdje možemo vidjeti što se događa, pa je ovdje nužan.
*/
Serial.begin(115200);
Serial.println();
Serial.println("Wi-Fi GET Request Example");

/*
WiFi.begin() pokreće pokušaj povezivanja koristeći ime mreže i lozinku koje smo definirali iznad. Funkcija
ne čeka da se povezivanje dovrši, samo pokreće proces i odmah se vraća.
*/
WiFi.begin(ssid, password);
Serial.print("Connecting to Wi-Fi");

/*
Budući da se WiFi.begin() vraća odmah, na vezu moramo čekati sami. WiFi.status() nam kaže
trenutno stanje veze, a WL_CONNECTED je vrijednost koju prijavljuje kada smo na mreži. Ova while petlja
izvršava se dokle god još nismo povezani, ispisujući jednu točku svakih pola sekunde da vidimo da pločica
još pokušava.
*/
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

/*
Kada prođemo petlju iznad, povezani smo. WiFi.localIP() vraća adresu koju je router dodijelio
našoj pločici. Zapiši je, trebat će nam u sljedećem primjeru.
*/
Serial.println();
Serial.println("Connected to Wi-Fi!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());

/*
Ovdje stvaramo naš HTTP klijentski objekt, koji smo nazvali "http", i adresu koju želimo posjetiti. URL je ista
vrsta adrese koju upisuješ u preglednik.
*/
HTTPClient http;
String url = "http://example.com/";

Serial.print("Requesting data from: ");
Serial.println(url);

/*
begin() priprema zahtjev govoreći klijentu koju adresu želimo dosegnuti. U ovom trenutku preko mreže se još
ništa ne šalje.
*/
http.begin(url);

/*
GET() stvarno š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.
Funkcija vraća kod odgovora: brojevi 200 i više znače da je server odgovorio, dok negativan broj
znači da odgovor nikada nismo dobili.
*/
int httpCode = http.GET();

/*
Ovdje provjeravamo jesmo li dobili odgovor. Ako jesmo, ispisujemo kod odgovora i onda tijelo odgovora,
a za example.com to je HTML same stranice.
*/
if (httpCode > 0) {
Serial.print("HTTP Response Code: ");
Serial.println(httpCode);

/*
getString() vraća sadržaj koji nam je server poslao kao tekst.
*/
String payload = http.getString();
Serial.println("Received data:");
Serial.println("----------------------------------");
Serial.println(payload);
Serial.println("----------------------------------");
} else {

/*
errorToString() negativan kod greške pretvara u kratku rečenicu, koju je mnogo lakše razumjeti od
samog broja.
*/
Serial.print("Request failed. Error: ");
Serial.println(http.errorToString(httpCode));
}

/*
end() zatvara vezu i otpušta memoriju koju je klijent koristio. Uvijek zatvori vezu kada s njom završiš,
inače će program koji pravi mnogo zahtjeva polako ostati bez memorije.
*/
http.end();
}

void loop() {
//Ovdje se ništa ne događa, zahtjev je napravljen jednom u setup()
}

Što bi trebao vidjeti

Prenesi skicu, pa otvori Serial Monitor i postavi ga na 115200 bauda. Budući da se sve događa u setup(), ispis dolazi u jednom naletu nekoliko sekundi nakon što se pločica ponovno pokrene. Ako ga propustiš, pritisni RST s već otvorenim monitorom i sve se izvrši ponovno.

Serial Monitor prikazuje slijed povezivanja na Wi-Fi, HTTP kod odgovora 200 i početak HTML odgovora
Serial Monitor nakon uspješnog izvođenja. Pločica i port imenovani su duž vrha, a odabirač bauda sjedi na krajnjem desnom dijelu te trake, tek izvan ovog izreza

Odgovor dolazi kao jedna neprekinuta linija, i zato bježi udesno umjesto da prelazi u novi red, i zato je prozoru narasla vodoravna traka za pomicanje. Ispisan u cijelosti, cijeli ispis čita se:

ESP-ROM:esp32c6-20220919
Build:Sep 19 2022
rst:0x1 (POWERON),boot:0x6e (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:2
load:0x40875730,len:0x1278
load:0x4086b910,len:0xc58
load:0x4086e610,len:0x31c0
entry 0x4086b910

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:

Prvih devet linija nije tvoja skica. ESP-ROM, SPIWP i tri load: linije su ugrađeni bootloader čipa koji se javlja na dužnost prije nego se tvoj program pokrene. Ispisuju se pri svakom resetu, u svakom primjeru, i to je potpuno normalno. Tvoja skica počinje na praznoj liniji, s Wi-Fi GET Request Example.

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.

ℹ️
Prazna linija prije zaključnog reda crtica nije greška. HTML završava svojim novim redom, a Serial.println(payload) dodaje drugi nakon njega.

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.
  • Nečitljivi simboli umjesto riječi. Serial Monitor je na pogrešnom baud rateu. Mora biti 115200.
  • Ništa uopće. Ili je monitor otvoren nakon što je nalet već prošao (pritisni RST), ili pločica nije na portu prikazanom na vrhu prozora. Na Windowsu, pločica koja se uopće ne pojavi kao port treba CH340 driver.
  • Negativan kod odgovora. Pločica je došla do mreže ali nije mogla doći do sjedišta. Obično sama mreža nema radnu vezu s internetom, ili gostinska mreža blokira izlazne zahtjeve. Rečenica ispisana nakon Request failed. Error: to suzuje.

Cijeli primjer

Pogledaj cijeli kod primjera na linku ispod:

6.1_Connecting_and_Getting_Data.ino

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 Serial Monitor.