Advertisement
Seelenkind

RTC Binary Watch

Mar 25th, 2022
1,025
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <Wire.h>
  2. #include <TimeLib.h>
  3. #include <DS1307RTC.h>
  4. #include <SPI.h>
  5. #include <Adafruit_GFX.h>
  6. #include <Adafruit_SSD1306.h>
  7.  
  8. #define SCREEN_WIDTH 128 // OLED display width, in pixels
  9. #define SCREEN_HEIGHT 64 // OLED display height, in pixels
  10. // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
  11. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
  12.  
  13. void setup() {
  14.   Serial.begin(9600);
  15.   while (!Serial) ; // wait for serial
  16.   delay(200);
  17.   Serial.println("DS1307RTC Read Test");
  18.   Serial.println("-------------------");
  19.   if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
  20.     Serial.println(F("SSD1306 allocation failed"));
  21.     for (;;); // Don't proceed, loop forever
  22.   }
  23. }
  24.  
  25. void loop() {
  26.   //Serial.print() ausgaben erfolgen auf dem Seriellen Monitor
  27.   //Ausgabe der Uhrzeit als Kreise auf dem 0.96" OLED Display mit lcdDraw(....)
  28.  
  29.   tmElements_t tm;
  30.   display.clearDisplay();
  31.   if (RTC.read(tm)) {
  32.     Serial.print("Ok, Time = ");
  33.     print2digits(tm.Hour);
  34.     lcdDraw(tm.Hour, 20, 25, 10, 8, 3, 5);
  35.     Serial.write(':');
  36.     print2digits(tm.Minute);
  37.     lcdDraw(tm.Minute, 11, 5, 33, 5, 2, 10);
  38.     Serial.write(':');
  39.     print2digits(tm.Second);
  40.     lcdDraw(tm.Second, 11, 5, 55, 5, 2, 10);
  41.    
  42.     // Datum wird noch nicht angezeigt kann aber durch drücken einer Taste hinzugefügt werden
  43.     Serial.print(", Date (D/M/Y) = ");
  44.     Serial.print(tm.Day);
  45.     Serial.write('/');
  46.     Serial.print(tm.Month);
  47.     Serial.write('/');
  48.     Serial.print(tmYearToCalendar(tm.Year));
  49.     Serial.println();
  50.     // nach dem zeichnen der aktuellen Uhrzeit in denDisplaybuffer alles auf ein mal anzeigen/aktualisieren
  51.     display.display();
  52.   } else {
  53.     if (RTC.chipPresent()) {
  54.       Serial.println("The DS1307 is stopped.  Please run the SetTime");
  55.       Serial.println("example to initialize the time and begin running.");
  56.       Serial.println();
  57.     } else {
  58.       Serial.println("DS1307 read error!  Please check the circuitry.");
  59.       Serial.println();
  60.     }
  61.     delay(3000);
  62.   }
  63.   delay(1000);
  64. }
  65.  
  66. void print2digits(int number) { // Auf dem Serial Monitor fehlende "Null" bei einzelnen Ziffern auffüllen
  67.   if (number >= 0 && number < 10) {
  68.     Serial.write('0');
  69.   }
  70.   Serial.print(number);
  71. }
  72.  
  73. void lcdDraw(byte timeis, byte x1, byte x2, byte y, byte d1, byte d2, byte d3) {
  74.   /*
  75.     in der Variable timeis wird die aktuelle Uhrzeit/Minute/Sekunde übergeben
  76.      x1 ist der Abstand als Multiplikator für die anzuzeigenden Kreise
  77.      x2 ist der Abstand zwischen den Kreisen je nach größe wie d1 und d2 angegeben werden
  78.      y ist die Koordinate wo der Kreis dargestellt werden soll
  79.      d1, d2 sind die Durchmesser der anzuzeigenden Kreise
  80.      d3 ist die Ganzzahl der anzugeinden Kreise je nach größe des Display
  81.      d3 = 5 bedeutet jeder 5. kleine volle Kreis (Sekunde/Minute/Stunde) wird als voller leerer Kreis dargestellt
  82.       a ist die Ganzzahl des übermittelten Wertes in Bezug auf d3.
  83.       b ist der Rest der Division von timeis durch a
  84.       16:23 Uhr würde folgendermaßen dargestellt werden angenommen für die Stunden ist d3=5 und Minuten und Sekunden d3=10
  85.       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
  86.       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
  87.   */
  88.   byte a = timeis / d3; int b = timeis % d3;
  89.   for (byte i = 0; i < a; i++) {
  90.     display.drawCircle(i * x1 + x2, y, d1, SSD1306_WHITE);
  91.   }
  92.  
  93.   for (byte i = 0; i < b; i++) {
  94.     display.fillCircle(i * x1 + x2, y, d2, SSD1306_INVERSE);
  95.   }
  96. }
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement