ESP32 Tutoriaal 43/55 - IoT Internetweerstasie | SunFounder se ESP32 IoT-leerkit
In hierdie tutoriaal gaan ons 'n internet-gekoppelde weerstasie bou met behulp van die ESP32 en sy kamerauitbreidingsbord van SunFounder. Hierdie projek stel die ESP32 in staat om intydse weersdata, insluitend temperatuur en humiditeit, op te haal en op 'n LCD-skerm te vertoon. Hierdie toepassing wys nie net die vermoëns van die ESP32 nie, maar demonstreer ook hoe om data van 'n eksterne API te haal en te ontleed.

Soos ons deur die tutoriaal vorder, sal ons die komponente bedraad, die kode opstel, en verseker dat alles naatloos saamwerk. Die eindresultaat sal 'n ten volle funksionele weerstasie wees wat sy lesings elke 10 sekondes opdateer, met 'n duidelike en bondige vertoning van huidige weersomstandighede (in video by 00:30).
Hardeware Verduidelik
Die hoofkomponente wat in hierdie projek gebruik word, sluit die ESP32-mikrobeheerder, 'n LCD-skerm en die nodige bedrading in. Die ESP32 is toegerus met ingeboude Wi-Fi en Bluetooth, wat dit in staat stel om aan die internet te koppel en data op te haal. Die LCD-skerm sal die huidige weerinligting, insluitend temperatuur en humiditeit, wys.
Die LCD wat ons gebruik is 'n 16x2-karaktervertoning, wat beteken dit kan twee reëls van 16 karakters elk wys. Dit sal voldoende wees vir ons weerinligting-uitset. Die ESP32 sal met die LCD via I2C kommunikeer, wat die bedrading vereenvoudig deur slegs twee datalyns te gebruik.
Datablad Besonderhede
| Vervaardiger | Espressif |
|---|---|
| Deelnommer | ESP32-WROOM-32 |
| Logika/IO-spanning | 3.3 V |
| Toevoerspanning | 3.0–3.6 V |
| Uitgangstroom (per kanaal) | 12 mA maks |
| Piekstroom (per kanaal) | 40 mA |
| PWM-frekwensie riglyn | 1 kHz |
| Insetlogika-drempels | 0.3 V (laag), 0.7 V (hoog) |
| Spanningsval / RDS(on) / versadiging | 0.5 V |
| Termiese limiete | -40 tot 85 °C |
| Pakket | QFN48 |
| Notas / variante | Sluit verskeie variante vir verskillende toepassings in |
- Verseker dat die ESP32 met 'n stabiele 3.3 V-toevoer aangedryf word.
- Gebruik 'n gemeenskaplike grond vir alle komponente om kommunikasieprobleme te vermy.
- Kontroleer die I2C-adres van die LCD met 'n I2C-skandeerder.
- Monitor die Wi-Fi-verbindingstatus om ontkoppelings tydens data-opwekking te vermy.
- Hanteer JSON-ontledingsfoute vir robuustheid in dataherwinning.
Bedradingsinstruksies

Om die komponente te bedraad, begin deur die LCD aan die ESP32 te koppel. Die LCD sal die I2C-koppelvlak gebruik, so verbind die SDA-pen van die LCD aan GPIO21 op die ESP32 en die SCL-pen aan GPIO22. Maak seker dat jy die krag- en grondpenne van die LCD aan die 5V- en GND-penne op die ESP32 onderskeidelik koppel.
Volgende, verseker dat die ESP32 korrek aangedryf word met die ingeslote litiumbattery of 'n USB-verbinding. Die battery bied draagbaarheid, terwyl die USB-verbinding nuttig is vir programmering en foutopsporing. Kontroleer laastens dat alle verbindings veilig is om los bedradingskwessies te vermy wat funksionaliteit kan ontwrig.
Kode Voorbeelde & Deurloop
In die opstellingsfase van ons program, initialiseer ons die seriekommunikasie en koppel aan die Wi-Fi-netwerk met die verskafde SSID en wagwoord. Die volgende kodefragment hanteer die Wi-Fi-verbinding:
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());
Hierdie kode verseker dat die ESP32 aan die gespesifiseerde Wi-Fi-netwerk koppel voordat dit met enige data-opwekking voortgaan. As die verbinding misluk, sal dit voortdurend probeer om weer te koppel.
Volgende moet ons 'n HTTP GET-versoek stuur om weersdata op te haal. Dit word bereik met die volgende kodefragment:
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
Hier konstrueer ons die URL vir die API-versoek, wat die stad, landkode en ons API-sleutel insluit. Die httpGETRequest-funksie word dan geroep om die weersdata op te haal.
Laastens ontleed ons die JSON-reaksie en vertoon die relevante data op die 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("%");
Hierdie kodefragment werk die LCD-vertoning op met die huidige tyd, weersomstandigheid, temperatuur en humiditeit. Dit maak die vorige vertoning skoon en stel die wyser op die toepaslike posisies vir elke reël.
Demonstrasie / Wat om te VerwAg
Na suksesvolle bedrading en programmering sal jou weerstasie aan die Wi-Fi koppel en elke 10 sekondes weersdata begin haal. Jy sal die huidige temperatuur, humiditeit en weersomstandighede op die LCD-skerm sien vertoon. As die ESP32 nie aan Wi-Fi kan koppel nie, sal dit 'n foutboodskap op die serie-monitor druk.
Wees bedag op die API-oproeplimiete om te verhoed dat jy van die OpenWeatherMap-diens geblokkeer word. As jy enige probleme met data-onttrekking ondervind, kontroleer jou API-sleutel en maak seker dat jou stad- en landkode korrek gespesifiseer is (in video by 15:45).
Video-tydstempels
- 00:00 Begin
- 2:00 Inleiding tot die projek
- 5:04 OpenWeather-rekening
- 6:11 Bedrading
- 8:05 Arduino-kode verduidelik
- 14:13 JASON-elemente in kode
- 20:23 Kies ESP32-bord en COM-poort in Arduino IDE
- 22:05 Demonstrasie van Weerstasie op LCD1602
- 23:45 Demonstrasie van Weerstasie op 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
Hulpbronne en verwysings
-
DokumentasieESP32 Tutorial 43/55 - SunFounder doc page for IoT Internet Weather Stationdocs.sunfounder.com
Lêers📁
Geen lêers beskikbaar.