Utilizzare una board ESP32 per andare in rete come client su protocollo http e https prevede di poter configurare la scheda con Arduino IDE.
Spesso i nostri lettori ci chiedono come funziona la board ESP32. A tal proposito, abbiamo pubblicato recentemente un video in cui mettiamo a confronto le caratteristiche di un ESP32 e di un Arduino. Tuttavia iniziare a lavorare con tale scheda da zero richiede un minimo di preconfigurazione. Oggi ci occuperemo proprio di questo.
Configuriamo Arduino IDE
Per prima cosa occorre fare in modo che il codice compilato sia leggibile dal processore Expressif anziché l’Atmega328, sfruttandone i 2 MB di Flash, i 520 kb di SRAM e la velocità di elaborazione (sino a 240 MHz contro i 16 MHz di Arduino). Apriamo Arduino IDE ed operiamo come segue.
Selezioniamo File/Impostazioni, e nella casella “URL aggiuntive per il gestore schede” inseriamo la stringa
1 |
https://dl.espressif.com/dl/package_esp32_index.json |
Andiamo quindi in Strumenti/Gestione scheda, inseriamo nella casella di ricerca ESP32, e installiamo il software.
Infine, dal menu Strumenti/Schda/ESP32 Arduino selezionare il modello di ESP32 in nostro possesso. Aprendo il menù degli esempi troveremo il raccoglitore con tutti i listati per ESP32.
Andare su Internet con ESP32
A questo punto, carichiamo l’esempio HTTPClient/BasicHTTPClient e analizziamolo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
/** * BasicHTTPClient.ino * * Created on: 24.05.2015 * */ #include <Arduino.h> #include <WiFi.h> #include <WiFiMulti.h> #include <HTTPClient.h> #define USE_SERIAL Serial WiFiMulti wifiMulti; /* const char* ca = \ "-----BEGIN CERTIFICATE-----\n" \ "MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" \ "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \ "DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n" \ "SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n" \ "GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" \ "AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n" \ "q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n" \ "SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n" \ "Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n" \ "a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n" \ "/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n" \ "AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n" \ "CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n" \ "bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n" \ "c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n" \ "VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n" \ "ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n" \ "MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n" \ "Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n" \ "AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n" \ "uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n" \ "wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n" \ "X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n" \ "PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n" \ "KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n" \ "-----END CERTIFICATE-----\n"; */ void setup() { USE_SERIAL.begin(115200); USE_SERIAL.println(); USE_SERIAL.println(); USE_SERIAL.println(); for(uint8_t t = 4; t > 0; t--) { USE_SERIAL.printf("[SETUP] WAIT %d...\n", t); USE_SERIAL.flush(); delay(1000); } wifiMulti.addAP("SSID", "PASSWORD"); } void loop() { // wait for WiFi connection if((wifiMulti.run() == WL_CONNECTED)) { HTTPClient http; USE_SERIAL.print("[HTTP] begin...\n"); // configure traged server and url //http.begin("https://www.howsmyssl.com/a/check", ca); //HTTPS http.begin("http://jsonplaceholder.typicode.com/comments?id=10"); //HTTP USE_SERIAL.print("[HTTP] GET...\n"); // start connection and send HTTP header int httpCode = http.GET(); // httpCode will be negative on error if(httpCode > 0) { // HTTP header has been send and Server response header has been handled USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); // file found at server if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); USE_SERIAL.println(payload); } } else { USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } delay(5000); } |
Le righe dalla 8 alla 15 caricano (gli header del)le librerie necessarie; viene quindi definito l’oggetto wifiMulti, che si occuperà di gestire la comunicazione wireless.
Le righe tra la 19 e la 48 prevedono l’inserimento di un certificato digitale rilasciato da opportuna Certification Authority, per poter viaggiare in HTTPS su canale cifrato. Nel nostro programma base non lo useremo, ma la riga di codice necessaria, seppur commentata, esiste.
Nel setup inizializziamo la seriale (52-56), attendiamo un timeout (58-62), e tentiamo il collegamento alla rete (64). Ovviamente i valori di SSID e PASSWORD vanno sosituiti con quelli della rete alla quale ci si vuole connettere.
Il loop è decisamente semplice: si attendono 5 secondi se non c’è connessione. Quando la connessione risulta attiva, si crea l’oggetto http (il nostro client). La riga 76 contiene l’indirizzo HTTPS, la riga 77 quello di un server in connessione HTTP (quello che useremo in questo esempio). NOTA: la stringa tra apici nell’http.begin deve contenere un indirizzo valido al quale è in ascolto una pagina in grado di rispondere ad una richiesta GET. Non tratteremo in questo articolo il formato necessario.
Se otterremo un codice positivo (riga 84) stamperemo l’header. Se il codice corrisponde alla costante HTTP_CODE_OK allora copiremo nella stringa “payload” il contenuto della risposta alla nostra GET. Se invece avremo un codice di errore, scriveremo un messaggio sul Serial Monitor.
Considerazioni finali
Se il nostro server dispone dei servizi opportunamente progettati per rispondere a chiamate GET (o POST) del client ESP32 (è possibile inviare diversi parametri alla volta), inserire i dati riscontrati dal microcoltrollore in un database per una successiva elaborazione grafica sarà una passeggiata. ESP32 potrà porsi in modalità sleep in attesa di un segnale di wake up, quindi registrare il segnale, elaborarlo, inviarlo via rete wireles al server e rimettersi a “dormire”… allungando notevolmente la vita delle batterie.
Niente male, vero?
Join our groups on Telegram…
Mi dispiace, ma il listato sopra non funziona. Ho provato con il mio ESP32 senza riuscirci.
Cosa significa “non funziona”?
Di seguito la lista dei possibili problemi che un utente potrebbe riscontrare. Facci sapere dove si blocca il programma, e cercheremo di aiutarti.
(Tieni presente che la programmazione di un client server per il networking non è il modo più banale per avvicinarsi a ESP32…)
– Non compila
– Compila ma non viene trasferito su ESP32
– Dà un errore al lancio (nel caso, occorre numero e codice di errore)
– Arriva al setup() ma si blocca in wait
– Passa il setup() ma non riconosce SSID e PASSWD
– Non scrive lo stato sul serial monitor
– Si collega ma non risponde alla GET
– RIsponde “GET Failed” sul serial monitor
Adattato per la mia applicazione,funziona perfettamente. Grazie!
Grazie a te” 🙂