Wortuhr mit Neopixel LED-Streifen

SefanH

Active member
Ich möchte mit möglichst wenig Aufwand mindestens 21 (oder 25) Gruppen von LEDs (max 3 STK pro Gruppe) zeitabhängig Steuern.
Teilweise müssen mehrere Gruppen gleichzeitig leuchten...
Welche Möglichkeiten habe ich da?

(q clock two)

LG Stefan
 
Zuletzt bearbeitet:
Ist es denn machbar jede einzelne LED einzeln anzusteuern und den Streifen in 4 Teile zu teilen?
 
Genau das brauche ich!
Nun muss ich NUR noch lernen...
Ich möchte nämlich je nach Uhrzeit bestimmte LEDs leuchten lassen... Tipps? C/C++ Kenntnisse = 0
Bis Mai habe ich Zeit... Ich denke das ich mit einem Uhrmodul und einem Arduino zum Ziel komme... Mal sehen... Ich werde es testen! (Und viel lernen!)
 
Diese Art LED wäre eine super Zustandserkennung für den Ardumover.
GPS - Status, Ladezustand, Mähfortschritt ...
Dann müsste man nicht immer des Handy rauskramen.

@SefanH : was für eine Uhr willst bauen?
Vor Jahren gab es mal solche Uhren zu kaufen, hammergeil:
IMG_20210124_120028076.jpg

Seit dem nie wieder gesehen.
 
Die Uhr habe ich oben verlinkt. Im Original heißt die "q clock two".
Ich werde also eine art Setzkasten bauen und an der Rückwand die Streifen anbringen. So kann man dann jedes Fach einzeln beleuchten. Vorne kommt dann eine Plexiglasplatte drauf, hinter die Platte werden in Spiegelschrift die Uhrzeit-Angaben aus einer Folie geschnitten (Plotter) und die Front der Plexiglasplatte wird mit Verdunkelungsfolie beklebt.

Soweit der Plan...
 
Zuletzt bearbeitet:
Eigentlich brauche ich doch nicht mal ein Uhr Modul... Die Anzeige ändert sich ja nur alle 5 Minuten und die Uhr bekommt den Strom aus der Steckdose. 2 Taster zum Einstellen der Uhr dürfen auch nicht fehlen.
Sollte machbar sein für mein Erstprojekt, oder mute ich mir da zu viel zu?
Habt ihr Lektüre, die ihr mir zur Programmierung empfehlen könnt? Oder ist Google die bessere Wahl?

Nachtrag: Ich werde das I2C Uhrmodul wohl doch einbinden, ist einfach besser und auch garnicht so schwer wie angenommen! Und der LED-Streifen kommt morgen... Dann fehlt ja nur noch zeit zum testen... Wo ich die her nehmen soll, weiß ich aber noch nicht ;-)

28.01.21:
Streifen ist da... 300 Pixel = 5meter. Test lief toll... 37 Pixel auf 8 Reihen sind geplant, dazu 4 Sekundenpixel. Hoffentlich kommt morgen die RTC. 🥰

29.01.21:
RTC ist da!
Angeschlossen und Firmware gebastelt. 👍
 
Zuletzt bearbeitet:
Firmware hat den ersten Betatest bestanden!
In der Konsole wird je nach Uhrzeit die Zeit in Worten wiedergegeben. Code Stelle ich nachher noch zum Diskutieren zur Verfügung - Ist ja mein erstes Projekt.
 
So hier ist die erste Version des Codes. Vielleicht hat ja jemand lust und guckt mal drauf... vielleicht hat ja noch jemand irgendwelche hilfreichen Tipps für mich?!?
Nun muss ich erstmal das Uhrgehäuse bauen...

Code:
/*  Remake einer "q clock two", realisiert mit einem Neopixel RGB-Streifen und einem I2C DS1307 Uhrmodul
    Das DS1307-Modul wird an VCC mit 3,3V versorgt, GND an Masse, SDA an Pin 20, SCL an Pin 21. (Arduino DUE)
*/
#include <Adafruit_NeoPixel.h>
#include <Wire.h>

#define DS1307_ADDRESS 0x68 // I²C Addresse für Uhrmodul

 int hours, minutes, seconds, mins;    //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 60

// 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)


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.

  Wire.begin();            // Wird für die Uhr benötigt
  Serial.begin(9600);      // 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 loop()
{
  readTime();
  mins = minutes - (minutes%5);
  if (mins==5){
    fuenf();
    nach();
    }
if (mins==10){
    zehn();
    nach();
    }
  if (mins==15){
    viertel();
    nach();
    }
  if (mins==20){
    zwanzig();
    nach();
    }
  if (mins==25){
    fuenf();
    vor();
    halb();
    }
  if (mins==30){
    halb();
    }
  if (mins==35){
    fuenf();
    nach();
    halb();
    }
  if (mins==40){
    zwanzig();
    vor();
    }
  if (mins==45){
    viertel();
    vor();
    }
  if (mins==50){
    zehn();
    vor();
    }
  if (mins==55){
    fuenf();
    vor();
    }

if(hours>12){hours=hours-12;}
if(hours==0){hours=12;}

//STUNDEN
  if(hours==1 && mins<=20){
    EINS();
  }
  if(hours==1 && mins>=25){
    ZWEI();
  }
  if(hours==2 && mins<=20){
    ZWEI();
  }
  if(hours==2 && mins>=25){
    DREI();
  }
  if(hours==3 && mins<=20){
    DREI();
  }
  if(hours==3 && mins>=25){
    VIER();
  }
  if(hours==4 && mins<=20){
    VIER();
  }
  if(hours==4 && mins>=25){
    FUENF();
  }
  if(hours==5 && mins<=20){
    FUENF();
  }
  if(hours==5 && mins>=25){
    SECHS();
  }
  if(hours==6 && mins<=20){
    SECHS();
  }
  if(hours==6 && mins>=25){
    SIEBEN();
  }
  if(hours==7 && mins<=20){
    SIEBEN();
  }
  if(hours==7 && mins>=25){
    ACHT();
  }
  if(hours==8 && mins<=20){
    ACHT();
  }
  if(hours==8 && mins>=25){
    NEUN();
  }
  if(hours==9 && mins<=20){
    NEUN();
  }
  if(hours==9 && mins>=25){
    ZEHN();
  }
  if(hours==10 && mins<=20){
    ZEHN();
  }
  if(hours==10 && mins>=25){
    ELF();
  }
  if(hours==11 && mins<=20){
    ELF();
  }
  if(hours==11 && mins>=25){
    ZWOELF();
  }
  if(hours==12 && mins<=20){
    ZWOELF();
  }
  if(hours==12 && mins>=25){
    EINS();
  }
 
  delay(1000);
}

// Hier werden die LEDs angesprochen. (minuten)
void fuenf(){
  Serial.println("fünf");
}
void zehn(){
  Serial.println("zehn");
}
void viertel(){
  Serial.println("viertel");
}
void zwanzig(){
  Serial.println("zwanzig");
}
void vor(){
  Serial.println("vor");
}
void nach(){
  Serial.println("nach");
}
void halb(){
  Serial.println("halb");
}
    // Hier werden die LEDs angesprochen (STUNDEN)
void EINS(){
  Serial.println("EINS");
}
void ZWEI(){
  Serial.println("ZWEI");
}
void DREI(){
  Serial.println("DREI");
}
void VIER(){
  Serial.println("VIER");
}
void FUENF(){
  Serial.println("FÜNF");
}
void SECHS(){
  Serial.println("SECHS");
}
void SIEBEN(){
  Serial.println("SIEBEN");
}
void ACHT(){
  Serial.println("ACHT");
}
void NEUN(){
  Serial.println("NEUN");
}
void ZEHN(){
  Serial.println("ZEHN");
}
void ELF(){
  Serial.println("ELF");
}
void ZWOELF(){
  Serial.println("ZWÖLF");
}

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));
}
 
Ich wuerde nicht so viele Funktionen benutzen sondern mehr als 'Daten' ablegen. Ein kleines Testprogramm benutzt ein zweidimensionales Array. Mit 250ms pro Minute sieht es ungefaehr so aus;-)
Ich benutze eine Variable fuer die Farbe. Damit ist es sehr einfach, die nach Tageszeit oder was auch immer zu aendern;-)
 

Anhänge

  • WortUhr.txt
    5,8 KB · Aufrufe: 5
Ich verstehe die Funktion SetLeds nicht... Was wird hier gemacht?
Code:
leds[i][k]
werden hier i+k addiert??? Bei "vor" wäre i=5 und k wird immer um 1 erhöht... Scheinbar werden da dann die LEDs "eingeschaltet"?!? Überschneiden sich die leuchtenden LEDs dann nicht??? ImVideo ist ja nur eine LED je Zustand gegeben... Daher klapt es... Bei 3 LEDs müssten doch die Werte geändert werden, oder liege ich falsch?

Code:
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;
    }

Und hier blicke ich auch nicht durch... Du erstellst ein Array, 25x4 Felder groß in diesem Fall. Du schreibst jedoch nur 2 Werte pro Zeile hinein... Und warum -1? Und in einer Zeile werden die Zahlen 14,17 und -1 übergeben... Warum???

Code:
signed char leds[25][NUM_PIXELS] = {
  { 0, -1 },         // ES IST
  { 1, -1 },         // ZEHN

Kannst du mir das mal ein wenig näher bringen?
Ich hab quasi fast null Ahnung... Bin mit Q-Basic groß geworden... ;-)
 
Zuletzt bearbeitet:
Fangen wir mal 'von Deinem unten' an;-)
  • Ich lege ein zwei-dimensionales Array an (am besten als eine Flaeche vorstellen;-) 25 Einheiten lang (Mein Ausdruck hatte 25 verschiedene Felder, die ich unabhaengig beleuchten wollte) - nennen wir die mal 'Zeilen' und 4 Einheiten breit (die maximale Anzahl Pixels pro Feld) - 'Spalten'.
  • Arrays in C/C++ fangen immer mit dem Index 0 an und die Adafruit NeoPixel Bibliothek folgt dem. Ich benutze -1 (einen ungueltigen Index fuer den NeoPixel strip als Ende-Marker. Mein Array hat Platz fuer 4 Pixels pro Feld, mein kleiner Test-Aufbau hatte aber meistens nur ein Pixel (ein Feld hatte zwei weil der Abstand zu gross war).
  • So in der Array-Initialisierung sind in jeder Zeile die wirklchen Pixels, gefolgt vom Ende-Marker (wenn ich weniger als vier Pixles habe) und der Compiler fuellt die restlichen Spalten mit 0 Werten auf.
  • Jetzt fuer setLeds(int i) ;-) Der Parameter i bestimmt die Zeile im leds Array. Die for-Schleife laeuft ueber die [maximal 4] Spalten der Zeile und schaltet die gueltigen Pixel auf die gegebene Farbe (erstmal nur in der Speicher-Representation). Wenn die for-Schleife auf einen Ende-Marker trifft, hoert sie vorzeitig auf.
  • leds[ii][k] die Indizes werden nicht addiert;-) Sie beschreiben einen Punkt (ein Array-Element) im zwei-dimensionalen Array. C/C++ hat kein Maximum fuer Dimensionen;-) (Das ii sollte ein enzelnes i sein, das wird aber als BBCode interpretiert:-(
  • Die NeoPixel Bibliothek buffert alle Aenderungen und aktiviert sie erst mit strip.show() .


Ich hoffe, das macht es etwas verstaendlicher;-)
 
Zuletzt bearbeitet:
Beim ersten Lesen erscheint alles logisch. Ich werde mir heute Abend dein Code nochmal genau ansehen und daraus lernen!
Danke schonmal für deine Mühe!
 
Ich bin hier in Kalifornien. Bei mir ist es noch gestern;-) (Neun Stunden hinter Deutschland) Meine Antworten werden meistens zu unmoeglichen Zeiten kommen;-)
Viel Spass mit deinem Projekt.
 
Ich habs kapiert!!!!

Ich habe den Code nochmals auf meinen Streifen und mein Layout angepasst. Ich konnte leider noch nicht testen - das klappt Coronabedingt erst in der nächsten Woche - hier sind alle Baumärkte geschlossen und Materialbeschaffunng ist nicht ganz so leicht!

Code:
#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));
}

Je 2 LEDs beleuchten einen Buchstaben, durch das Array kann ich die Worte nun auch ganz einfach verschachteln ZWeinSIEBEN (zwei, eins, sieben).
Im Anhang habe ich mal die Skizze der Anordnung der Buchstaben und LEDs hinterlegt. Hoffentlich kann man das so lesen.

Der nächste Schritt wird ein Effekt zum überblenden der Uhrzeit. Deshalb haben auch die nicht verwendeten Buchstaben der Wortuhr ein Paar LEDs abbekommen.

Danke nochmal für Deine Hilfe!
 

Anhänge

  • IMG_20210206_004835.jpg
    IMG_20210206_004835.jpg
    3,4 MB · Aufrufe: 12
Ein kleiner Kommentar;-) Ich weiss nicht, was du als Basis fuer die LED Anordnung benutzen willst. Wenn es einer von den verschiedenen NeoPixel strips ist, dann ist es vielleicht besser, die Pixel in einem zigzag anzuordnen 'runter - hoch - runter - ...', das macht die Verbindungskabel kuerzer und einfacher zu managen;-)
 
Oben