===== Digitaluhr mit DS3231 RTC High Precision Real-Time Clock Module =====
Für eine Digitaluhr, die auch eine Stromunterbrechung übersteht, wird eine Batteriegepufferte Uhr benötigt. Ich habe diesen Bausatz verwendet:
''DS3231 RTC High Precision Real-Time Clock Module with AT24C32 EEPROM''
{{ :real-time-clock-ds3231-at24c32.jpg?200 |}}
Für die Anzeige wird ein kleiner OLED-Screen verwendet.
{{ :oled-display1.png?200 |}}
**Aufbau:**
{{ :oled-display.png?400 |}}
**Verdrahtung:**
Da beide Module eine I2C-Schnittstelle haben, ist die Verdrahtung denkbar einfach:
Arduino Display Clock
GND ..... GND ...... GND
VCC .... VCC ..... VCC (3.3V)
SCL ..... SCL ...... SCL
SDA ..... SDA ...... SDA
**Programmierung:**
#include
#include
#include // Display
#include // Display
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
// end of Display --------------------------
#define DS3231_I2C_ADDRESS 0x68 // Clock-Adresse
void setup() {
Wire.begin();
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C addr 0x3C
display.clearDisplay();
// ** Zeit einmalig hier setzen, danach auskommentieren
// ** DS3231 seconds, minutes, hours, day, date, month, year
// ** day 1=Sonntag ... 7=Samstag
// ** Mi., 4.10.2018 11:50:00
// setDS3231time(00,50,11,4,24,10,18);
}
// 4 Strings auf Display ausgeben
void drawText(String txt1, String txt2, String txt3, String txt4) {
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(10,0);
display.clearDisplay();
display.println(txt1);
display.setTextSize(1);
display.println(txt2);
display.println(txt3);
display.setTextSize(2);
display.print(txt4);
display.display();
}
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val) { return( (val/10*16) + (val%10) ); }
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); }
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek,
byte dayOfMonth, byte month, byte year) {
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
// Zeit auslesen
void readDS3231time(byte *second, byte *minute, byte *hour,
byte *dayOfWeek, byte *dayOfMonth, byte *month,byte *year) {
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*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());
}
// Werte in Uhrzeit umformatieren (HH:MM:SS)
String getUhrzeit(byte second, byte minute, byte hour) {
String h = String(hour); if (hour<10) h="0" + h;
String m = String(minute); if (minute<10) m="0" + m;
String s = String(second); if (second<10) s="0" + s;
return h + ":" + m + ":" + s;
}
// Werte in Datum umformatieren (DD-MM-YYYY)
String getDatum(byte dayOfWeek, byte dayOfMonth, byte month, byte year) {
String d = String(dayOfMonth); if (dayOfMonth<10) d = "0" + d;
String mo = String(month); if (month<10) mo = "0" + mo;
String y = String(year); if (year<10) y = "0" + y;
return d + "-" + mo + "-20" + y;
}
// Uhrzeit anzeigen
void displayTime() {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
String uhrzeit = getUhrzeit(second, minute, hour);
String datum = getDatum(dayOfWeek, dayOfMonth, month, year);
String tag = getDayOfWeek(dayOfWeek);
drawText(uhrzeit,"",tag,datum);
}
// Endlosschleife
void loop() {
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second
}