ESP32-zelfstudie 43/55 - IoT-internetweerstation | SunFounder's ESP32 IoT-leerkit
In deze tutorial bouwen we een internetverbonden weerstation met behulp van de ESP32 en de camera-uitbreidingskaart van SunFounder. Dit project stelt de ESP32 in staat om realtime weergegevens op te halen, waaronder temperatuur en luchtvochtigheid, en deze weer te geven op een LCD-scherm. Deze toepassing laat niet alleen de mogelijkheden van de ESP32 zien, maar demonstreert ook hoe gegevens van een externe API kunnen worden opgehaald en geparseerd.

Naarmate we verder gaan met de tutorial, zullen we de componenten bedraden, de code configureren en ervoor zorgen dat alles naadloos samenwerkt. Het eindresultaat is een volledig functioneel weerstation dat elke 10 seconden zijn metingen bijwerkt en een duidelijke en beknopte weergave biedt van de huidige weersomstandigheden (in video op 00:30).
Hardware uitgelegd
De belangrijkste componenten die in dit project worden gebruikt, zijn de ESP32-microcontroller, een LCD-scherm en de benodigde bedrading. De ESP32 is uitgerust met ingebouwde Wi-Fi en Bluetooth, waardoor deze verbinding kan maken met internet en gegevens kan ophalen. Het LCD-scherm toont de huidige weersinformatie, inclusief temperatuur en luchtvochtigheid.
Het LCD-scherm dat we gebruiken is een 16x2-tekendisplay, wat betekent dat het twee regels van elk 16 tekens kan weergeven. Dit is voldoende voor onze weersinformatie-uitvoer. De ESP32 communiceert met het LCD-scherm via I2C, wat de bedrading vereenvoudigt door slechts twee datalijnen te gebruiken.
Datasheet-details
| Fabrikant | Espressif |
|---|---|
| Onderdeelnummer | ESP32-WROOM-32 |
| Logica/IO-spanning | 3,3 V |
| Voedingsspanning | 3,0–3,6 V |
| Uitgangsstroom (per kanaal) | 12 mA max |
| Piekstroom (per kanaal) | 40 mA |
| PWM-frequentierichtlijn | 1 kHz |
| Ingangslogische drempels | 0,3 V (laag), 0,7 V (hoog) |
| Spanningsval / RDS(on) / verzadiging | 0,5 V |
| Thermische limieten | -40 tot 85 °C |
| Behuizing | QFN48 |
| Opmerkingen / varianten | Bevat meerdere varianten voor verschillende toepassingen |
- Zorg ervoor dat de ESP32 wordt gevoed met een stabiele 3,3 V-voeding.
- Gebruik een gemeenschappelijke aarde voor alle componenten om communicatieproblemen te voorkomen.
- Controleer het I2C-adres van het LCD-scherm met een I2C-scanner.
- Bewaak de Wi-Fi-verbindingsstatus om verbindingsverlies tijdens het ophalen van gegevens te voorkomen.
- Verwerk JSON-parserfouten voor robuustheid bij het ophalen van gegevens.
Bedradingsinstructies

Om de componenten te bedraden, begin je met het aansluiten van het LCD-scherm op de ESP32. Het LCD-scherm gebruikt de I2C-interface, dus verbind de SDA-pin van het LCD-scherm met GPIO21 op de ESP32 en de SCL-pin met GPIO22. Zorg ervoor dat je de stroom- en aardpinnen van het LCD-scherm respectievelijk verbindt met de 5V- en GND-pinnen op de ESP32.
Zorg er vervolgens voor dat de ESP32 correct wordt gevoed met behulp van de meegeleverde lithiumbatterij of een USB-verbinding. De batterij biedt draagbaarheid, terwijl de USB-verbinding nuttig is voor programmeren en debuggen. Controleer ten slotte dat alle verbindingen stevig zijn om losse bedrading te voorkomen die de functionaliteit zou kunnen verstoren.
Codevoorbeelden en uitleg
In de setup-fase van ons programma initialiseren we de seriële communicatie en maken we verbinding met het Wi-Fi-netwerk met behulp van de opgegeven SSID en het wachtwoord. Het volgende codefragment verzorgt de Wi-Fi-verbinding:
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Verbonden met Wi-Fi-netwerk met IP-adres: ");
Serial.println(WiFi.localIP());
Deze code zorgt ervoor dat de ESP32 verbinding maakt met het opgegeven Wi-Fi-netwerk voordat er gegevens worden opgehaald. Als de verbinding mislukt, blijft het apparaat opnieuw verbinding proberen te maken.
Vervolgens moeten we een HTTP-GET-verzoek sturen om weergegevens op te halen. Dit wordt gedaan met het volgende codefragment:
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());
Hier construeren we de URL voor het API-verzoek, die de stad, landcode en onze API-sleutel bevat. De functie httpGETRequest wordt vervolgens aangeroepen om de weergegevens op te halen.
Ten slotte parsen we de JSON-respons en geven we de relevante gegevens weer op het LCD-scherm:
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("%");
Dit codefragment werkt het LCD-scherm bij met de huidige tijd, weersomstandigheid, temperatuur en luchtvochtigheid. Het wist de vorige weergave en plaatst de cursor op de juiste posities voor elke regel.
Demonstratie / Wat te verwachten
Na succesvolle bedrading en programmering zal je weerstation verbinding maken met de Wi-Fi en elke 10 seconden weergegevens ophalen. Je ziet de huidige temperatuur, luchtvochtigheid en weersomstandigheden op het LCD-scherm. Als de ESP32 geen verbinding kan maken met Wi-Fi, wordt er een foutmelding naar de seriële monitor gestuurd.
Wees alert op de API-call-limieten om te voorkomen dat u wordt geblokkeerd van de OpenWeatherMap-service. Als u problemen ondervindt bij het ophalen van gegevens, controleer dan uw API-sleutel en zorg ervoor dat uw stad en landcode correct zijn opgegeven (in video op 15:45).
Videotijdstippen
- 00:00 Start
- 2:00 Introductie van het project
- 5:04 OpenWeather-account
- 6:11 Bedrading
- 8:05 Arduino-code uitgelegd
- 14:13 JASON-elementen in code
- 20:23 ESP32-board en COM-poort selecteren in Arduino IDE
- 22:05 Demonstratie van weerstation op LCD1602
- 23:45 Demonstratie van weerstation 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
Hulpmiddelen en referenties
-
DocumentatieESP32 Tutorial 43/55- SunFounder doc page for IoT Internet Weather Stationdocs.sunfounder.com
Bestanden📁
Geen bestanden beschikbaar.