Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave
Onderdelen en benodigdheden
| Arduino UNO | × | 1 |
| Real Time Clock (RTC) module (DS1307) | × | 1 |
| Weerstand 1 kΩ | × | 15 |
| Weerstand 120 Ω | × | 15 |
| Lineaire regulator 7805 (5V) | × | 1 |
| Condensator 22 pF | × | 1 |
| Kristal 16 MHz | × | 1 |
| Condensator 10 µF | × | 1 |
| Knopcelbatterij CR2032 | × | 1 |
| Batterijhouder CR2032 | × | 1 |
| 5 mm LED Groen | × | 190 |
| NPN Transistor (RF) | × | 10 |
| PNP Transistor (Algemeen) | × | 12 |
| Tactiele schakelaar (Top Actuated) | × | 4 |
| Voeding 12V 5A (60W) | × | 1 |
Benodigde tools en machines
- Solderbout
- Loodvrij soldeerdraad
- Multimeter
Over dit project
Eerst moet je de volgende bibliotheken downloaden:
Wire.h(standaard in Arduino IDE)RTClib.h(via Bibliotheekbeheer of GitHub)
Onderdelenlijst

RTC Clock Module

Arduino Schakeling

RTC Bedrading

RTC Schakelaars

Anode en Kathode identificeren

Schema (Common Anode)

Als je Common Cathode LED's gebruikt - maak deze wijzigingen

Voeding

Code
LED Klok Code
/* 4-digit 7-segment display met RTC DS1307
Gemodificeerd door BMIAK Basnayaka
https://www.setnfix.com */
int digit1 = 11;
int digit2 = 10;
int digit3 = 9;
int digit4 = 6;
int digit5 = 5;
int digit6 = 3;
// Segmentpinnen mapping
int segA = 0; // Display pin 11
int segB = 1; // Display pin 7
int segC = 2; // Display pin 4
int segD = 4; // Display pin 2
int segE = 7; // Display pin 1
int segF = 8; // Display pin 10
int segG = 12; // Display pin 5
int segDP = 13; // Display pin 3
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
byte SW0 = A0; // Uur instellen
byte SW1 = A2; // Minuut instellen
byte SW2 = A1; // Modus
byte SWT = A3; // 12/24u wissel
int Adhr = 0;
int Admnt = 0;
int D = 0;
int Z = 0;
void setup() {
Wire.begin();
RTC.begin();
// RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // Uncomment om klok in te stellen
// SQW 1Hz inschakelen op DS1307
Wire.beginTransmission(0x68);
Wire.write(0x07);
Wire.write(0x10); // 1Hz vierkante golf
Wire.endTransmission();
// Pinnen instellen
pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT); pinMode(segDP, OUTPUT);
pinMode(digit1, OUTPUT); pinMode(digit2, OUTPUT); pinMode(digit3, OUTPUT);
pinMode(digit4, OUTPUT); pinMode(digit5, OUTPUT); pinMode(digit6, OUTPUT);
pinMode(SW0, INPUT_PULLUP);
pinMode(SW1, INPUT_PULLUP);
pinMode(SW2, INPUT_PULLUP);
pinMode(SWT, INPUT_PULLUP);
digitalWrite(segDP, LOW);
}
void loop() {
DateTime now = RTC.now();
long HR = now.hour() * 1000;
long timp = (HR * 10) + now.minute() * 100 + now.second();
Adhr = now.hour();
Admnt = now.minute();
// 12/24 uur wisseling via SWT
if (digitalRead(SWT) == LOW) {
delay(300);
D = 1 - D;
}
if (D == 0) { // 24-uurs modus
if (timp >= 130000) {
timp -= 120000;
digitalWrite(segDP, HIGH); // PM indicator
}
} else {
digitalWrite(segDP, LOW);
}
// Multiplexing display (6 digits)
for (int i = 100; i > 0; i--) {
if (timp >= 100000) displayNumber01(timp);
else displayNumber02(timp);
}
for (int i = 100; i > 0; i--) {
if (timp >= 100000) displayNumber03(timp);
else displayNumber04(timp);
}
for (int i = 100; i > 0; i--) {
if (timp >= 100000) displayNumber05(timp);
else displayNumber06(timp);
}
// Tijd instellen met SW0
if (digitalRead(SW0) == LOW) {
delay(100);
Z = 1;
set_time();
}
}
void set_time() {
byte minutes = Admnt;
byte hours = Adhr;
while (Z == 1) {
// Uren instellen met SW2
while (digitalRead(SW2) == LOW) {
hours++;
if ((hours & 0x0F) > 9) hours += 6;
if (hours > 0x24) hours = 1;
// Display update...
delay(200);
}
// Minuten instellen met SW1
while (digitalRead(SW1) == LOW) {
minutes++;
if ((minutes & 0x0F) > 9) minutes += 6;
if (minutes > 0x59) minutes = 0;
// Display update...
delay(200);
}
// Schrijf naar RTC
Wire.beginTransmission(0x68);
Wire.write(0);
Wire.write(0x00); // Seconden
Wire.write(minutes); // Minuten
Wire.write(0x80 | hours); // Uren (24h formaat)
Wire.write(0x06); // Dag
Wire.write(0x01); // Datum
Wire.write(0x05); // Maand
Wire.write(0x09); // Jaar
Wire.write(0x10); // Control register (1Hz SQW)
Wire.endTransmission();
if (digitalRead(SW0) == LOW) Z = 0;
delay(300);
}
}
// Display multiplexing functies (displayNumber01 t/m 06) en lightNumber()
/* ... (volledige multiplexing code in origineel) ... */
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON HIGH
#define SEGMENT_OFF LOW
// Voor Common Cathode: ON=LOW, OFF=HIGH
switch (numberToDisplay) {
case 0: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_OFF); break;
case 1: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF); break;
case 2: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON); break;
case 3: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_ON); break;
case 4: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON); break;
case 5: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON); break;
case 6: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON); break;
case 7: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF); break;
case 8: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON); break;
case 9: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON);
digitalWrite(segG, SEGMENT_ON); break;
case 10: // Alle segmenten uit
digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_OFF);
digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_OFF);
digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
digitalWrite(segG, SEGMENT_OFF); break;
}
}
Schema's
Dit is de bedrading van de SSD met LED's.

Productieproces
- Arduino POV-klok: Bouw een Persistence-of-Vision LED-display
- DIY Arduino Woordklok – Bouw een Elegant Real-Time Display
- Bouw een 20 kHz Arduino Oscilloscoop op een Nokia 5110 LCD – Eenvoudige DIY Handleiding
- Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
- Slimme Jaloezieën: Geautomatiseerd Lichtbeheer met Arduino & Zonne-energie
- Bouw een Italiaanse Woordklok met Arduino Nano, NeoPixel, LCD en RTC
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
- Bouw een Precieze 7-Segment Klok met Arduino Pro Mini & DS1302 RTC
- Bouw een Betrouwbare Sigfox kWh Meter met Arduino MKR Fox 1200
- Geïsoleerde analoge ingangsschakeling voor Arduino bouwen