// Berlin Uhr v1.00.01 (Begonnen am 13.03.2025)
// Anleitung: https://www.instructables.com/Berlin-Clock-Arduino-Nano-DS1307-Real-Time-Clock-7/
#include <Wire.h> // I²C einbinden
#include <TimeLib.h> // Zeit- und Datumsfunktionen einbinden
#include <DS1307RTC.h> // RTC 1307 einbinden
#include <LiquidCrystal_I2C.h> // I2 LCD Display einbinden
//#define interruptPin 2
#define latchOne 2 // Steuerpind für die 3 74HC595 Schieberegister
#define latchTwo 3
#define latchThree 4
#define clockPinOnePin 5
#define clockPinTwoPin 6
#define clockPinThreePin 7
#define dataPinOnePin 8
#define dataPinTwoPin 9
#define dataPinThreePin 10
#define prgVersion "1.00" // Programmversion
#define prgDate "13.03.2025" // Programm Erstellungsdatum
#define lcdAddress 0x27 // I²C Adresse des LCD Displays
#define lcdCols 16 // 16 Zeichen pro LCD Zeile
#define lcdRows 2
int i = 0;
int k = 0;
int x = 0;
int minFivesMSB = 0;
int minFivesLSB = 0;
int temp = 0;
int minFives = 0;
int hours = 0;
int hoursFives = 0;
int minUnits = 0;
int oldHoursFives = hoursFives;
const int changeTime = 14;
const int setHourPos = 15;
const int setMinPos = 16;
const int setHourNeg = 17;
const int setMinNeg = 11;
tmElements_t tm;
byte signal1[] = { B00000, B00000, B00000, B00000, B00000, B00000, B10000, B10000 };
byte signal2[] = { B00000, B00000, B00000, B00100, B00100, B00100, B10100, B10100 };
byte signal3[] = { B00001, B00001, B00001, B00101, B00101, B00101, B10101, B10101 };
byte antenna[] = { B00100, B01110, B00100, B00100, B01110, B01110, B11111, B11111 } ;
//unsigned long updateDisplay;
LiquidCrystal_I2C LCD(lcdAddress, lcdCols, lcdRows);
void setup()
{
pinMode(latchOne, OUTPUT);
pinMode(latchTwo, OUTPUT);
pinMode(latchThree, OUTPUT);
pinMode(clockPinOnePin, OUTPUT);
pinMode(clockPinTwoPin, OUTPUT);
pinMode(clockPinThreePin, OUTPUT);
pinMode(dataPinOnePin, OUTPUT);
pinMode(dataPinTwoPin, OUTPUT);
pinMode(dataPinThreePin, OUTPUT);
pinMode(changeTime, INPUT);
pinMode(setHourPos, INPUT);
pinMode(setMinPos, INPUT);
pinMode(setHourNeg, INPUT);
pinMode(setMinNeg, INPUT);
Serial.begin(9600);
LCD.createChar(0, antenna);
LCD.createChar(1, signal1);
LCD.createChar(2, signal2);
LCD.createChar(3, signal3);
LCD.init();
LCD.write(0);
//LCD.createChar(0, iconMidi);
//LCD.createChar(1, iconNote);
//updateDisplay = millis();
}
void runningTotal(int number)
{
int s = 1;
int j = 0;
temp = 0;
while (j < number)
{
temp = temp + s;
s = s * 2;
j = j + 1;
}
}
void obtainNo()
{
minFives = i / 5;
minUnits = i % 5;
hoursFives = k / 5;
hours = k % 5;
if (minFives > 7) //split minutes as it rolls over two shift registers
{
minFivesLSB = 8;
minFivesMSB = minFives - 8;
}
else
{
minFivesLSB = minFives;
minFivesMSB = 0;
}
}
void obtainRunning()
{
runningTotal(minUnits);
minUnits = temp;
runningTotal(minFivesLSB);
minFivesLSB = temp;
runningTotal(minFivesMSB);
minFivesMSB = temp;
runningTotal(hours);
hours = temp;
runningTotal(hoursFives);
hoursFives = temp;
}
void compileRegs()
{
minUnits = minUnits << 3;
minUnits = minUnits + minFivesMSB;
hoursFives = hoursFives << 4;
hoursFives = hoursFives + hours;
if ((tm.Second) % 2 && minUnits < 128)
minUnits = minUnits + 128;
else
{
if (minUnits > 128)
minUnits = minUnits - 128;
}
}
void sendToRegs()
{
shiftOut(8, 5, MSBFIRST, minFivesLSB);
digitalWrite(2, LOW);
digitalWrite(2, HIGH);
shiftOut(9, 6, MSBFIRST, minUnits);
digitalWrite(3, LOW);
digitalWrite(3, HIGH);
shiftOut(10, 7, MSBFIRST, hoursFives);
digitalWrite(4, LOW);
digitalWrite(4, HIGH);
}
void checkAdj()
{
if (digitalRead(changeTime) == HIGH)
{
if (digitalRead(setHourPos) == HIGH)
{
unsigned long v = RTC.get();
v = v + 3600;
RTC.set(v);
}
if (digitalRead(setMinPos) == HIGH)
{
unsigned long v = RTC.get();
v = v + 60;
RTC.set(v);
}
if (digitalRead(setHourNeg) == HIGH)
{
unsigned long v = RTC.get();
v = v - 3600;
RTC.set(v);
}
if (digitalRead(setMinNeg) == HIGH)
{
unsigned long v = RTC.get();
v = v - 60;
RTC.set(v);
}
i = (tm.Minute);
k = (tm.Hour);
obtainNo();
obtainRunning();
compileRegs();
sendToRegs();
delay(300);
}
}
void loop()
{
if (RTC.read(tm))
{
checkAdj();
i = (tm.Minute);
k = (tm.Hour);
obtainNo();
obtainRunning();
compileRegs();
sendToRegs();
//if(millis() >= updateDisplay + 5000)
//{
// LCD.clear();
LCD.setCursor(4, 0);
if(tm.Hour < 10)
LCD.print(F("0"));
LCD.print(tm.Hour);
LCD.print(F(":"));
if(tm.Minute < 10)
LCD.print(F("0"));
LCD.print(tm.Minute);
if(tm.Second % 2 == 0)
LCD.print(F(":"));
else
LCD.print(F(" "));
if(tm.Second < 10)
LCD.print(F("0")); // Dezimalpunkte ":" ausschalten
LCD.print(tm.Second);
LCD.setCursor(4, 1);
//LCD.print(tm.day);
//LCD.print(F(" "));
LCD.print(tm.Day);
LCD.print(F("."));
LCD.print(tm.Month);
LCD.print(F("."));
LCD.print(tm.Year);
// updateDisplay = millis();
//}
}
}H-
H+
M-
M+
H-