Op deze pagina staat uitgelegd hoe je een weerstation bouwt met een Arduino kloon ESP8266 of een ESP32, dit is geen exacte handleiding maar meer een uitleg van hoe je het ongeveer zou kunnen doen. De mechanische bouw wordt niet beschreven. Er wordt gebruik gemaakt van de Blynk IOT Cloud om mooie weergaven van het weer te maken. Met de gratis versie van Blynk mag je 30000 meetwaardes per maand oversturen. De code is zo gemaakt dat dit nooit wordt gehaald. In Blynk kun je een template voor op de pc aanmaken zoals hieronder is weergegeven. Ook op je mobiel kun je zo’n template maken. Je weerdata kun je wereldwijd bekijken. Er wordt hier van uitgegaan dat een beetje ervaring met Blynk is opgedaan en je kunt werken met de Arduino IDE.

Grafiekoverzicht zoals het er op de pc uit kan zien, dit stel je zelf samen in de Blynk editor.
![]() | ![]() |
Grafiekoverzicht zoals het er op de telefoon uit kan zien, dit stel je zelf samen in de Blynk app. De foto is een optie, deze is gemaakt met behulp van AI.

Als eerste neem je een gratis abonnement op de Blynk IOT Cloud. Je voegt hier een nieuw device toe. Als je de stappen juist hebt doorlopen krijg je rechts de codes te staan die je in de sketch moet zetten.

Vervolgens haal je het Auth Token op. Je kiest eerst Edit en vervolgens ga je met de muis naast het Auth Token staan. Er verschijnt een vierkant blokje. Klik hier op en je Auth Token is gecopiëerd. Ook dit ga je zo in de sketch zetten.

Dan ga je in het menu naar de Developers Zone en maakt de bovenstaande Datastreams aan. Zet voor alle variabelen Enable history data aan zodat er geen onderbrekingen in je grafiek komen bij wegvallen van de WiFi of een stroomonderbreking.
Afhankelijk van welk board je gebruikt zet je de code in de Arduino IDE editor. Deze code staat als laatste op deze pagina. Vervolgens ga je #define Blynk_TEMPLATE_ID, #define Blynk_TEMPLATE_NAME, en #define Blynk_TEMPLATE_TOKEN invullen met de waardes die je kreeg na het aanmaken van een nieuw device zoals in een van bovenstaande schermen is weergegeven. Achter char ssid[ ] = “Ziggoxxxxxx-2,4ghz” vul je jouw WiFi gegevens in. Achter char pass[ ] = “xxxxxx” vul je het WiFi password in van jouw WiFi netwerk. Sluit je ESP8266 of ESP32 aan op je pc en flash de code naar het board. Mocht je een foutmelding krijgen dat het board niet is aangesloten of dat het board niet gevonden wordt sluit dan de Arduino cloud af. Disconnect het board en uninstall eerst de oude driver en installeer vervolgens de driver opnieuw. Zie onderstaand scherm voor hoe die driver er uit ziet voor Windows. Je vindt hem hier: CH340 Driver.


Zorg er voor dat in de Arduino IDE het juiste board en Compoort is gekozen boven in het scherm. Bovenstaand is de ESP32C6 gekozen als voorbeeld op Compoort 6. Als de driver goed is geïnstalleerd staat er ook een Compoort bij die kan worden gekozen.
Sluit het board nog niet aan. Laad eerst de sketch in de Arduino IDE en sluit dan pas het board aan. Het zou nu weer moeten werken.
Nu moet de code naar het board worden geflasht.

Ga nu in Blynk naar de Developer Zone en kies New Template en vul de gegevens zoals Naam in. Vervolgens ga je naar menu DEVELOPER ZONE, HOME, WEERSTATION (=Jouw gekozen naam), en klik vervolgens op Edit, links staan dan alle zaken die je nu toe kunt voegen. In bovenstaand voorbeeld zijn Gauge en Chart gekozen. Bij elk van deze Gauge en Chart kies je welke Variabele, bijvoorbeeld temperatuur, je zichtbaar wil maken door op het tandwieltje te klikken. Verder kun je nog een heleboel invullen, zoals de min/max waardes en de kleuren. Verder schuif je alles netjes op de plaats waar je ze wilt hebben.
Vervolgens log je in op de Blynk app op je telefoon en maak daar ook de grafieken aan naar wens.
Nu moet het board nog worden ingebouwd in een fysiek weerstation. Zelf heb ik een defect weerstation volledig gesloopt en hier de diverse onderdelen ingebouwd. Voor de temperatuur is en DHT22 sensor gebruikt. Voor de luchtdruk een BMP280. De regenmeter is bij diverse zaken te koop. Wat wel belangrijk is is dat de meetwaardes goed in de sketch worden gezet. In de regenmeter zit een wipje en er wordt bij aangegeven na hoeveel regen het wipje omklapt. De waarde van een wipje (Resolutie) moet zoals hier onder is weergegeven in de sketch worden ingevuld.
regen = regen + 0.295; //1 keer kantelen is alleen een keer heen
regen = regen + 0.295; //2e keer kantelen is een keer terug
Voor de regenmeter zijn verschillende mogelijkheden. Je kunt hem zelf bouwen, je kunt een kale regenmeter met wipje maar zonder electronica kopen, maar je kunt hem uiteraard ook weglaten.

Zo ziet het schema er uit voor de ESP8266.

De schakeling is in dit 20 jaar oude defecte weerstation gebouwd. De windmeter wordt niet gebruikt.
Afhankelijk van of een ESP8266 of een ESP32 board is gebruikt wordt onderstaande code naar het board geflasht.
/**********************************************
Blynk code voor weerstation met ESP32
***********************************************/
/* Fill-in information from Blynk Device Info here */
#define BLYNK_TEMPLATE_ID "xxxxxxx"
#define BLYNK_TEMPLATE_NAME "Weerstation ESP32"
#define BLYNK_AUTH_TOKEN "xxxxxxxx"
/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h> //Is I2C
#include <Adafruit_BMP085.h>
#include <SimpleDHT.h>
#include "time.h" // Voor tijdsfuncties
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Ziggoxxxxxxx-2,4ghz";
char pass[] = "xxxxxxxxx";
// Declaring a global variabl for sensor data
float sensorVal; //Temperatuur
float sensorVal1; //Vochtigheid
float sensorVal2; //Luchtdruk
float sensorVal3; //Regen
float luchtdruk;
float regen;
float temperature;
float vochtigheid;
int Push_button_state = 0;
int ledState = HIGH; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
// NTP-server instellingen
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600; // Tijdzone: NL = GMT+1 = 3600 seconden
const int daylightOffset_sec = 3600; // Zomertijd = extra +1 uur
// DHT22 Sensor
//GPIO12 = Pin D6
int pinDHT22 = 12;
SimpleDHT22 dht22(pinDHT22);
Adafruit_BMP085 bmp;
//GPIO13 = Pin D7
const int Push_button_pin = 13;
//GPIO14 = Pin D5
const int led = 14;
// variable for storing the pushbutton status
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0; // the last time the output pin regenmeter was toggled
unsigned long debounceDelay = 20; // the debounce time; increase if the output flickers (default=50)
unsigned long previousMillis = 0; //Laatste keer dat de DHT22 is uitgelezen
const long period = 2500; // Tijd tussen de readings van de DHT22.
// This function creates the timer object. It's part of Blynk library
BlynkTimer timer;
void myTimer()
{
// This function describes what will happen with each timer tick
// e.g. writing sensor value to datastream V5
Blynk.virtualWrite(V3, sensorVal); //Temperatuur
Blynk.virtualWrite(V4, sensorVal1); //Vochtigheid
Blynk.virtualWrite(V0, sensorVal2); //Luchtdruk
Blynk.virtualWrite(V1, sensorVal3); //Regen
}
void setup()
{
Serial.begin(115200);
//Connecting to Blynk Cloud
//Blynk.begin(auth, ssid, pass);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Setting interval to send data to Blynk Cloud to 1000000ms.
// It means that data will be sent every second
timer.setInterval(1000000L, myTimer);
// Tijd synchroniseren met NTP-server
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("Tijd gesynchroniseerd met NTP-server.");
regen = 0;
// initialize the pushbutton pin as an input
pinMode(Push_button_pin, INPUT);
pinMode(led, OUTPUT);
// set initial LED state
digitalWrite(led, ledState);
if (!bmp.begin())
{
Serial.println("Kan de BMP085 niet vinden. Controleer de bekabeling!");
while (1); // Stop het programma
}
}
void loop()
{
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Fout bij ophalen tijd.");
return;
}
Serial.print("Tijd: ");
Serial.printf("%02d:%02d:%02d\n", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
// Controleer of het exact 23:59:00 is
if (timeinfo.tm_hour == 23 && timeinfo.tm_min == 59 && timeinfo.tm_sec == 0) {
Serial.println("Het is 23:59:00! Actie uitvoeren...");
// Voeg hier een actie toe, zoals een LED aanzetten
regen = 0;
}
//Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
unsigned long currentMillis = millis(); // store the current time
if (currentMillis - previousMillis >= period)
{ // check if waiting time is passed
previousMillis = currentMillis; // save the last time you blinked the LED
int err = SimpleDHTErrSuccess;
////err=dht22.read2(&temperature, &vochtigheid, NULL); // Zonder sensor hangt het programma
////luchtdruk = ((bmp.readPressure()/100)); // Zonder sensor hangt het programma
}
sensorVal = temperature;
sensorVal1 = vochtigheid;
sensorVal2 = luchtdruk;
sensorVal3 = regen;
Push_button_state = digitalRead(Push_button_pin);
if (Push_button_state != lastButtonState)
{
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay)
{
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:
// if the button state has changed:
if (Push_button_state != buttonState)
{
buttonState = Push_button_state;
// only toggle the LED if the new button state is HIGH
if (buttonState == HIGH)
{
ledState = !ledState;
digitalWrite(led, HIGH);
regen = regen + 0.295; //1 keer kantelen is alleen een keer heen
}
if (buttonState == LOW)
{
ledState = !ledState;
digitalWrite(led, LOW);
regen = regen + 0.295; //2e keer kantelen is een keer terug
}
}
}
// set the LED:
digitalWrite(led, ledState);
// save the reading. Next time through the loop, it'll be the lastButtonState:
lastButtonState = Push_button_state;
// Runs all Blynk stuff
Blynk.run();
// runs BlynkTimer
timer.run();
}
===================================================
/**********************************************
Blynk code voor weerstation met ESP8266
***********************************************/
/* Fill-in information from Blynk Device Info here */
#define BLYNK_TEMPLATE_ID "xxxxxxxxx"
#define BLYNK_TEMPLATE_NAME "Weerstation"
#define BLYNK_AUTH_TOKEN "xxxxxxxxxxxx"
/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp8266.h>
#include <Wire.h> //Is I2C
#include <Adafruit_BMP085.h>
#include <SimpleDHT.h>
#include <ESP8266WiFi.h>
#include "time.h" // Voor tijdsfuncties
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Ziggoxxxxxx-2,4ghz";
char pass[] = "xxxxxxxxxxx";
// Declaring a global variabl for sensor data
float sensorVal; //Temperatuur
float sensorVal1; //Vochtigheid
float sensorVal2; //Luchtdruk
float sensorVal3; //Regen
float luchtdruk;
float regen;
float temperature;
float vochtigheid;
int Push_button_state = 0;
int ledState = HIGH; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
// NTP-server instellingen
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600; // Tijdzone: NL = GMT+1 = 3600 seconden
const int daylightOffset_sec = 3600; // Zomertijd = extra +1 uur
// DHT22 Sensor
//GPIO12 = Pin D6
int pinDHT22 = 12;
SimpleDHT22 dht22(pinDHT22);
Adafruit_BMP085 bmp;
//GPIO13 = Pin D7
const int Push_button_pin = 13;
//GPIO14 = Pin D5
const int led = 14;
// variable for storing the pushbutton status
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0; // the last time the output pin regenmeter was toggled
unsigned long debounceDelay = 20; // the debounce time; increase if the output flickers (default=50)
unsigned long previousMillis = 0; //Laatste keer dat de DHT22 is uitgelezen
const long period = 2500; // Tijd tussen de readings van de DHT22.
// This function creates the timer object. It's part of Blynk library
BlynkTimer timer;
void myTimer()
{
// This function describes what will happen with each timer tick
// e.g. writing sensor value to datastream V5
Blynk.virtualWrite(V3, sensorVal); //Temperatuur
Blynk.virtualWrite(V4, sensorVal1); //Vochtigheid
Blynk.virtualWrite(V0, sensorVal2); //Luchtdruk
Blynk.virtualWrite(V1, sensorVal3); //Regen
}
void setup()
{
Serial.begin(115200);
//Connecting to Blynk Cloud
//Blynk.begin(auth, ssid, pass);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Setting interval to send data to Blynk Cloud to 1000ms.
// It means that data will be sent every second
timer.setInterval(700000L, myTimer);
// Tijd synchroniseren met NTP-server
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("Tijd gesynchroniseerd met NTP-server.");
regen = 0;
// initialize the pushbutton pin as an input
pinMode(Push_button_pin, INPUT);
pinMode(led, OUTPUT);
// set initial LED state
digitalWrite(led, ledState);
if (!bmp.begin()) {
Serial.println("Kan de BMP085 niet vinden. Controleer de bekabeling!");
while (1); // Stop het programma
}
}
void loop()
{
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Fout bij ophalen tijd.");
return;
}
Serial.print("Tijd: ");
Serial.printf("%02d:%02d:%02d\n", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
// Controleer of het exact 23:59:00 is
if (timeinfo.tm_hour == 23 && timeinfo.tm_min == 59 && timeinfo.tm_sec == 0) {
Serial.println("Het is 23:59:00! Actie uitvoeren...");
// Voeg hier een actie toe, zoals een LED aanzetten
regen = 0;
}
//Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
unsigned long currentMillis = millis(); // store the current time
if (currentMillis - previousMillis >= period)
{ // check if waiting time is passed
previousMillis = currentMillis; // save the last time you blinked the LED
int err = SimpleDHTErrSuccess;
err=dht22.read2(&temperature, &vochtigheid, NULL); // Zonder sensor hangt het programma
luchtdruk = ((bmp.readPressure()/100)); // Zonder sensor hangt het programma
}
sensorVal = temperature;
sensorVal1 = vochtigheid;
sensorVal2 = luchtdruk;
sensorVal3 = regen;
Push_button_state = digitalRead(Push_button_pin);
if (Push_button_state != lastButtonState)
{
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay)
{
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:
// if the button state has changed:
if (Push_button_state != buttonState)
{
buttonState = Push_button_state;
// only toggle the LED if the new button state is HIGH
if (buttonState == HIGH)
{
ledState = !ledState;
digitalWrite(led, HIGH);
regen = regen + 0.295; //1 keer kantelen is alleen een keer heen
}
if (buttonState == LOW)
{
ledState = !ledState;
digitalWrite(led, LOW);
regen = regen + 0.295; //2e keer kantelen is een keer terug
}
}
}
// set the LED:
digitalWrite(led, ledState);
// save the reading. Next time through the loop, it'll be the lastButtonState:
lastButtonState = Push_button_state;
// Runs all Blynk stuff
Blynk.run();
// runs BlynkTimer
timer.run();
}
Afhankelijk van of een ESP8266 of een ESP32 board is gebruikt wordt bovenstaande code naar het board geflasht.