Tutorial ESP32 43/55 - Stație meteorologică IoT pe internet | Kitul de învățare IoT ESP32 de la SunFounder
În acest tutorial, vom construi o stație meteo conectată la internet folosind ESP32 și placa sa de extensie pentru cameră de la SunFounder. Acest proiect permite ESP32 să obțină date meteo în timp real, inclusiv temperatură și umiditate, și să le afișeze pe un ecran LCD. Această aplicație nu doar că evidențiază capacitățile ESP32, dar demonstrează și cum să preiei și să analizezi date de la o API externă.

Pe măsură ce avansăm prin tutorial, vom conecta componentele, vom configura codul și ne vom asigura că totul funcționează perfect împreună. Rezultatul final va fi o stație meteo complet funcțională care își actualizează citirile la fiecare 10 secunde, oferind o afișare clară și concisă a condițiilor meteo actuale (în video la 00:30).
Hardware Explicat
Principalele componente utilizate în acest proiect includ microcontrolerul ESP32, un ecran LCD și cablajul necesar. ESP32 este echipat cu Wi-Fi și Bluetooth integrate, permițându-i să se conecteze la internet și să preia date. Ecranul LCD va afișa informațiile meteo actuale, inclusiv temperatura și umiditatea.
LCD-ul pe care îl folosim este un afișaj cu caractere de 16x2, ceea ce înseamnă că poate afișa două linii a câte 16 caractere fiecare. Acest lucru va fi suficient pentru ieșirea informațiilor noastre meteo. ESP32 va comunica cu LCD-ul prin I2C, ceea ce simplifică cablajul folosind doar două linii de date.
Detalii din Fișa Tehnică
| Producător | Espressif |
|---|---|
| Număr de piesă | ESP32-WROOM-32 |
| Tensiune logică/IO | 3,3 V |
| Tensiune de alimentare | 3,0–3,6 V |
| Curent de ieșire (pe canal) | 12 mA max |
| Curent de vârf (pe canal) | 40 mA |
| Ghidare frecvență PWM | 1 kHz |
| Praguri logice de intrare | 0,3 V (jos), 0,7 V (sus) |
| Cădere de tensiune / RDS(on) / saturație | 0,5 V |
| Limite termice | -40 până la 85 °C |
| Pachet | QFN48 |
| Note / variante | Include mai multe variante pentru diferite aplicații |
- Asigurați-vă că ESP32 este alimentat cu o sursă stabilă de 3,3 V.
- Utilizați un fir comun de masă pentru toate componentele pentru a evita problemele de comunicare.
- Verificați adresa I2C a LCD-ului folosind un scaner I2C.
- Monitorizați starea conexiunii Wi-Fi pentru a evita deconectările în timpul preluării datelor.
- Gestionați erorile de parsare JSON pentru robustețe în preluarea datelor.
Instrucțiuni de Cablare

Pentru a cabla componentele, începeți prin conectarea LCD-ului la ESP32. LCD-ul va folosi interfața I2C, deci conectați pinul SDA al LCD-ului la GPIO21 pe ESP32 și pinul SCL la GPIO22. Asigurați-vă că conectați pinii de alimentare și masă ai LCD-ului la pinii de 5V și, respectiv, GND de pe ESP32.
Apoi, asigurați-vă că ESP32 este alimentat corect folosind bateria cu litiu inclusă sau o conexiune USB. Bateria oferă portabilitate, în timp ce conexiunea USB este utilă pentru programare și depanare. În final, verificați că toate conexiunile sunt sigure pentru a evita problemele de cablare slăbită care ar putea perturba funcționarea.
Exemple de Cod și Explicații
În faza de configurare a programului nostru, inițializăm comunicarea serială și ne conectăm la rețeaua Wi-Fi folosind SSID-ul și parola furnizate. Următorul fragment de cod gestionează conexiunea Wi-Fi:
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Conectat la rețeaua Wi-Fi cu adresa IP: ");
Serial.println(WiFi.localIP());
Acest cod asigură că ESP32 se conectează la rețeaua Wi-Fi specificată înainte de a continua cu orice preluare de date. Dacă conexiunea eșuează, va încerca continuu să se reconecteze.
Apoi, trebuie să trimitem o cerere HTTP GET pentru a prelua datele meteo. Acest lucru se realizează folosind următorul fragment de cod:
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
Aici, construim URL-ul pentru cererea API, care include orașul, codul țării și cheia noastră API. Funcția httpGETRequest este apoi apelată pentru a prelua datele meteo.
În final, analizăm răspunsul JSON și afișăm datele relevante pe 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"); // caracterul "°"
lcd.print("C ");
lcd.print("H:");
lcd.print(myObject["main"]["humidity"]);
lcd.print("%");
Acest fragment de cod actualizează afișajul LCD cu ora curentă, condiția meteo, temperatura și umiditatea. Șterge afișajul anterior și setează cursorul la pozițiile potrivite pentru fiecare linie.
Demonstrație / Ce să Vă Așteptați
După cablarea și programarea cu succes, stația voastră meteo se va conecta la Wi-Fi și va începe să preia date meteo la fiecare 10 secunde. Veți vedea temperatura curentă, umiditatea și condițiile meteo afișate pe ecranul LCD. Dacă ESP32 nu reușește să se conecteze la Wi-Fi, va afișa un mesaj de eroare pe monitorul serial.
Fiți atenți la limitele apelurilor API pentru a evita blocarea de la serviciul OpenWeatherMap. Dacă întâmpinați probleme cu preluarea datelor, verificați cheia API și asigurați-vă că orașul și codul de țară sunt specificate corect (în video la 15:45).
Marcaje temporale video
- 00:00 Start
- 2:00 Introducere în proiect
- 5:04 Cont OpenWeather
- 6:11 Cablare
- 8:05 Codul Arduino explicat
- 14:13 Elemente JSON în cod
- 20:23 Selectarea plăcii ESP32 și a portului COM în Arduino IDE
- 22:05 Demonstrație a stației meteo pe LCD1602
- 23:45 Demonstrație a stației meteo pe LCD2004
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
// Replace the next variables with your SSID/Password combination
const char* ssid = "SSID";
const char* password = "PASSWORD";
// Your Domain name with URL path or IP address with path
String openWeatherMapApiKey = "openWeatherMapApiKey";
// Replace with your country code and city
// Fine the country code by https://openweathermap.org/find
String city = "CITY";
String countryCode = "COUNTRY CODE";
// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Timer set to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Set timer to 10 seconds (10000)
unsigned long timerDelay = 10000;
String jsonBuffer;
// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;
// set LCD address, number of columns and rows
// SDA -> GPIO21, SCL -> GPIO22
// lcd address is 0x27, run an I2C scanner sketch
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
// NTP Server time
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.");
// initialize LCD
lcd.init();
// turn on LCD backlight
lcd.backlight();
}
void loop() {
// Send an HTTP GET request
if ((millis() - lastTime) > timerDelay) {
// Check WiFi connection status
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) can be used to get the type of the var
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
// Serial.print("JSON object = ");
// Serial.println(myObject);
// Serial.print("Temperature: ");
// Serial.println(myObject["main"]["temp"]);
// Serial.print("Pressure: ");
// Serial.println(myObject["main"]["pressure"]);
// Serial.print("Humidity: ");
// Serial.println(myObject["main"]["humidity"]);
// Serial.print("Wind Speed: ");
// Serial.println(myObject["wind"]["speed"]);
// Get time
gmtOffset_sec = myObject["timezone"];
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// time =
String time = printLocalTime();
// LCD Print
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("%");
}
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");
// get time format 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;
// Your Domain name with URL path or IP address with path
http.begin(client, serverName);
// Send HTTP POST request
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);
}
// Free resources
http.end();
return payload;
}
Common Course Links
Common Course Files
Resurse și referințe
-
DocumentațieESP32 Tutorial 43/55- SunFounder doc page for IoT Internet Weather Stationdocs.sunfounder.com
Fișiere📁
Nu sunt disponibile fișiere.