#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
unsigned long color;
int hours, minutes, seconds; // Globale Variablen deklarieren.
// An welchem PWM-Ausgang am Arduino sind die NeoPixel angeschlossen?
#define LED_PIN 9
// Wie viele NeoPixel sind angeschlossen?
#define LED_ANZAHL 228
// Helligkeit der Pixel einstellen (0=dunkel, 255=hell)
byte helligkeit=200;
// Deklaration des NeoPixel-Streifens:
Adafruit_NeoPixel strip(LED_ANZAHL, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Anzahl der NeoPixel
// Argument 2 = Arduino PWM-Pin an dem der LED-Streifen angeschlossen ist
// Argument 3 = Welche Art von NeoPixel-Streifen wird verwendet?:
// NEO_KHZ800 800 KHz bitstream (meistverwendet --> NeoPixel w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (nicht v2) FLORA pixels, WS2811 treiber)
// NEO_GRB Pixels sind für GRB bitstream vorgesehen (meistverwendet)
// NEO_RGB Pixels sind für RGB bitstream vorgesehen (v1 FLORA pixels, not v2)
// NEO_RGBW Pixels sind für RGBW bitstream vorgesehen (NeoPixel RGBW Produkte)
// Bis zu vier Pixels pro Feld. Kann aber einfach geaendert werden
#define NUM_PIXELS 23
//Array eröffnen. Die LEDs, die zur Anzeige des benötigten Wortes nötig sind, werden hier deklariert. Der Eintrag -1 ist ein Abbruchkriterium (Wird in der Schleife verwendet)..
signed char leds[27][NUM_PIXELS] = {
{ 0, 1, 20, 21, 60, 61, 80, 81, 100, 101, -1 }, // ES IST
{ 140, 141, 160, 161, 180, 181, 200, 201, -1 }, // FUENF
{ 2, 3, 22, 23, 42, 43, 62, 63, -1 }, // ZEHN
{ 4, 5, 24, 25, 44, 45, 64, 65, 84, 85, 104, 105, 124, 125, 144, 145, 164, 165, 184, 185, 204, 205, -1 }, //DREIVIERTEL
{ 84, 85, 104, 105, 124, 125, 144, 145, 164, 165, 184, 185, 204, 205, -1 }, // VIERTEL
{ 82, 83, 102, 103, 122, 123, 142, 143, 162, 163, 182, 183, 202, 203, -1 }, // ZWANZIG
{ 8, 9, 28, 29, 48, 49, 68, 69, -1 }, // HALB
{ 126, 127, 146, 147, 166, 167, -1 }, // VOR
{ 46, 47, 66, 67, 86, 87, 106, 107, -1 }, // NACH
{ 50, 51, 70, 71, 90, 91, 110, 111, -1 }, // EINS
{ 10, 11, 30, 31, 50, 51, 70, 71, -1 }, // ZWEI
{ 32, 33, 52, 53, 72, 73, 92, 93, -1 }, // DREI
{ 154, 155, 174, 175, 194, 195, 214, 215, -1 }, // VIER
{ 152, 153, 172, 173, 192, 193, 212, 213, -1 }, // FUENF
{ 38, 39, 58, 59, 78, 79, 98, 99, 118, 119, -1 }, // SECHS
{ 110, 111, 130, 131, 150, 151, 170, 171, 190, 191, 210, 211, -1 }, // SIEBEN
{ 36, 37, 56, 57, 76, 77, 96, 97, -1 }, // ACHT
{ 74, 75, 94, 95, 114, 115, 134, 135, -1 }, // NEUN
{ 116, 117, 136, 137, 156, 157, 176, 177, -1 }, // ZEHN
{ 14, 15, 34, 35, 54, 55, -1 }, // ELF
{ 108, 109, 128, 129, 148, 149, 168, 169, 188, 189, -1 }, // ZWOELF
{ 178, 179, 198, 199, 218, 219, -1 }, // UHR
{ 220, 221, -1 }, // 1
{ 222, 223, -1 }, // 2
{ 224, 225, -1 }, // 3
{ 226, 227, -1 }, // 4
{ 50, 51, 70, 71, 90, 91, -1 } // EIN (UHR) - Volle Stunde
};
//Hier wird den Worten eine Zeile aus dem Array zugewiesen.
#define ES_IST 0
#define M_EINS 22
#define M_ZWEI 23
#define M_DREI 24
#define M_VIER 25
#define M_FUENF 1
#define M_ZEHN 2
#define DREIVIERTEL 3
#define VIERTEL 4
#define VOR 7
#define NACH 8
#define HALB 6
#define H_EINS 9
#define H_ZWEI 10
#define H_DREI 11
#define H_VIER 12
#define H_FUENF 13
#define H_SECHS 14
#define H_SIEBEN 15
#define H_ACHT 16
#define H_NEUN 17
#define H_ZEHN 18
#define H_ELF 19
#define H_ZWOELF 20
#define UHR 21
#define H_EIN 26
void setup() {
strip.begin(); // Initialisieren des NeoPixel Objectes (Muss aufgerufen werden!)
strip.show(); // Alle Pixel ausschalten
strip.setBrightness(helligkeit); // Helligkeit wird in Zeile 18 eingestellt.
color = strip.Color(255, 0, 0);
Serial.begin(115200); // Baudrate für die Kommunikation mit dem Uhrmodul
/*
* Die Zeit/Datum muss nur einmalig auf das Modul geschrieben werden.
* Nach dem ersten Einstellen der Zeit müssen die folgende Zeile auskommentiert werden,
* sonst wird immer wieder die Zeit aus dem Programm ins Uhrmodul geschrieben und somit die aktuelle Zeit überschrieben.
*/
//setDate();
}
void setLeds(int i) {
for (int k = 0; k < NUM_PIXELS; k++) {
if (leds[i][k] > -1) {
strip.setPixelColor(leds[i][k], color);
}
else {
break;
}
}
}
void displayTime() {
int mins = minutes - (minutes % 5); //Beispiel mins=28(minutes)%5 = 3 (Ergebnis ist 5 rest 3. Es wird nur der Rest ausgegeben.)
int hrs;
int vor = 0;
strip.clear();
setLeds(ES_IST);
switch (mins / 5) { //Hier werden die Minutenworte geschaltet
case 0: // Volle Stunde
setLeds(UHR);
break;
case 1:
setLeds(M_FUENF);
setLeds(NACH);
break;
case 2:
setLeds(M_ZEHN);
setLeds(NACH);
break;
case 3:
setLeds(VIERTEL);
setLeds(NACH);
break;
case 4:
setLeds(ZWANZIG);
setLeds(NACH);
break;
case 5:
setLeds(M_FUENF);
setLeds(VOR);
setLeds(HALB);
vor = 1;
break;
case 6:
setLeds(HALB);
vor = 1;
break;
case 7:
setLeds(M_FUENF);
setLeds(NACH);
setLeds(HALB);
vor = 1;
break;
case 8:
setLeds(ZWANZIG);
setLeds(VOR);
vor = 1;
break;
case 9:
setLeds(VIERTEL);
setLeds(VOR);
vor = 1;
break;
case 10:
setLeds(M_ZEHN);
setLeds(VOR);
vor = 1;
break;
case 11:
setLeds(M_FUENF);
setLeds(VOR);
vor = 1;
break;
}
switch (minutes % 5) { //Hier werden die LEDs für die Minutenanzeige (1-4) geschaltet.
case 0:
break;
case 1:
setLeds(M_EINS);
break;
case 2:
setLeds(M_ZWEI);
break;
case 3:
setLeds(M_DREI);
break;
case 4:
setLeds(M_VIER);
break;
}
hrs = hours + vor;
if (hrs > 12) {
hrs = hrs - 12;
}
if (hrs == 0) {
hrs = 12;
}
// STUNDEN
switch (hrs) {
case 1:
if(mins/5==0){
setLeds(H_EIN);
break;
}
else {
setLeds(H_EINS);
break;
}
case 2:
setLeds(H_ZWEI);
break;
case 3:
setLeds(H_DREI);
break;
case 4:
setLeds(H_VIER);
break;
case 5:
setLeds(H_FUENF);
break;
case 6:
setLeds(H_SECHS);
break;
case 7:
setLeds(H_SIEBEN);
break;
case 8:
setLeds(H_ACHT);
break;
case 9:
setLeds(H_NEUN);
break;
case 10:
setLeds(H_ZEHN);
break;
case 11:
setLeds(H_ELF);
break;
case 12:
setLeds(H_ZWOELF);
break;
}
strip.show();
}
void loop()
{
readTime();
displayTime();
delay(250);
}
void readTime() // Funktion zum Auslesen der Zeit aus dem Modul.
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
seconds = bcdToDec(Wire.read());
minutes = bcdToDec(Wire.read());
hours = bcdToDec(Wire.read() & 0b111111);
// Serial.println("Ausgelesene Stunden: " + (String)hours + ", Minuten: " + (String)minutes + ", Sekunden: " + (String)seconds); //Dieser Befehl schreibt die Zeit in die Serielle Console
}
void setDate() //Funktion zum schreiben der Zeit auf das Uhrmodul
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0x00);
Wire.write(decToBcd(30)); // sekunden
Wire.write(decToBcd(9)); // minuten
Wire.write(decToBcd(20)); // stunden (24-hour format)
Wire.write(decToBcd(6)); // wochentag (1=Sonntag)
Wire.write(decToBcd(29)); // tag
Wire.write(decToBcd(01)); // monat
Wire.write(decToBcd(2021)); // jahr
Wire.write(0x00);
Wire.endTransmission();
}
int decToBcd(int value) // Dezimalzahl in Binärcode umwandeln
{
return ((value/10*16) + (value%10));
}
int bcdToDec(int value) // Binärcode in Dezimalzahl umwandeln
{
return ((value/16*10) + (value%16));
}