Die Rheinturmuhr mit Arduino und RTC3231

Hallo Leute, ich bin neu auf dem Gebiet und würde gerne wissen ob es möglich ist den RTC 3231 in das unten stehende Programm einzubinden.

Danke im voraus.

#define A0 14 //ANALOG 0
#define A1 15
#define A2 16
#define INTERVAL 1000

//PINS SEKUNDEN MINUTEN STUNDEN
byte oneSecond[] = {0,1,2,3,4,5,6,7,8}; //No Serial on 0/1
byte tenSecond[] = {9,10,11,12,13}; //
byte theSwitch[] = {14,15,16}; //SEKUNDE MINUTE STUNDE
int s10=0,s1=0; //ONESECOND TENSECOND BAND
int m10=5,m1=9;
int h10=2,h1=3;

unsigned long t,t0; //TIMEINIT

void INTITIME(void){t0=millis();}
unsigned long TIMEREAD(void){return millis()-t0;}

void setup()
{int i;
for(i=0; i<sizeof(oneSecond);i++)pinMode(oneSecond*,OUTPUT);*
for(i=0; i<sizeof(tenSecond);i++)pinMode(tenSecond*,OUTPUT);*
for(i=0; i<sizeof(theSwitch);i++)pinMode(theSwitch*,OUTPUT);*
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
}
void loop()
{int i;
t=TIMEREAD();
do
{for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond*,s1<=i?LOW:HIGH); //EINERBAND SEKUNDEN*
_ for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond*,s10<=i?LOW:HIGH); //ZEHNERBAND SEKUNDEN*
* digitalWrite(A0, LOW);//Masse an Sekunden*
* delay(1); //SHOWTIME SEKUNDEN*
* digitalWrite(A0, HIGH);
for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond,m1<=i?LOW:HIGH); //EINERBAND MINUTEN*

for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond*,m10<=i?LOW:HIGH); //ZEHNERBAND MINUTEN*
* digitalWrite(A1, LOW);//Masse an MINUTEN*
* delay(1); //SHOWTIME MINUTEN*
* digitalWrite(A1, HIGH);
for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond,h1<=i?LOW:HIGH); //EINERBAND STUNDEN*

for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond*,h10<=i?LOW:HIGH); //ZEHNERBAND STUNDEN*
* digitalWrite(A2, LOW);//Masse an STUNDEN*
* delay(1); //SHOWTIME STUNDEN*
* digitalWrite(A2, HIGH);
}while(TIMEREAD()<(t+INTERVAL));
//---------------------------------
s1++; //s++;
if(s1>=10){s1=0;s10++;}
if(s10>=6){s10=0;m1++;} //m1++;
if(m1>=10){m1=0;m10++;}
if(m10>=6){m10=0;h1++;} //h1++;
if(h1>=10){h1=0;h10++;}
if(h10>=2 && h1>=4){h10=0;h1=0;}_

}``*

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

MichaelM1976:
... würde gerne wissen ob es möglich ist den RTC 3231 in das unten stehende Programm einzubinden.

Ja, das geht, vorzugsweise in TIMEREAD.

Allerdings sollte INTITIME irgendwo aufgerufen werden.

Wenn man anstelle der einzelnen LEDs einen Streifen APA102 nimmt, könnte es so aussehen:

// Quelle: Rheinturmuhr mit Arduino und RGB-LED http://www.hjberndt.de/soft/rtcws2812.html
// http://tronixlabs.com/news/tutorial-using-ds1307-and-ds3231-realtime-clock-modules-with-arduino/
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
#include "FastLED.h"
FASTLED_USING_NAMESPACE
#define LED_TYPE    APA102
#define COLOR_ORDER BGR
#define BRIGHTNESS  15
#define NUM_LEDS    120 // 47

#define AN        CRGB(255, 255, 255)
#define AUS       CRGB(0, 0, 0)
#define MARKER    CRGB(127, 0, 0)
#define LED(x,y)  leds[x]=y

//LEDS SEC MIN HOUR
byte oneSecond[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};     //09
byte tenSecond[] = {10, 11, 12, 13, 14};            //15
byte oneMinute[] = {16, 17, 18, 19, 20, 21, 22, 23, 24}; //25
byte tenMinute[] = {26, 27, 28, 29, 30};            //31
byte oneHour[]   = {32, 33, 34, 35, 36, 37, 38, 39, 40}; //41
byte tenHour[]   = {42, 43};                        //44
byte Marker[]    = {9, 15, 25, 31, 41, 44, 45, 46};

CRGB leds[NUM_LEDS];

void setup() {
  Wire.begin();
  Serial.begin(9600);
  FastLED.addLeds<LED_TYPE, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  LEDS.showColor(CRGB(0, 0, 0));
  for (byte i = 0; i < sizeof(Marker); i++)LED(Marker[i], MARKER);
}

void loop()
{
  Rheinturmuhr();
}

void Rheinturmuhr()
{
  const uint32_t neueZeitIntervall = 20;
  static uint32_t neueZeitMillis = 0;
  byte s10, s1; //TENSecond ONESecond
  byte m10, m1; //TENMinute ONESecond
  byte h10, h1; //Hour ..
  static byte so = 0;
  readDS3231bcd(&s1, &s10, &m1, &m10, &h1, &h10); // retrieve data from DS3231
  if ((millis() - neueZeitMillis >= neueZeitIntervall) && (so != s1))
  {
    neueZeitMillis = millis();
    so = s1;
    displayTime(); // display the real-time clock data on the Serial Monitor,
    byte i;
    for (i = 0; i < sizeof(oneSecond); i++)
      (s1 <= i ? LED(oneSecond[i], AUS) : LED(oneSecond[i], AN));
    for (i = 0; i < sizeof(tenSecond); i++)
      (s10 <= i ? LED(tenSecond[i], AUS) : LED(tenSecond[i], AN));
    for (i = 0; i < sizeof(oneMinute); i++)
      (m1 <= i ? LED(oneMinute[i], AUS) : LED(oneMinute[i], AN));
    for (i = 0; i < sizeof(tenMinute); i++)
      (m10 <= i ? LED(tenMinute[i], AUS) : LED(tenMinute[i], AN));
    for (i = 0; i < sizeof(oneHour); i++)
      (h1 <= i ? LED(oneHour[i], AUS) : LED(oneHour[i], AN));
    for (i = 0; i < sizeof(tenHour); i++)
      (h10 <= i ? LED(tenHour[i], AUS) : LED(tenHour[i], AN));
    FastLED.show();
  }
}

void readDS3231bcd(byte * s1, byte * s10, byte * m1, byte * m10, byte * h1, byte * h10)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 3);
  byte w = Wire.read();
  *s1 = w & 0x0F;
  *s10 = (w >> 4) & 0x07;
  w = Wire.read();
  *m1 = w & 0x0F;
  *m10 = (w >> 4) & 0x07;
  w = Wire.read();
  *h1 = w & 0x0F;
  *h10 = (w >> 4) & 0x03;
}

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());
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val / 16 * 10) + (val % 16) );
}

void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
                 &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  if (minute < 10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second < 10)
  {
    Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print(" Day of week: ");
  switch (dayOfWeek) {
    case 1:
      Serial.println("Sunday");
      break;
    case 2:
      Serial.println("Monday");
      break;
    case 3:
      Serial.println("Tuesday");
      break;
    case 4:
      Serial.println("Wednesday");
      break;
    case 5:
      Serial.println("Thursday");
      break;
    case 6:
      Serial.println("Friday");
      break;
    case 7:
      Serial.println("Saturday");
      break;
  }
}

Die Ausgabe auf dem seriellen Monitor dient nur der Überprüfung und kann später weggelssen werden.

Da hier viele Teile nicht von mir stammen, verweise ich ausdrücklich auf die angegebenen Quellen!

Ich versuche die Uhr, die ich hier gebaut habe zum laufen zu bringen und es klappt einfach nicht.
Mit dem Programm funktioniert der Ablauf nur die Uhr wird nicht gestellt.

Absoluter anfänger und zu Dumm :slight_smile:

MichaelM1976:
Ich versuche die Uhr, die ich hier gebaut habe zum laufen zu bringen und es klappt einfach nicht.
Mit dem Programm funktioniert der Ablauf nur die Uhr wird nicht gestellt.

Absoluter anfänger und zu Dumm :slight_smile:

Du solltest unbedingt deinen Sketch in Code-Tags packen.

In Post #1 wurdest du da schon drum gebeten.
Warum machst du das nicht ?

Dadurch sind mehr User in der Lage dir zu helfen.

MichaelM1976:
Hallo Leute, ich bin neu auf dem Gebiet und würde gerne wissen ob es möglich ist den RTC 3231 in das unten stehende Programm einzubinden.

Danke im voraus.

#define A0 14 //ANALOG 0
#define A1 15
#define A2 16
#define INTERVAL 1000

//PINS SEKUNDEN MINUTEN STUNDEN
byte oneSecond[] = {0,1,2,3,4,5,6,7,8}; //No Serial on 0/1
byte tenSecond[] = {9,10,11,12,13}; //
byte theSwitch[] = {14,15,16}; //SEKUNDE MINUTE STUNDE
int s10=0,s1=0; //ONESECOND TENSECOND BAND
int m10=5,m1=9;
int h10=2,h1=3;

unsigned long t,t0; //TIMEINIT

void INTITIME(void){t0=millis();}
unsigned long TIMEREAD(void){return millis()-t0;}

void setup()
{int i;
for(i=0; i<sizeof(oneSecond);i++)pinMode(oneSecond*,OUTPUT);*
for(i=0; i<sizeof(tenSecond);i++)pinMode(tenSecond*,OUTPUT);*
for(i=0; i<sizeof(theSwitch);i++)pinMode(theSwitch*,OUTPUT);*
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
}
void loop()
{int i;
t=TIMEREAD();
do
{for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond*,s1<=i?LOW:HIGH); //EINERBAND SEKUNDEN*
for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond*,s10<=i?LOW:HIGH); //ZEHNERBAND SEKUNDEN*
digitalWrite(A0, LOW);//Masse an Sekunden
delay(1); //SHOWTIME SEKUNDEN
digitalWrite(A0, HIGH);
for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond*,m1<=i?LOW:HIGH); //EINERBAND MINUTEN*
for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond*,m10<=i?LOW:HIGH); //ZEHNERBAND MINUTEN*
digitalWrite(A1, LOW);//Masse an MINUTEN
delay(1); //SHOWTIME MINUTEN
digitalWrite(A1, HIGH);
for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond*,h1<=i?LOW:HIGH); //EINERBAND STUNDEN*
for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond*,h10<=i?LOW:HIGH); //ZEHNERBAND STUNDEN*
digitalWrite(A2, LOW);//Masse an STUNDEN
delay(1); //SHOWTIME STUNDEN
digitalWrite(A2, HIGH);
}while(TIMEREAD()<(t+INTERVAL));
//---------------------------------
s1++; //s++;
if(s1>=10){s1=0;s10++;}
if(s10>=6){s10=0;m1++;} //m1++;
if(m1>=10){m1=0;m10++;}
if(m10>=6){m10=0;h1++;} //h1++;
if(h1>=10){h1=0;h10++;}
if(h10>=2 && h1>=4){h10=0;h1=0;}
}
[/quote]
*_</em></em></em></em></em></em></em> <em><em><em><em><em><em><em><em>**</em></em></em></em></em></em></em></em> <em><em><em><em><em><em><em>_*

MichaelM1976:
Hallo Leute, ich bin neu auf dem Gebiet und würde gerne wissen ob es möglich ist den RTC 3231 in das unten stehende Programm einzubinden.

Danke im voraus.

#define A0 14 //ANALOG 0

#define A1 15
#define A2 16
#define INTERVAL 1000

//PINS SEKUNDEN MINUTEN STUNDEN
byte oneSecond[] = {0,1,2,3,4,5,6,7,8}; //No Serial on 0/1
byte tenSecond[] = {9,10,11,12,13};     //
byte theSwitch[] = {14,15,16};          //SEKUNDE MINUTE STUNDE
int s10=0,s1=0; //ONESECOND TENSECOND BAND
int m10=5,m1=9;
int h10=2,h1=3;

unsigned long t,t0; //TIMEINIT

void INTITIME(void){t0=millis();}
unsigned long TIMEREAD(void){return millis()-t0;}

void setup()
{int i;
for(i=0; i<sizeof(oneSecond);i++)pinMode(oneSecond[i],OUTPUT);
for(i=0; i<sizeof(tenSecond);i++)pinMode(tenSecond[i],OUTPUT);
for(i=0; i<sizeof(theSwitch);i++)pinMode(theSwitch[i],OUTPUT);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
}

void loop()
{int i;
t=TIMEREAD();
do
{for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond[i],s1<=i?LOW:HIGH);  //EINERBAND SEKUNDEN
for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond[i],s10<=i?LOW:HIGH); //ZEHNERBAND SEKUNDEN
digitalWrite(A0, LOW);//Masse an Sekunden
delay(1);             //SHOWTIME SEKUNDEN
digitalWrite(A0, HIGH);
for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond[i],m1<=i?LOW:HIGH);  //EINERBAND MINUTEN
for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond[i],m10<=i?LOW:HIGH); //ZEHNERBAND MINUTEN
digitalWrite(A1, LOW);//Masse an MINUTEN
delay(1);             //SHOWTIME MINUTEN
digitalWrite(A1, HIGH);
for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond[i],h1<=i?LOW:HIGH);  //EINERBAND STUNDEN
for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond[i],h10<=i?LOW:HIGH); //ZEHNERBAND STUNDEN
digitalWrite(A2, LOW);//Masse an STUNDEN
delay(1);             //SHOWTIME STUNDEN
digitalWrite(A2, HIGH);
}while(TIMEREAD()<(t+INTERVAL));
//---------------------------------
s1++;                   //s++;
if(s1>=10){s1=0;s10++;}
if(s10>=6){s10=0;m1++;} //m1++;
if(m1>=10){m1=0;m10++;}
if(m10>=6){m10=0;h1++;} //h1++;
if(h1>=10){h1=0;h10++;}
if(h10>=2 && h1>=4){h10=0;h1=0;}
}






> MichaelM1976:
> Hallo Leute, ich bin neu auf dem Gebiet und würde gerne wissen ob es möglich ist den RTC 3231 in das unten stehende Programm einzubinden.
> 
> Danke im voraus.
> 
> #define A0 14 //ANALOG 0
> #define A1 15
> #define A2 16
> #define INTERVAL 1000
> 
> //PINS SEKUNDEN MINUTEN STUNDEN
> byte oneSecond[] = {0,1,2,3,4,5,6,7,8}; //No Serial on 0/1
> byte tenSecond[] = {9,10,11,12,13}; //
> byte theSwitch[] = {14,15,16}; //SEKUNDE MINUTE STUNDE
> int s10=0,s1=0; //ONESECOND TENSECOND BAND
> int m10=5,m1=9;
> int h10=2,h1=3;
> 
> unsigned long t,t0; //TIMEINIT
> 
> void INTITIME(void){t0=millis();}
> unsigned long TIMEREAD(void){return millis()-t0;}
> 
> void setup()
> {int i;
> for(i=0; i<sizeof(oneSecond);i++)pinMode(oneSecond*,OUTPUT);*
> _for(i=0; i<sizeof(tenSecond);i++)pinMode(tenSecond*,OUTPUT);*_
> <em>_for(i=0; i<sizeof(theSwitch);i++)pinMode(theSwitch*,OUTPUT);*_</em>
> <em>_*digitalWrite(A0, HIGH);*_</em>
> <em>_*digitalWrite(A1, HIGH);*_</em>
> <em>_*digitalWrite(A2, HIGH);*_</em>
> <em>_*}*_</em>
> <em>_*void loop()*_</em>
> <em>_*{int i;*_</em>
> <em>_*t=TIMEREAD();*_</em>
> <em>_*do*_</em>
> <em><em>_{for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond*,s1<=i?LOW:HIGH); //EINERBAND SEKUNDEN*_</em></em>
> <em><em><em>_for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond*,s10<=i?LOW:HIGH); //ZEHNERBAND SEKUNDEN*_</em></em></em> 
> <em><em><em>_*digitalWrite(A0, LOW);//Masse an Sekunden*_</em></em></em>
> <em><em><em>_*delay(1); //SHOWTIME SEKUNDEN*_</em></em></em>
> <em><em><em>_*digitalWrite(A0, HIGH);*_</em></em></em>
> <em><em><em><em>_for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond*,m1<=i?LOW:HIGH); //EINERBAND MINUTEN*_</em></em></em></em>
> <em><em><em><em><em>_for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond*,m10<=i?LOW:HIGH); //ZEHNERBAND MINUTEN*_</em></em></em></em></em> 
> <em><em><em><em><em>_*digitalWrite(A1, LOW);//Masse an MINUTEN*_</em></em></em></em></em>
> <em><em><em><em><em>_*delay(1); //SHOWTIME MINUTEN*_</em></em></em></em></em>
> <em><em><em><em><em>_*digitalWrite(A1, HIGH);*_</em></em></em></em></em>
> <em><em><em><em><em><em>_for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond*,h1<=i?LOW:HIGH); //EINERBAND STUNDEN*_</em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond*,h10<=i?LOW:HIGH); //ZEHNERBAND STUNDEN*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*digitalWrite(A2, LOW);//Masse an STUNDEN*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*delay(1); //SHOWTIME STUNDEN*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*digitalWrite(A2, HIGH);*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*}while(TIMEREAD()<(t+INTERVAL));*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*//---------------------------------*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*s1++; //s++;*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*if(s1>=10){s1=0;s10++;}*_</em></em></em></em></em></em></em> 
> <em><em><em><em><em><em><em>_*if(s10>=6){s10=0;m1++;} //m1++;*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*if(m1>=10){m1=0;m10++;}*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*if(m10>=6){m10=0;h1++;} //h1++;*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*if(h1>=10){h1=0;h10++;}*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*if(h10>=2 && h1>=4){h10=0;h1=0;}*_</em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em><em>*}``*</em></em></em></em></em></em></em></em>
> <em><em><em><em><em><em><em>_*[/quote]*_</em></em></em></em></em></em></em>

Hallo....nicht Quote, sondern Code-Tags, Schaltfläche </> verwenden.

Und warum machst du das nicht gleich an deinem ersten Post ?

Das Programm für APA102 jetzt mit gelber Trennung und rot blinkendem Funkfeuer, Debugging ausschaltbar:

// Quelle: Rheinturmuhr mit Arduino und RGB-LED http://www.hjberndt.de/soft/rtcws2812.html
// http://tronixlabs.com/news/tutorial-using-ds1307-and-ds3231-realtime-clock-modules-with-arduino/

// Debugging
//#define DEBUG Serial // Diese Zeile als Kommentar, wenn keine Ausgabe auf dem seriellen Monitor gewünscht ist.
#ifdef DEBUG
#define debug(...) DEBUG.print(__VA_ARGS__)
#define debugln(...) DEBUG.println(__VA_ARGS__)
#define debugbegin(...) DEBUG.begin(__VA_ARGS__)
#else
#define debug(...)
#define debugln(...)
#define debugbegin(...)
#endif

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
#include "FastLED.h"
FASTLED_USING_NAMESPACE
#define LED_TYPE    APA102
#define COLOR_ORDER BGR
#define BRIGHTNESS  15
#define NUM_LEDS    120 // 47

#define AN        CRGB(255, 255, 255)
#define AUS       CRGB(0, 0, 0)
#define MARKER    CHSV( 64, 255, 255)
#define FEUER     CRGB(255, 0, 0)
#define LED(x,y)  leds[x]=y

//LEDS SEC MIN HOUR
byte oneSecond[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
byte tenSecond[] = {10, 11, 12, 13, 14};
byte oneMinute[] = {17, 18, 19, 20, 21, 22, 23, 24, 25};
byte tenMinute[] = {27, 28, 29, 30, 31};
byte oneHour[]   = {34, 35, 36, 37, 38, 39, 40, 41, 42};
byte tenHour[]   = {44, 45};
byte Marker[]    = {9, 26, 43}; // Trennung
byte Feuer[]     = {15, 16, 32, 33, 46, 47, 48}; // Funkfeuer

CRGB leds[NUM_LEDS];

void setup() {
  Wire.begin();
#ifdef DEBUG
  DEBUG.begin(9600);
#endif
  FastLED.addLeds<LED_TYPE, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  LEDS.showColor(CRGB(0, 0, 0));
  for (byte i = 0; i < sizeof(Marker); i++)LED(Marker[i], MARKER);
  for (byte i = 0; i < sizeof(Feuer); i++)LED(Feuer[i], FEUER);
}

void loop()
{
  Rheinturmuhr();
}

void Rheinturmuhr()
{
  uint32_t jetzt = millis();
  const uint32_t neueZeitIntervall = 20, funkFeuerIntervall = 500;
  static uint32_t neueZeitMillis = 0, funkFeuerMillis = 0;
  static bool funkFeuerEINaus = false;
  byte s10, s1; //TENSecond ONESecond
  byte m10, m1; //TENMinute ONESecond
  byte h10, h1; //Hour ..
  static byte so = 0;
  readDS3231bcd(&s1, &s10, &m1, &m10, &h1, &h10); // retrieve data from DS3231
  if ((jetzt - neueZeitMillis >= neueZeitIntervall) && (so != s1))
  {
    neueZeitMillis = jetzt;
    so = s1;
#ifdef DEBUG
    displayTime(); // display the real-time clock data on the Serial Monitor,
#endif
    byte i;
    for (i = 0; i < sizeof(oneSecond); i++)
      (s1 <= i ? LED(oneSecond[i], AUS) : LED(oneSecond[i], AN));
    for (i = 0; i < sizeof(tenSecond); i++)
      (s10 <= i ? LED(tenSecond[i], AUS) : LED(tenSecond[i], AN));
    for (i = 0; i < sizeof(oneMinute); i++)
      (m1 <= i ? LED(oneMinute[i], AUS) : LED(oneMinute[i], AN));
    for (i = 0; i < sizeof(tenMinute); i++)
      (m10 <= i ? LED(tenMinute[i], AUS) : LED(tenMinute[i], AN));
    for (i = 0; i < sizeof(oneHour); i++)
      (h1 <= i ? LED(oneHour[i], AUS) : LED(oneHour[i], AN));
    for (i = 0; i < sizeof(tenHour); i++)
      (h10 <= i ? LED(tenHour[i], AUS) : LED(tenHour[i], AN));
    FastLED.show();
  }
  if (jetzt - funkFeuerMillis >= funkFeuerIntervall)
  {
    funkFeuerMillis = jetzt;
    if (funkFeuerEINaus)
    {
      for (byte i = 0; i < sizeof(Feuer); i++)LED(Feuer[i], AUS);
    } else {
      for (byte i = 0; i < sizeof(Feuer); i++)LED(Feuer[i], FEUER);
    }
    funkFeuerEINaus = !funkFeuerEINaus;
    FastLED.show();
  }
}

void readDS3231bcd(byte * s1, byte * s10, byte * m1, byte * m10, byte * h1, byte * h10)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 3);
  byte w = Wire.read();
  *s1 = w & 0x0F;
  *s10 = (w >> 4) & 0x07;
  w = Wire.read();
  *m1 = w & 0x0F;
  *m10 = (w >> 4) & 0x07;
  w = Wire.read();
  *h1 = w & 0x0F;
  *h10 = (w >> 4) & 0x03;
}

#ifdef DEBUG
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());
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val / 16 * 10) + (val % 16) );
}

void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
                 &year);
  // send it to the serial monitor
  DEBUG.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  DEBUG.print(":");
  if (minute < 10)
  {
    DEBUG.print("0");
  }
  DEBUG.print(minute, DEC);
  DEBUG.print(":");
  if (second < 10)
  {
    DEBUG.print("0");
  }
  DEBUG.print(second, DEC);
  DEBUG.print(" ");
  DEBUG.print(dayOfMonth, DEC);
  DEBUG.print("/");
  DEBUG.print(month, DEC);
  DEBUG.print("/");
  DEBUG.print(year, DEC);
  DEBUG.print(" Day of week: ");
  switch (dayOfWeek) {
    case 1:
      DEBUG.println("Sunday");
      break;
    case 2:
      DEBUG.println("Monday");
      break;
    case 3:
      DEBUG.println("Tuesday");
      break;
    case 4:
      DEBUG.println("Wednesday");
      break;
    case 5:
      DEBUG.println("Thursday");
      break;
    case 6:
      DEBUG.println("Friday");
      break;
    case 7:
      DEBUG.println("Saturday");
      break;
  }
}
#endif