Skip to main content

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​

  1. DATA (signaal)
  2. VCC (voeding)
  3. GND (massa)

Aansluitschema​

DHT11ESP32
DATAGPIO 4
VCC3.3V
GNDGND

ESP32 met DHT11 aansluiting


Stap 2: Arduino IDE instellen voor ESP32​

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

additional-boards-manager

  1. Klik op OK

Stap 3: Benodigde libraries installeren​

Deze libraries zijn nodig om de DHT11 te laten werken.

  1. Ga naar Sketch → Include Library → Manage Libraries
  2. Zoek esp32 by Espressif Systems en istalleer die

esp32 library

  1. Installeer vervolgens DHT sensor library by Adafruit

dht sensor library

  1. Installeer ook Adafruit Unified Sensor by Adafruit

Adafruit Unified Sensor


Stap 4: Board en poort selecteren/aansluiten​

  1. Sluit de ESP32 aan op je pc
  2. Ga naar Tools → Board → ESP32 Arduino
  3. Kies ESP32S3 Dev Module

ESPS3 Dev Module

  1. Ga naar Tools → Port
  2. Kies de juiste COM-poort

COM Port

  1. Ga naar Tools → USB CDC On Boot → Enabled

USB CDC


Stap 5: Google Spreadsheet aanmaken​

  1. Ga naar https://drive.google.com
  2. Klik op Nieuw → Google Spreadsheets

Spreadsheet opening

  1. Geef het bestand een naam

Kolomnamen invullen (rij 1)​

A1B1C1D1E1F1
TijdStationTemperatuur (°C) ESPLuchtvochtigheid (%) ESPTemperatuur (°C) PLAATSNAAMLuchtvochtigheid (%) PLAATSNAAM

PLAATSNAAM kan vervangen worden door de naam van de eigen locatie.


Stap 6: AppsScript openen​

  1. Open de Google Spreadsheet
  2. Klik op Extensions → AppsScript

AppsScript

  1. Verwijder alle bestaande code

Stap 7: OpenWeatherMap instellen​

  1. Log in op https://openweathermap.org

login openweathermap

  1. Ga naar API keys
  2. Kopieer je persoonlijke API-key

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:

  1. Je OpenWeatherMap API-key
  2. De latitude van je locatie
  3. 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​

  1. Klik op Implementatie → Nieuwe implementatie → Web-app

Nieuwe implementatie

Implementatie

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

google hasnt verified

  1. Druk linksonder gewoon op doorgaan

  2. Stel dat je niks kreeg van meldingen verzet dit en probeer het dan opnieuw:

DoGet


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:

  1. SSID
  2. Wifi-wachtwoord
  3. Apps Script URL
  4. Stationnaam
  5. (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

Upload Arduino


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
  • delayTime is 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.

  1. Kopieer de URL die je kreeg bij het publiceren van de web‑app
  2. Plak hem in je browser
  3. Voeg testparameters toe, bijvoorbeeld:
https://script.google.com/macros/s/JE_EIGEN_URL/exec?station=TEST&temp=20&hum=50
  1. Druk op Enter
  2. 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