Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include <TimeLib.h>
- #include <DS1307RTC.h>
- #include <SPI.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #define SCREEN_WIDTH 128 // OLED display width, in pixels
- #define SCREEN_HEIGHT 64 // OLED display height, in pixels
- // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
- void setup() {
- Serial.begin(9600);
- while (!Serial) ; // wait for serial
- delay(200);
- Serial.println("DS1307RTC Read Test");
- Serial.println("-------------------");
- if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
- Serial.println(F("SSD1306 allocation failed"));
- for (;;); // Don't proceed, loop forever
- }
- }
- void loop() {
- //Serial.print() ausgaben erfolgen auf dem Seriellen Monitor
- //Ausgabe der Uhrzeit als Kreise auf dem 0.96" OLED Display mit lcdDraw(....)
- tmElements_t tm;
- display.clearDisplay();
- if (RTC.read(tm)) {
- Serial.print("Ok, Time = ");
- print2digits(tm.Hour);
- lcdDraw(tm.Hour, 20, 25, 10, 8, 3, 5);
- Serial.write(':');
- print2digits(tm.Minute);
- lcdDraw(tm.Minute, 11, 5, 33, 5, 2, 10);
- Serial.write(':');
- print2digits(tm.Second);
- lcdDraw(tm.Second, 11, 5, 55, 5, 2, 10);
- // Datum wird noch nicht angezeigt kann aber durch drücken einer Taste hinzugefügt werden
- Serial.print(", Date (D/M/Y) = ");
- Serial.print(tm.Day);
- Serial.write('/');
- Serial.print(tm.Month);
- Serial.write('/');
- Serial.print(tmYearToCalendar(tm.Year));
- Serial.println();
- // nach dem zeichnen der aktuellen Uhrzeit in denDisplaybuffer alles auf ein mal anzeigen/aktualisieren
- display.display();
- } else {
- if (RTC.chipPresent()) {
- Serial.println("The DS1307 is stopped. Please run the SetTime");
- Serial.println("example to initialize the time and begin running.");
- Serial.println();
- } else {
- Serial.println("DS1307 read error! Please check the circuitry.");
- Serial.println();
- }
- delay(3000);
- }
- delay(1000);
- }
- void print2digits(int number) { // Auf dem Serial Monitor fehlende "Null" bei einzelnen Ziffern auffüllen
- if (number >= 0 && number < 10) {
- Serial.write('0');
- }
- Serial.print(number);
- }
- void lcdDraw(byte timeis, byte x1, byte x2, byte y, byte d1, byte d2, byte d3) {
- /*
- in der Variable timeis wird die aktuelle Uhrzeit/Minute/Sekunde übergeben
- x1 ist der Abstand als Multiplikator für die anzuzeigenden Kreise
- x2 ist der Abstand zwischen den Kreisen je nach größe wie d1 und d2 angegeben werden
- y ist die Koordinate wo der Kreis dargestellt werden soll
- d1, d2 sind die Durchmesser der anzuzeigenden Kreise
- d3 ist die Ganzzahl der anzugeinden Kreise je nach größe des Display
- d3 = 5 bedeutet jeder 5. kleine volle Kreis (Sekunde/Minute/Stunde) wird als voller leerer Kreis dargestellt
- a ist die Ganzzahl des übermittelten Wertes in Bezug auf d3.
- b ist der Rest der Division von timeis durch a
- 16:23 Uhr würde folgendermaßen dargestellt werden angenommen für die Stunden ist d3=5 und Minuten und Sekunden d3=10
- a = 16 / 5 = 3, 3 große leere Kreise. b = 16 % 5 = 1 (Rest aus 16 / 5 ) 1 voller kleiner Kreis für die Stunden
- a = 23 / 10 = 2, 2 große leere Kreise. b = 23 % 10 = 3 (Rest aus 23 / 10 ) 3 volle kleine Kreise für die Minuten
- */
- byte a = timeis / d3; int b = timeis % d3;
- for (byte i = 0; i < a; i++) {
- display.drawCircle(i * x1 + x2, y, d1, SSD1306_WHITE);
- }
- for (byte i = 0; i < b; i++) {
- display.fillCircle(i * x1 + x2, y, d2, SSD1306_INVERSE);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement