Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
Onderdelen en Benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino UNO | 1 |
| Freetronics DMD Display | 1 |
| RTC Module (Real Time Clock) | 1 |
| Momentane Drukknop | 1 |
| Aan/Uit Schakelaar | 1 |
Apps en Online Services
- Arduino IDE
Over dit Project
Beschrijving
Dit project is voor iedereen die een grote, heldere klok wil die vanaf 12 meter afstand goed leesbaar is. Je kunt het display zo groot maken als je wilt. De klok bevat ook een ingebouwde alarmfunctie die als gebeurtenis-handler kan dienen, bijvoorbeeld voor een geautomatiseerd besproeiingssysteem voor de tuin, als herinnering aan een wekelijkse bijeenkomst, of voor elk ander apparaat dat je aan een relais kunt koppelen.
Benodigde Materialen
- Freetronics DMD Display
- Real Time Clock Module voor Arduino
- Buzzer (optioneel – voldoende luid om je 's ochtends wakker te maken)
- Momentane drukknop
- 2x Aan/Uit knoppen (stroomschakelaar is optioneel)
- Arduino UNO of compatibel bord
- Proto-shield voor Arduino (optioneel)
- Voeding voor Arduino
- Een 5VDC geregelde voeding van 4–30 Ampère (optioneel voor hoge helderheid – niet nodig voor normale werking)
Constructie
Deel 1 – Electronica
- Sluit de buzzer, dempknop en alarm-instelschakelaar aan op het breadboard.
- Verbinden één pin van elke schakelaar met de grond (GND) en de GND-pin van de buzzer met de GND-pin op de Arduino (zie schema).
- Sluit de andere pin van de alarm-instelschakelaar aan op D2, de demppin op D3 en de buzzer op D4.
- Sluit de RTC-module aan op de Arduino volgens het type (raadpleeg de documentatie van de fabrikant – volg in meeste gevallen het schema).
- Sluit de DMDCON aan op de Arduino en plug het DMD-display in.
- Voor volledige helderheid van het DMD: sluit een 5V-bron aan op de High Brightness-klemmen.
- Als je dit op een proto-shield wilt bouwen, soldeer dan alle onderdelen op de shield en verbind ze correct.
Deel 2 – Software
Eerst moet je de DMD-bibliotheek installeren (beschikbaar via de link) in je bibliothekenmap.
De software kan gedownload worden van Prototyping Corner of onderaan deze pagina. Deze bevat de basisfunctionaliteiten voor de Hoofdklok.
Tijd instellen op de RTC-module: Zoek regels 117 tot 124 en pas deze aan naar de huidige tijd. Haal nu de commentaar tekens weg bij regel 124 en upload naar de Arduino. Zet daarna de commentaar tekens weer voor regel 124 en upload opnieuw. Als dit niet gedaan wordt, blijft de RTC op de ingestelde tijd staan.
Alarm instellen: Op regels 593 en 594 stel je de tijd en dagen in waarop het alarm moet gaan. Regel 593 is de dag van de week. De dagen corresponderen met de nummers als volgt:
- 1 = Zondag
- 2 = Maandag
- 3 = Dinsdag
- 4 = Woensdag
- 5 = Donderdag
- 6 = Vrijdag
- 7 = Zaterdag
Op regel 594 stel je de alarmtijd in volgens het 24-uurs formaat.
Uitbreidingen
Meer displays toevoegen
Je kunt meer DMD-displays toevoegen om de klok groter te maken. Raadpleeg de documentatie voor meer informatie.
Meer alarmen toevoegen
Om extra alarmen toe te voegen, voeg de volgende coderegel toe aan de sketch en roep de functie aan in de main loop:
void CheckAlarm-ALARM-NR-() {
AlarmSet = digitalRead(AlarmSetPin);
Snooze = digitalRead(SnoozePin);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
/* Alleen alarm activeren op de onderstaande dagen. Dit kan gewijzigd worden door de nummers aan te passen:
1 = Zondag, 2 = Maandag, 3 = Dinsdag, 4 = Woensdag, 5 = Donderdag, 6 = Vrijdag, 7 = Zaterdag */
if(dayOfWeek == 2 || dayOfWeek == 3 || dayOfWeek == 4 || dayOfWeek == 5 || dayOfWeek == 6) {
if(hour == 18 && minute == 05) { // Tijd instellen (24-uurs formaat)
if(AlarmSet == LOW) { // Als alarm-pin actief is
Snooze = digitalRead(SnoozePin);
while(Snooze == HIGH) {
Snooze = digitalRead(SnoozePin);
// Voeg hier actie toe
}
}
}
}
}
Code
Code voor Hoofdklok (C/C++)
/* Master Clock sketch. Aangemaakt 26/03/14. Dit is een Arduino-programma dat de Freetronics DMD gebruikt als display-uitvoer. Het bevat een alarmfunctie. De dag, datum en tijd worden op de DMD weergegeven. De alarmknoppen zitten op pinnen 2 (alarm instellen), 3 (snooze) en 4 (alarmuitgang). De alarmtijd en dagen van de week kunnen ingesteld worden op regels 551 en 552. Jed Hodson 2014 */
byte dayOfWeek=4; byte dayOfMonth=1;
#include <SPI.h> // SPI.h moet opgenomen worden omdat DMD via SPI geschreven is
#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
int AlarmSetPin = 2;
int SnoozePin = 3;
int Alarm = 4;
int AlarmSet = 0;
int Snooze = 0;
// Decimaal naar BCD conversie
byte decToBcd(byte val) { return ((val/10*16) + (val%10)); }
// BCD naar decimaal conversie
byte bcdToDec(byte val) { return ((val/16*10) + (val%16)); }
// Datum en tijd instellen op DS1307
void setDateDs1307(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {
Wire.beginTransmission(DS1307_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.write(00010000); // 0x10 naar control register – square wave aan
Wire.endTransmission();
}
// Datum en tijd ophalen van DS1307
void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_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());
}
// DMD initialiseren
DMD dmd(1,1);
void ScanDMD() { dmd.scanDisplayBySPI(); }
void setup() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Timer1.initialize(5000); // 5ms voor display ververing
Timer1.attachInterrupt(ScanDMD);
dmd.clearScreen(true);
dmd.selectFont(System5x7);
Wire.begin();
// Tijd instellen (alleen eenmaal uitvoeren)
second = 0; minute = 35; hour = 11; // 24-uurs formaat
dayOfWeek = 1; dayOfMonth = 23; month = 3; year = 14;
// setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // Uncomment om tijd in te stellen
pinMode(AlarmSetPin, INPUT_PULLUP);
pinMode(SnoozePin, INPUT_PULLUP);
pinMode(Alarm, OUTPUT);
digitalWrite(Alarm, LOW);
}
// Dag van de week weergeven
void drawDay() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
switch(dayOfWeek) {
case 1: dmd.drawString(1,0,"Sun,",3,GRAPHICS_NORMAL); break;
case 2: dmd.drawString(1,0,"Mon,",3,GRAPHICS_NORMAL); break;
case 3: dmd.drawString(1,0,"Tue,",3,GRAPHICS_NORMAL); break;
case 4: dmd.drawString(1,0,"Wed,",3,GRAPHICS_NORMAL); break;
case 5: dmd.drawString(1,0,"Thu,",3,GRAPHICS_NORMAL); break;
case 6: dmd.drawString(1,0,"Fri,",3,GRAPHICS_NORMAL); break;
case 7: dmd.drawString(1,0,"Sat,",3,GRAPHICS_NORMAL); break;
}
}
// Numerieke datum weergeven
void drawDate() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
// Dag van de maand (1-31) weergeven
if(dayOfMonth >= 1 && dayOfMonth <= 31) {
char buf[3];
sprintf(buf, "%02d", dayOfMonth);
dmd.drawString(20,0,buf,2,GRAPHICS_NORMAL);
}
}
// Uur weergeven (12-uurs formaat)
void drawHour() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
if(hour > 12) hour -= 12; // Verwijder voor 24-uurs formaat
char buf[3];
sprintf(buf, "%02d", hour);
dmd.drawString(1,8,buf,2,GRAPHICS_NORMAL);
}
// Minuut weergeven
void drawMinute() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
char buf[3];
sprintf(buf, "%02d", minute);
dmd.drawString(20,8,buf,2,GRAPHICS_NORMAL);
}
// Dubbele punt tussen uur en minuut
void drawCol() { dmd.drawString(14,8,":",1,GRAPHICS_NORMAL); }
void runClock() {
drawDay(); drawDate(); drawHour(); drawCol(); drawMinute();
CheckAlarm();
}
// Alarm sequentie
void AlarmSequence() {
drawDay(); drawDate(); drawHour(); drawCol(); drawMinute();
digitalWrite(Alarm, HIGH); delay(1000);
dmd.clearScreen(true); digitalWrite(Alarm, LOW); delay(1000);
}
// Alarm controleren
void CheckAlarm() {
AlarmSet = digitalRead(AlarmSetPin);
Snooze = digitalRead(SnoozePin);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
// Alleen op werkdagen (Ma-Vr)
if(dayOfWeek >= 2 && dayOfWeek <= 6) {
if(hour == 18 && minute == 05) { // Alarmtijd instellen
if(AlarmSet == LOW) {
Snooze = digitalRead(SnoozePin);
while(Snooze == HIGH) {
Snooze = digitalRead(SnoozePin);
AlarmSequence();
}
}
}
}
}
void loop() { runClock(); }
Schema's

Productieproces
- Koekeklok: geschiedenis, vakmanschap en moderne evolutie
- Arduino POV-klok: Bouw een Persistence-of-Vision LED-display
- Bouw een retro Numitron-klok met Arduino: Eenvoudig, betrouwbaar en energiezuinig
- DIY Arduino Woordklok – Bouw een Elegant Real-Time Display
- Bouw een Arduino Real-Time Clock voor Islamitische Gebedstijden
- Bluetooth-gecontroleerde Arduino Spybot bouwen
- FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
- DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
- Arduino Temperatuurbewaking & Realtime Klok met 3.2" TFT-display
- Bouw een Berlijnse Klok met Arduino UNO – DIY LED-matrix klok
- Bouw een betrouwbare wekker met DS1302 RTC en Arduino UNO