Tutorial ESP32 43/55 - Stazione Meteorologica IoT Internet | Kit di apprendimento IoT ESP32 di SunFounder
In questo tutorial, costruiremo una stazione meteorologica connessa a Internet utilizzando l'ESP32 e la sua scheda di estensione per la camera di SunFounder. Questo progetto consente all'ESP32 di recuperare dati meteorologici in tempo reale, inclusi temperatura e umidità, e di visualizzarli su uno schermo LCD. Questa applicazione non solo mette in mostra le capacità dell'ESP32, ma dimostra anche come recuperare e analizzare i dati da un'API esterna.

Man mano che progrediamo nel tutorial, collegheremo i componenti, configureremo il codice e ci assicureremo che tutto funzioni perfettamente insieme. Il risultato finale sarà una stazione meteorologica completamente funzionante che aggiorna le sue letture ogni 10 secondi, fornendo una visualizzazione chiara e concisa delle attuali condizioni meteorologiche (nel video a 00:30).
Hardware Spiegato
I principali componenti utilizzati in questo progetto includono il microcontrollore ESP32, un display LCD e il cablaggio necessario. L'ESP32 è dotato di Wi-Fi e Bluetooth integrati, permettendo di connettersi a Internet e recuperare dati. Il display LCD mostrerà le attuali informazioni meteorologiche, inclusa la temperatura e l'umidità.
Il LCD che stiamo utilizzando è un display di caratteri 16x2, il che significa che può mostrare due righe di 16 caratteri ciascuna. Questo sarà sufficiente per la nostra uscita di informazioni meteorologiche. L'ESP32 comunicherà con il LCD tramite I2C, il che semplifica il cablaggio utilizzando solo due linee dati.
Dettagli della scheda tecnica
| Produttore | Espressif |
|---|---|
| Numero parte | ESP32-WROOM-32 |
| Tensione di logica/IO | 3,3 V |
| Tensione di alimentazione | 3,0-3,6 V |
| Corrente di uscita (per canale) | 12 mA max |
| Corrente di picco (per canale) | 40 mA |
| Guida per la frequenza PWM | 1 kHz |
| Soglie logiche di ingresso | 0,3 V (basso), 0,7 V (alto) |
| Caduta di tensione / RDS(on)/ saturazione | 0,5 V |
| Limiti termici | -40 a 85 °C |
| Pacco | QFN48 |
| Note / varianti | Include più varianti per diverse applicazioni. |
- Assicurati che l'ESP32 sia alimentato con una fornitura stabile di 3,3 V.
- Utilizza un terreno comune per tutti i componenti per evitare problemi di comunicazione.
- Controlla l'indirizzo I2C del LCD utilizzando uno scanner I2C.
- Monitora lo stato della connessione Wi-Fi per evitare disconnessioni durante il recupero dei dati.
- Gestire gli errori di parsing JSON per garantire robustezza nel recupero dei dati.
Istruzioni di cablaggio

Per cablare i componenti, inizia collegando il LCD all'ESP32. Il LCD utilizzerà l'interfaccia I2C, quindi collega il pin SDA del LCD al GPIO21 sull'ESP32 e il pin SCL al GPIO22. Assicurati di collegare i pin di alimentazione e terra del LCD ai pin 5V e GND sull'ESP32, rispettivamente.
Successivamente, assicurati che l'ESP32 sia alimentato correttamente utilizzando la batteria al litio inclusa o una connessione USB. La batteria offre portabilità, mentre la connessione USB è utile per programmazione e debugging. Infine, controlla che tutte le connessioni siano sicure per evitare problemi di cablaggio allentato che potrebbero interrompere il funzionamento.
Esempi di codice e guida passo passo
Nella fase di configurazione del nostro programma, inizializziamo la comunicazione seriale e ci connettiamo alla rete Wi-Fi utilizzando l'SSID e la password forniti. Il seguente frammento di codice gestisce la connessione Wi-Fi:
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());Questo codice garantisce che l'ESP32 si connetta alla rete Wi-Fi specificata prima di procedere con il recupero dei dati. Se la connessione fallisce, tenterà continuamente di riconnettersi.
Successivamente, dobbiamo inviare una richiesta HTTP GET per recuperare i dati meteorologici. Questo viene realizzato utilizzando il seguente frammento di codice:
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());Qui costruiamo l'URL per la richiesta API, che include la città, il codice del paese e la nostra chiave API.httpGETRequestViene quindi chiamata la funzione per recuperare i dati meteorologici.
Infine, analizziamo la risposta JSON e visualizziamo i dati pertinenti sul LCD:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(myObject["weather"][0]["main"]);
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(myObject["main"]["temp"]);
lcd.print("\xDF"); // "°" char
lcd.print("C ");
lcd.print("H:");
lcd.print(myObject["main"]["humidity"]);
lcd.print("%");Questo frammento di codice aggiorna il display LCD con l'ora corrente, le condizioni meteorologiche, la temperatura e l'umidità. Pulisce il display precedente e imposta il cursore nelle posizioni appropriate per ogni riga.
Dimostrazione / Cosa Aspettarsi
Dopo il cablaggio e la programmazione riusciti, la tua stazione meteorologica si connetterà al Wi-Fi e inizierà a recuperare i dati meteorologici ogni 10 secondi. Vedrai la temperatura attuale, l'umidità e le condizioni meteorologiche visualizzate sullo schermo LCD. Se l'ESP32 non riesce a connettersi al Wi-Fi, stamperà un messaggio di errore sul monitor seriale.
Fai attenzione ai limiti delle chiamate API per evitare di essere bloccato dal servizio OpenWeatherMap. Se riscontri problemi con il recupero dei dati, controlla la tua chiave API e assicurati che il codice della tua città e del tuo paese siano specificati correttamente (nel video alle 15:45).
Timestamp video
- 00:00 Inizio
- 2:00 introduzione al progetto
- 5:04 Account OpenWeather
- 6:11 Cablaggio
- 8:05 Codice Arduino spiegato
- 14:13 JASON Elementi nel codice
- 20:23 Selezionando la scheda ESP32 e la porta COM in Arduino IDE
- 22:05 Dimostrazione della Stazione Meteorologica su LCD1602
- 23:45 Dimostrazione della Stazione Meteo su LCD2004
/*
* Rui Santos
* Dettagli completi del progetto disponibili su https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/
*
* Con la presente si concede, gratuitamente, a qualsiasi persona che ottenga una copia
* di questo software e dei relativi file di documentazione.
*
* Il suddetto avviso di copyright e questo avviso di autorizzazione devono essere inclusi in tutte
* le copie o porzioni sostanziali del Software.
*/
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
// Sostituisci le seguenti variabili con la tua combinazione SSID/Password
const char* ssid = "SSID";
const char* password = "PASSWORD";
// Il tuo nome di dominio con percorso URL o indirizzo IP con percorso
String openWeatherMapApiKey = "openWeatherMapApiKey";
// Sostituisci con il tuo codice di paese e città
// Trova il codice del paese su https://openweathermap.org/find
String city = "CITY";
String countryCode = "COUNTRY CODE";
// IL TIMER PER DEFETTO È IMPOSTATO SU 10 SECONDI PER FINI DI TEST.
// Per un'applicazione finale, controlla i limiti delle chiamate API per ora/minuto per evitare di essere bloccato/bannato.
unsigned long lastTime = 0;
// Timer impostato su 10 minuti (600000)
// unsigned long timerDelay = 600000;
// Imposta il timer su 10 secondi (10000)
unsigned long timerDelay = 10000;
String jsonBuffer;
// imposta il numero di colonne e righe del LCD
int lcdColumns = 16;
int lcdRows = 2;
// imposta indirizzo LCD, numero di colonne e righe
// SDA -> GPIO21, SCL -> GPIO22
// l'indirizzo LCD è 0x27, esegui uno sketch di scansione I2C
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
// Tempo del server NTP
const char* ntpServer = "pool.ntp.org";
long gmtOffset_sec = 0;
int daylightOffset_sec = 0; // 3600;
void setup() {
Serial.begin(115200);
// WiFi
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
// inizializza LCD
lcd.init();
// accendi la retroilluminazione LCD
lcd.backlight();
}
void loop() {
// Invia una richiesta HTTP GET
if ((millis() - lastTime) > timerDelay) {
// Controlla lo stato della connessione WiFi
if(WiFi.status()== WL_CONNECTED){
String serverPath = "http: // api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
Serial.println(jsonBuffer);
JSONVar myObject = JSON.parse(jsonBuffer);
// JSON.typeof(jsonVar) può essere utilizzato per ottenere il tipo della variabile.
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
// Serial.print("oggetto JSON = ");
// Serial.println(myObject);
// Temperature:
// Serial.println(myObject["main"]["temp"]);
// Pressure:
// Serial.println(myObject["main"]["pressure"]);
// Serial.print("Umidità: ");
// Serial.println(myObject["main"]["umidità"]);
// Serial.print("Velocità del vento: ");
// Serial.println(myObject["vento"]["velocità"]);
// Ottieni tempo
gmtOffset_sec = myObject["timezone"];
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// tempo =
String time = printLocalTime();
// Stampa LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(myObject["weather"][0]["main"]);
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(myObject["main"]["temp"]);
lcd.print("\xDF"); // "°" carattere
lcd.print("C ");
lcd.print("H:");
lcd.print(myObject["main"]["humidity"]);
lcd.print("%");
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
String printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return "null";
}
// Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
// ottieni formato orario HH:MM
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
char timeMinute[3];
strftime(timeMinute,3, "%M", &timeinfo);
String time = String(timeHour) + ":" + String(timeMinute);
Serial.println(time)
; return time;
}
String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;
// Il tuo nome di dominio con percorso URL o indirizzo IP con percorso
http.begin(client, serverName);
// Invia richiesta HTTP POST
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Risorse gratuite
http.end();
return payload;
}
Common Course Links
Common Course Files
Risorse e riferimenti
-
DocumentazioneTutorial ESP32 43/55 - Pagina doc SunFounder per Stazione Meteorologica IoTdocs.sunfounder.com
File📁
Nessun file disponibile.