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!