Weerstation met ESP32 en Google Spreadsheet
Deze handleiding beschrijft stap voor stap hoe je:
- een ESP32-S3 WROOM-1 gebruikt
- een DHT11-sensor uitleest
- metingen automatisch opslaat in een Google Spreadsheet
- lokale weergegevens ophaalt via OpenWeatherMap van de exacte locatie die je zelf wilt
Benodigdheden
Hardware
- ESP32-S3 WROOM-1
- DHT11 sensor (3 pinnen)
- 3 jumper wires van female naar female
- USB naar USB-C kabel
Software
- Arduino IDE
Accounts
- Google account
- OpenWeatherMap account
Troubleshooting
Stel dat je ergens vast komt te lopen kan je onderaan naar troubleshooting gaan om daar te checken of je jouw veelvoorkomende fout kan terugvinden.
Stap 1: DHT11 aansluiten op de ESP32
DHT11 pinnen (3 pinnen, van links naar rechts)
- DATA (signaal)
- VCC (voeding)
- GND (massa)
Aansluitschema
| DHT11 | ESP32 |
|---|---|
| DATA | GPIO 4 |
| VCC | 3.3V |
| GND | GND |

Stap 2: Arduino IDE instellen voor ESP32
- Open Arduino IDE
- Ga naar File → Preferences
- Plak onderstaande link bij Additional Boards Manager URLs
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

- Klik op OK
Stap 3: Benodigde libraries installeren
Deze libraries zijn nodig om de DHT11 te laten werken.
- Ga naar Sketch → Include Library → Manage Libraries
- Zoek esp32 by Espressif Systems en istalleer die

- Installeer vervolgens DHT sensor library by Adafruit

- Installeer ook Adafruit Unified Sensor by Adafruit

Stap 4: Board en poort selecteren/aansluiten
- Sluit de ESP32 aan op je pc
- Ga naar Tools → Board → ESP32 Arduino
- Kies ESP32S3 Dev Module

- Ga naar Tools → Port
- Kies de juiste COM-poort

- Ga naar Tools → USB CDC On Boot → Enabled
Stap 5: Google Spreadsheet aanmaken
- Ga naar https://drive.google.com
- Klik op Nieuw → Google Spreadsheets

- Geef het bestand een naam
Kolomnamen invullen (rij 1)
| A1 | B1 | C1 | D1 | E1 | F1 |
|---|---|---|---|---|---|
| Tijd | Station | Temperatuur (°C) ESP | Luchtvochtigheid (%) ESP | Temperatuur (°C) PLAATSNAAM | Luchtvochtigheid (%) PLAATSNAAM |
PLAATSNAAM kan vervangen worden door de naam van de eigen locatie.
Stap 6: AppsScript openen
- Open de Google Spreadsheet
- Klik op Extensions → AppsScript

- Verwijder alle bestaande code
Stap 7: OpenWeatherMap instellen
- Log in op https://openweathermap.org

- Ga naar API keys
- Kopieer je persoonlijke API-key

Latitude en longitude bepalen
- Gebruik Google Maps
- Rechtsklik op de gewenste locatie
- Kopieer latitude en longitude
Stap 8: AppsScript code
In deze stap pas je enkel de onderdelen aan die afhankelijk zijn van jouw locatie en account. Alles wat te maken heeft met het ontvangen van data van de ESP32 werkt automatisch en niet aan te passen.
Wat moet je aanpassen in deze stap?
Je moet drie dingen zelf invullen:
- Je OpenWeatherMap API-key
- De latitude van je locatie
- De longitude van je locatie
Alle andere delen van de code mag je ongewijzigd laten.
AppsScript code
function doGet(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var time = new Date();
var station = e.parameter.station || "ONBEKEND";
var tempESP = Number(e.parameter.temp);
var humESP = Number(e.parameter.hum);
var placeTemp = "";
var placeHum = "";
try {
var weather = getPlaceWeather();
placeTemp = weather.temp;
placeHum = weather.humidity;
} catch (err) {
placeTemp = "FOUT";
placeHum = "FOUT";
}
sheet.appendRow([
time,
station,
tempESP,
humESP,
placeTemp,
placeHum
]);
return ContentService.createTextOutput("OK");
}
function getPlaceWeather() {
// HIER je eigen OpenWeatherMap API-key invullen
const apiKey = 'JOUW_API_KEY_HIER';
// HIER de latitude van je locatie invullen
const lat = 0.000;
// HIER de longitude van je locatie invullen
const lon = 0.000;
const url = 'https://api.openweathermap.org/data/2.5/weather?lat=' +
lat + '&lon=' + lon + '&units=metric&appid=' + apiKey;
const response = UrlFetchApp.fetch(url);
const data = JSON.parse(response.getContentText());
if (!data.main) {
throw new Error('Geen geldige data ontvangen');
}
return {
temp: data.main.temp,
humidity: data.main.humidity
};
}
Deze code plak je dan in Apps Script-bestand. Klik daarna op de opslaan-knop linksboven om je wijzigingen op te slaan.
Stap 9: AppsScript publiceren
- Klik op Implementatie → Nieuwe implementatie → Web-app


- Beschrijving: Keuze
- Uitvoeren als: Mij
- Wie heeft er toegang: Iedereen
- Klik op Implementeren
- Ga naar implementaties beheren --> Kopieer de gegenereerde URL --> Deze URL heb je later nodig in de Arduino code.
- Laat het scriptje 1 keer lopen zodat je een melding krijgt om toestemming te kunnen geven dat Openweathermap altijd toegang heeft tot het script.

-
Druk linksonder gewoon op doorgaan
-
Stel dat je niks kreeg van meldingen verzet dit en probeer het dan opnieuw:
Stap 10: Arduino code
In deze stap pas je enkel de instellingen aan die persoonlijk zijn. De rest van de code zorgt automatisch voor:
Wat moet je aanpassen in deze stap?
Je moet vijf dingen zelf invullen:
- SSID
- Wifi-wachtwoord
- Apps Script URL
- Stationnaam
- (optioneel) tijd tussen metingen
Arduino code
#include <WiFi.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// WIFI
const char* ssid = "SSID"; // Plaats hier uw SSID
const char* password = "WIFI_WACHTWOORD"; // Zet hier uw WIFI-wachtwoord
// GOOGLE SCRIPT
const char* server = "APPS_SCRIPT_URL"; // Plak hier de URL van het Apps Script
String stationName = "STATION_NAAM"; // Kies een naam voor uw station
unsigned long delayTime = 300000; // 5 minuten
void connectWiFi() {
Serial.println("Verbinden met WiFi...");
WiFi.begin(ssid, password);
int tries = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
tries++;
if (tries > 40) {
Serial.println("WiFi reconnect...");
WiFi.disconnect();
WiFi.begin(ssid, password);
tries = 0;
}
}
Serial.println("");
Serial.println("WiFi verbonden!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
delay(2000);
Serial.println("ESP32 Weerstation start");
dht.begin();
connectWiFi();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
connectWiFi();
}
Serial.println("");
Serial.println("Nieuwe meting...");
delay(2000);
float hum = dht.readHumidity();
float temp = dht.readTemperature();
if (isnan(temp) || isnan(hum)) {
Serial.println("DHT fout");
delay(5000);
return;
}
Serial.print("Temp: ");
Serial.println(temp);
Serial.print("Hum: ");
Serial.println(hum);
String tempStr = String(temp, 1);
String humStr = String(hum, 1);
String url = String(server) +
"?station=" + stationName +
"&temp=" + tempStr +
"&hum=" + humStr;
Serial.print("URL: ");
Serial.println(url);
WiFiClientSecure client;
client.setInsecure();
client.setTimeout(15000);
HTTPClient http;
http.setTimeout(15000);
if (http.begin(client, url)) {
int httpCode = http.GET();
if (httpCode > 0) {
Serial.print("HTTP code: ");
Serial.println(httpCode);
String payload = http.getString();
Serial.println(payload);
} else {
Serial.print("HTTP fout: ");
Serial.println(httpCode);
}
http.end();
} else {
Serial.println("HTTP start mislukt");
}
Serial.println("Volgende meting over 5 minuten");
delay(delayTime);
}
Nu plak je dit in Arduino IDE en als alle instellingen correct zijn en de jumper wires correct zijn aangesloten druk je op de upload knop en ben je klaar voor de metingen binnen te krijgen
Resultaat
Na elke meting:
- wordt automatisch een nieuwe rij toegevoegd
- met tijdstip
- metingen van de ESP32
- vergelijking met OpenWeatherMap
Werking
Als je wilt begrijpen hoe het werkt dan kan je het zo bekijken:
ESP32 → WiFi → Google Apps Script → Google Spreadsheet
↓
OpenWeatherMap API
Wanneer de ESP32 een meting uitvoert, stuurt hij die via WiFi naar jouw Google Apps Script‑URL. Dat script vangt de gegevens op, vraagt tegelijk de actuele weersituatie op bij OpenWeatherMap en schrijft alles samen in één nieuwe rij in je Google Spreadsheet. Zo heb je telkens zowel je eigen sensormetingen als de officiële weerdata netjes naast elkaar opgeslagen.
Troubleshooting
Hier vind je oplossingen voor veelvoorkomende problemen tijdens het instellen van het weerstation.
ESP32 blijft hangen op “Connecting to WiFi…”
Mogelijke oorzaken:
- Verkeerd WiFi‑wachtwoord
- Je router gebruikt enkel 5 GHz (ESP32 werkt alleen op 2.4 GHz)
- Signaal te zwak
- MAC‑filtering staat aan op de router
- Je hotspot staat op 5 GHz → zet hem op 2.4 GHz
Spreadsheet blijft leeg
Controleer het volgende:
- Apps Script is niet gepubliceerd als Iedereen
- Je hebt de verkeerde URL gekopieerd (gebruik de /exec‑versie)
- Je hebt parameters vergeten (bijv.
?station=...&temp=...&hum=...) - Je hebt het script nog nooit handmatig uitgevoerd → toestemming ontbreekt
- Je hebt de verkeerde spreadsheet geopend
OpenWeatherMap geeft “FOUT”
Dit betekent dat de API‑aanvraag mislukt is.
Mogelijke oorzaken:
- Verkeerde API‑key
- Latitude of longitude verkeerd ingevuld
- Gratis account nog niet geactiveerd
- OpenWeatherMap heeft vertraging (kan 5–10 minuten duren)
- Je hebt te veel requests gedaan in korte tijd
ESP32‑board verschijnt niet in Arduino IDE
Controleer:
- ESP32‑boardpakket is geïnstalleerd via Board Manager
- Je hebt het juiste board gekozen: ESP32S3 Dev Module
- Je hebt de juiste COM‑poort geselecteerd
- Mogelijk is een USB‑driver nodig (afhankelijk van je board):
- CH340 driver
- CP2102 driver
ESP32 wordt niet herkend door de computer
Veel USB‑C kabels zijn alleen voor opladen.
Oplossingen:
- Gebruik een data‑kabel (USB‑C met data‑lijnen)
- Test met een andere kabel
- Test een andere USB‑poort
- Gebruik eventueel een USB‑hub
Geen seriële output zichtbaar
Controleer:
- Tools → USB CDC On Boot → Enabled
- Baudrate staat op 115200
- Je hebt de juiste COM‑poort geselecteerd
- Je kabel ondersteunt data
ESP32 stuurt geen data naar Apps Script
Controleer:
- De Apps Script URL staat correct in de Arduino code
- De URL begint met:
https://script.google.com/macros/s/.../exec - Je WiFi is verbonden
- De ESP32 geeft geen foutmelding in Serial Monitor
delayTimeis niet te lang ingesteld
OpenWeatherMap werkt traag of geeft oude data
Dit is normaal bij gratis accounts:
- OpenWeatherMap kan 5–10 minuten vertraging hebben
- Soms duurt het even voor een nieuwe API‑key actief is
- Wacht een paar minuten en probeer opnieuw
Testen of Apps Script werkt
Voor je de ESP32 gebruikt, is het belangrijk om te controleren of je Apps Script‑URL correct werkt.
- Kopieer de URL die je kreeg bij het publiceren van de web‑app
- Plak hem in je browser
- Voeg testparameters toe, bijvoorbeeld:
https://script.google.com/macros/s/JE_EIGEN_URL/exec?station=TEST&temp=20&hum=50
- Druk op Enter
- Ga naar je Google Spreadsheet
Als alles werkt, verschijnt er een nieuwe rij met:
- Tijd
- Station = TEST
- Temp ESP = 20
- Hum ESP = 50
- Temp plaats = waarde van OpenWeatherMap
- Hum plaats = waarde van OpenWeatherMap
Werkt dit? Dan is je Apps Script correct ingesteld.
Arduino blijft hangen op waiting for download
-
Ga in Arduino IDE → Tools en zet:
- Board: ESP32S3 Dev Module
- USB CDC On Boot: Enabled
- Upload Mode: UART0
- Flash Mode: QIO
- Partition Scheme: Default
-
Druk op de reset knop op je ESP32
-
Bij sommige borden moet je ook even de boot knop inhouden op de ESP32