Arduino Weerklok – Realtime Datum, Tijd, Temperatuur & Vochtigheid Weergave
Onderdelen en Benodigdheden
| Arduino UNO | 1 |
| DHT11 Temperatuur- & Vochtigheidssensor (4 pinnen) | 1 |
| Maxim Integrated DS3231 RTC Module | 1 |
| Weerstand 10k ohm | 1 |
| Adafruit 128x64 OLED Grafisch Display | 1 |
| Breadboard (standaard) | 1 |
| Draadbruggen (standaard) | 15 |
Over dit Project
Heb je ooit gewild een eigen interface maken die de tijd, datum, temperatuur en vochtigheid weergeeft? Het is eenvoudiger dan je denkt. Hieronder leggen we de benodigde componenten uit.
Arduino Uno / Nano
Allereerst heb je een microcontroller nodig. Voor dit project is een Arduino Uno gebruikt, maar een Arduino Nano heeft ook voldoende pinnen.
DHT11 Sensor
De DHT11 is een betaalbare digitale temperatuur- en vochtigheidssensor. Hij meet de omgevingslucht met een capacitieve vochtigheidssensor en een thermistor. Belangrijk: neem measurements maximaal elke 2 seconden.
Let op: Na het éénmalig instellen van de tijd, moet je die regel in de code uitcommentariëren en opnieuw compileren. Anders wordt de RTC telkens bij herstart op de compileertijd gezet.
DS3231 RTC Module
De DS3231 is een RTC-module, vergelijkbaar met de DS1307, maar veel nauwkeuriger dankzij een geïntegreerde temperatuurgecompenseerde kristaloscillator (TCXO). De module heeft een batterijbackup, zodat de tijd klopt ook bij stroomuitval.
128x64 OLED Grafisch Display
Het OLED-scherm toont de data. Het is compact, helder en kan via SPI of I2C worden aangestuurd (instelbaar op de printplaat). Gebruik bij voorkeur een Adafruit-scherm of een compatibel model dat werkt met de Adafruit-bibliotheken.
Code
Hieronder staat de complete Arduino-sketch. Zorg dat je de benodigde bibliotheken installeert: Adafruit_GFX, Adafruit_SSD1306, dht en Wire (standaard).
// Arduino Weerklok – Datum, Tijd, Temperatuur & Vochtigheid
///////////////////////// Voor OLED /////////////////////////
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Software SPI pinnen
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
#if (SSD1306_LCDHEIGHT != 64)
#error("Hoogte incorrect, pas Adafruit_SSD1306.h aan!");
#endif
//////////////////////////// Voor DHT ////////////////////////////
#include <dht.h>
dht DHT;
#define DHT11_PIN 3
int DHTtimer = 0;
//////////////////////////// Voor RTC (DS3231) ////////////////////////////
#define DS3231_I2C_ADDRESS 0x68
byte decToBcd(byte val) { return (val/10*16) + (val%10); }
byte bcdToDec(byte val) { return (val/16*10) + (val%16); }
void setup() {
Wire.begin();
Serial.begin(9600);
// Tijd éénmalig instellen – daarna uitcommentariëren!
// setDS3231time(0, 24, 12, 6, 3, 2, 17); // sec, min, uur, dag, datum, maand, jaar
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek,
byte dayOfMonth, byte month, byte year) {
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
void readDS3231time(byte *second, byte *minute, byte *hour,
byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
// Seriële monitor output
Serial.print(hour, DEC); Serial.print(":");
if (minute < 10) Serial.print("0");
Serial.print(minute, DEC); Serial.print(":");
if (second < 10) Serial.print("0");
Serial.print(second, DEC); Serial.print(" ");
Serial.print(dayOfMonth, DEC); Serial.print("/");
Serial.print(month, DEC); Serial.print("/");
Serial.print(year, DEC); Serial.print(" Dag: ");
// OLED: datum
display.setCursor(50, 0);
display.print(dayOfMonth, DEC); display.print(",");
display.setCursor(91, 0);
display.print("20"); display.print(year, DEC);
// OLED: tijd
if (hour < 10) { display.setCursor(40, 10); display.print("0"); }
display.setCursor(hour < 10 ? 42 : 40, 10);
display.print(hour, DEC); display.print(":");
if (minute < 10) { display.setCursor(58, 10); display.print("0"); }
display.setCursor(minute < 10 ? 60 : 58, 10);
display.print(minute, DEC); display.print(":");
if (second < 10) { display.setCursor(75, 10); display.print("0"); }
display.setCursor(second < 10 ? 77 : 75, 10);
display.print(second, DEC);
// Dag van de week
const char* dagen[] = {"", "Zon", "Maa", "Din", "Woe", "Don", "Vri", "Zat"};
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20, 0);
display.print(dagen[dayOfWeek]);
// Maand
const char* maanden[] = {"", "Jan", "Feb", "Mrt", "Apr", "Mei", "Jun",
"Jul", "Aug", "Sep", "Okt", "Nov", "Dec"};
display.setCursor(70, 0);
display.print(maanden[month]);
// Analog clock wijsers (optioneel visueel effect)
float x1, y1, a, b; const float pi = 3.14;
a = ((hour - 15) * 30); b = (a * pi) / 180;
x1 = 40 + (9 * cos(b)); y1 = 41 + (9 * sin(b));
display.drawLine(40, 41, x1, y1, WHITE); // uurwijzer
a = ((minute - 15) * 6); b = (a * pi) / 180;
x1 = 40 + (17 * cos(b)); y1 = 41 + (17 * sin(b));
display.drawLine(40, 41, x1, y1, WHITE); // minuutwijzer
a = ((second - 15) * 6); b = (a * pi) / 180;
x1 = 40 + (19 * cos(b)); y1 = 41 + (19 * sin(b));
display.drawLine(40, 41, x1, y1, WHITE); // secondewijzer
// Klokkencirkel en streepjes
display.drawCircle(40, 41, 22, WHITE);
display.drawCircle(40, 41, 1, WHITE);
// 12, 3, 6, 9 en tussenstappen...
}
void ReadTempAndHum() {
int chk = DHT.read11(DHT11_PIN);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(70, 45);
display.print("Temp: "); display.print(DHT.temperature, 0); display.print("C");
display.setCursor(70, 56);
display.print("Hum: "); display.print(DHT.humidity, 0); display.print("%");
Serial.print(" Vocht: "); Serial.print(DHT.humidity, 1); Serial.print("%");
Serial.print(" | Temp: "); Serial.print(DHT.temperature, 1); Serial.println("C");
}
void loop() {
displayTime();
DHTtimer++;
if (DHTtimer > 1) { // elke 2 seconden
display.fillRect(70, 45, 128, 64, BLACK);
ReadTempAndHum();
DHTtimer = 0;
}
delay(1000);
display.display();
// Wis tijdgedeelte voor volgende update
display.fillRect(0, 0, 64, 64, BLACK);
display.fillRect(0, 0, 128, 20, BLACK);
}
Schema's
De Fritzing-schema's zijn bijgevoegd. Let op: het OLED-scherm was niet in Fritzing beschikbaar; controleer de pin-definities in de code voor de juiste aansluiting.
Productieproces
- Raspberry Pi Temperatuur & Vochtigheid Netwerk Monitor – DIY Setup Gids
- Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
- Naadloze temperatuur- en vochtigheidsbewaking op Raspberry Pi met EzTemp
- Een Netwerk-ingeschakelde Laboratorium Weerstation Bouwen met Raspberry Pi
- Een Multi-sensor Temperatuur- & Lichtmonitoringssysteem Bouwen met Raspberry Pi & DS18B20
- Je vochtigheidssensor verifiëren en kalibreren voor nauwkeurige metingen
- Condensator Opladen & Ontladen: Een Praktisch RC‑Circuit Experiment
- Uitgebreide Gids voor Datum en Tijd in C++
- Huidige datum en tijd ophalen in Python: een praktische gids
- Datums & Tijden in Python Beheersen: Een Praktische Gids
- Java Datum en Tijd Onder de Knie: Constructors, Methods & Best Practices