WordClock - SK6812 - NeoPixel

Hallo zusammen

Ich verzweifle noch an meinem Code… Bin eher neu im ganzen Programmieren mit Arduino und co.
Nun habe ich einige WordClock Codes angeschaut und versuche diese nachzubauen um diese auch zu verstehen. Natürlich nun noch auf meine RGBW SK6812 LED abgestimmt. Da RGBW nicht mit FastLed geht bin ich nun mit NeoPixel weiter gekommen… soweit so gut.

Was mich aber zur Verzweiflung bringt ist das mein Code irgend wo einen Fehler hat oder dies einfach nicht so geht mit meinem Arduino Nano.

Im unteren Teil des Codes möchte ich die Buchstaben für die Stunden per Case ausgeben ( mit IF abfragen ists auch gescheitert).

Nun wenn ich aber bei egal welchem CASE das Array arrH9 ( oder 4-12) einsetze geht das ganze nicht mehr…
Wenn ich aber arrH1 / arrH2 oder arrH3 einsetze geht das ganze ohne Probleme…

Programm wird hochgeladen aber void Setup wird nicht durchlaufen da die LED’s sonst ablöschen sollten… → Die Uhr friert ein…

Kann mir hier irgend wer weiter helfen?

Gruss
Philipp

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

#define BRIGHTNESSDAY 255 // full on
#define BRIGHTNESSNIGHT 55 // half on
#define PIN 5
#define NUMPIXELS 114

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRBW + NEO_KHZ800);

uint32_t R, G, B, W = pixels.Color(0, 0, 0, 255);
uint32_t colorBlack = pixels.Color(0, 0, 0, 0);
uint32_t colorRed = pixels.Color(255, 0, 0, 0);
uint32_t colorGreen = pixels.Color(0, 255, 0, 0);
uint32_t colorBlue = pixels.Color(0, 0, 255, 0);
uint32_t colorJGreen = pixels.Color(50, 179, 30, 0);

int mm1 = 0;
int hh = 0;
int mm = 0;
int ss = 0;
int mm5erRest = 0;
int mm5er = 0;
int hhdisplay = 0;

int arrES[] = {10, 9, -1}; // ES
int arrISCH[] = {7, 6, 5, 4, -1}; // ISCH
int arrMIN1[] = {112, -1}; // Minute Oben Links
int arrMIN2[] = {112, 113, -1}; // Minute OBL + OBR
int arrMIN3[] = {112, 113, 110, -1}; // Minute OBL + OBR + UR
int arrMIN4[] = {112, 113, 110, 111, -1}; // Minute OBL + OBR + UR +UL
int arrFUF[] = {0, 1, 2, -1}; // Füf
int arrZAEAE[] = {19, 20, 21, -1}; // Zää
int arrVIERTU[] = {11, 12, 13, 14, 15, 16, -1}; // Viertu
int arrZWAENZG[] = {27, 28, 29, 30, 31, 32, -1}; // Zwänzg
int arrHAUBI[] = {36, 37, 38, 39, 40, -1}; // Haubi
int arrUHR[] = {107, 108, 109, -1}; // Uhr
int arrAB[] = {33, 34, -1}; // Ab
int arrVOR[] = {22, 23, 24, -1};
int arrH1[] = {52, 53, 54, -1};
int arrH2[] = {48, 49, 50, 51, -1};
int arrH3[] = {44, 45, 46, -1};
int arrH4[] = {56, 57, 58, 59, 60, -1};
int arrH5[] = {61, 62, 63, 64, -1};
int arrH6[] = {72, 73, 74, 75, 76, 77, -1};
int arrH7[] = {67, 68, 69, 70, 71, -1};
int arrH8[] = {78, 79, 80, 81, 82, -1};
int arrH9[] = {83, 84, 85, 86, -1};
int arrH10[] = {96, 97, 98, 99, -1};
int arrH11[] = {89, 90, 91, 92, -1};
int arrH12[] = {100, 101, 102, 103, 104, 105, -1};




void setup() {
  if (! rtc.begin()) {
    while (1);
  }
  if (rtc.lostPower()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
  pixels.setBrightness(BRIGHTNESSDAY);
  pixels.begin();
  delay(2000);
}
void loop() {
  DateTime now = rtc.now();
  hh = now.hour(), DEC;
  mm = now.minute(), DEC;
  ss = now.second(), DEC;
  int R = 255;
  int G = 0;
  int B = 0;
  int W = 0;
  if (mm != mm1 ) {
    pixels.clear();
    mm5erRest = mm % 5;
    mm5er = mm - mm5erRest;
    if (hh >= 13) {
      hhdisplay = hh - 12;
    }
    if (mm5erRest == 1) {
      // Oben Links
      paintWord(arrMIN1, R, G, B, W);
    }
    else if (mm5erRest == 2) {
      // Oben Links
      paintWord(arrMIN1, R, G, B, W);
      // Oben Rechts
      paintWord(arrMIN2, R, G, B, W);
    }
    else if (mm5erRest == 3) {
      paintWord(arrMIN1, R, G, B, W);
      // Oben Rechts
      paintWord(arrMIN2, R, G, B, W);
      // Unten Rechts
      paintWord(arrMIN3, R, G, B, W);
    }
    else if (mm5erRest == 4) {
      paintWord(arrMIN1, R, G, B, W);
      // Oben Rechts
      paintWord(arrMIN2, R, G, B, W);
      // Unten Rechts
      paintWord(arrMIN3, R, G, B, W);
      // Unten Links
      paintWord(arrMIN4, R, G, B, W);
    }
    if (mm5er == 5 || mm5er == 25 || mm5er == 35 || mm5er == 55) {
      //FÜF
      paintWord(arrFUF, R, G, B, W);
    }
    if (mm5er == 10 || mm5er == 50) {
      //ZÄÄ
      paintWord(arrZAEAE, R, G, B, W);
    }
    if (mm5er == 15 || mm5er == 45) {
      //VIERTU
      paintWord(arrVIERTU, R, G, B, W);
    }
    if (mm5er == 20 || mm5er == 40) {
      //ZWÄNZG
      paintWord(arrZWAENZG, R, G, B, W);
    }
    if (mm5er == 25 || mm5er == 30 || mm5er == 35) {
      //HAUBI
      paintWord(arrHAUBI, R, G, B, W);
    }
    //if (mm5er == 0) {
    //for (int i = 107; i <= 109; i++) {
    //UHR
    //paintWord(arrUHR, R, G, B, W);
    //}
    // }
    if (mm5er == 5 || mm5er == 10 || mm5er == 15 || mm5er == 20 || mm5er == 35) {
      //AB
      paintWord(arrAB, R, G, B, W);
    }
    if (mm5er == 25 || mm5er == 40 || mm5er == 45 || mm5er == 50 || mm5er == 55) {
      //VOR
      paintWord(arrVOR, R, G, B, W);
    }
    hhdisplay = hh;
    if (mm >= 25) {                                       // ab der 25 Minuten ist es immer "vor" der nächsetn Stunde
      if (hh == 0 || hh == 12) {                          // bei 12 Uhr vor "Ein" Uhr
        hhdisplay = 1;
      }
      else
        hhdisplay = hh + 1;
    }
    switch (hhdisplay) {
      case 1:
      case 13:
        paintWord(arrH1, R, G, B, W);
        break;
      case 2:
      case 14:
        paintWord(arrH2, R, G, B, W);
        break;
      case 3:
      case 15:
        paintWord(arrH3, R, G, B, W);
        break;
      case 4:
      case 16:
        paintWord(arrH4, R, G, B, W);
        break;
      case 5:
      case 17:
        paintWord(arrH5, R, G, B, W);
        break;
      case 6:
      case 18:
        paintWord(arrH6, R, G, B, W);
        break;
      case 7:
      case 19:
        paintWord(arrH7, R, G, B, W);
        break;
      case 8:
      case 20:
        paintWord(arrH8, R, G, B, W);
        break;
      case 9:
      case 21:
        paintWord(arrH9, R, G, B, W);
        break;
      case 10:
      case 22:
        paintWord(arrH10, R, G, B, W);
        break;
      case 11:
      case 23:
        paintWord(arrH11, R, G, B, W);
        break;
      case 0:
      case 12:
      case 24:
        paintWord(arrH12, R, G, B, W);
        break;

    }
    paintWord(arrES, R, G, B, W);
    paintWord(arrISCH, R, G, B, W);
  }
  mm1 = mm;
}
void paintWord(int arrWord[], int R, int G, int B, int W) {
  for (int i = 0; i < pixels.numPixels() + 1; i++) {
    if (arrWord[i] == -1) {
      pixels.show();
      break;
    } else {
      pixels.setPixelColor(arrWord[i], R, G, B, W);
    }
  }
}

while (1);

Das ist eine Endlos-Schleife.
Wenn beim Start die RTC nicht initialisiert werden kann, hängt sich der Arduino auf.

MfG

Danke für den Tip.

Leider ist der Fehler aber nicht bei dieser While schleife.. habe diese abgeändert.

Gruss
Philipp

Bei RGBW anstelle RGB hast Du ein Byte mehr je Lichtpunkt, also 114. Das könnte den Speicher überfordern.

uint32_t R, G, B, W = pixels.Color(0, 0, 0, 255);
...
  int R = 255;
  int G = 0;
  int B = 0;
  int W = 0;

Erst global, dann lokal in loop, der Sinn erschließt sich mir nicht.

void paintWord(int arrWord[], int R, int G, int B, int W)

Wenn R, G, B, W global sind, brauchst Du sie nicht an die Funktion zu übergeben.

Es könnte dir auch helfen auf gidhub nach der RGBW Libery von bracci zu suchen. Dort hat er eine funktionierende Firmware für ne Wordclock und euch eine RGBW Libery....

Gruß Joe

Danke für die Antworten:

@agmue
Das mit Lokal und Global habe ich so gemacht da es sonst nicht Funktioniert hatte... Werde dies noch mals Testen und die Lokalen int wegschmeissen...

Wegen dem RGBW Byt welches mehr ist währe komisch. In den Beispielen des NeoPixel sind einige sehr Komplexe dabei welche mit RGBW sehr zuverlässig laufen.

@Joe
Danke für den Tip.
Werde mir diesen einmal anschauen. Der Nächste schritt währe dann eh eine Wifi WordClock zu machen... aber ich fange lieber klein an :slight_smile:

Gruss
Philipp

Wenn ich alles ohne Schleife mache geht es… Gibt halt mehr Code aber es Funktioniert so…
Erster Teil geschaft

Gruss
Philipp

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

#define BRIGHTNESSDAY 255 // full on
#define BRIGHTNESSNIGHT 150 // half on
#define PIN 5
#define NUMPIXELS 114

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRBW + NEO_KHZ800);

int mm1 = 0;
int hh = 0;
int mm = 0;
int ss = 0;
int mm5erRest = 0;
int mm5er = 0;
int hhdisplay = 0;
int R = 0;
int G = 0;
int B = 0;
int W = 255;
int test = 0;

void setup() {
  pixels.setBrightness(BRIGHTNESSDAY);
  pixels.begin();
  pixels.clear();
  if (! rtc.begin()) {
    //Oben Links
    pixels.setPixelColor(112, 255, 0, 0, 0);
    // Oben Rechts
    pixels.setPixelColor(113, 255, 0, 0, 0);
    // Unten Rechts
    pixels.setPixelColor(110, 255, 0, 0, 0);
    // Unten Links
    pixels.setPixelColor(111, 255, 0, 0, 0);
  }
  if (rtc.lostPower()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    //Oben Links
    pixels.setPixelColor(112, 255, 0, 0, 0);
    // Oben Rechts
    pixels.setPixelColor(113, 0, 255, 0, 0);
    // Unten Rechts
    pixels.setPixelColor(110, 0, 0, 255, 0);
    // Unten Links
    pixels.setPixelColor(111, 0, 0, 0, 255);
  }
  pixels.show();
  delay(2000);
}
void loop() {
  DateTime now = rtc.now();
  hh = now.hour(), DEC;
  mm = now.minute(), DEC;
  ss = now.second(), DEC;
  if (mm != mm1 ) {
    if ((hh < 7) | (hh >= 19)) {
      pixels.setBrightness(BRIGHTNESSNIGHT);
    } else {
      pixels.setBrightness(BRIGHTNESSDAY);
    }

    mm5erRest = mm % 5;
    mm5er = mm - mm5erRest;
    if (hh >= 13) {
      hhdisplay = hh - 12;
    }
    if (mm5erRest == 0) {
      pixels.clear();
    }
    if (mm5erRest == 1) {
      //Oben Links
      pixels.setPixelColor(112, R, G, B, W);
    }
    else if (mm5erRest == 2) {
      //Oben Links
      pixels.setPixelColor(112, R, G, B, W);
      // Oben Rechts
      pixels.setPixelColor(113, R, G, B, W);
    }
    else if (mm5erRest == 3) {
      //Oben Links
      pixels.setPixelColor(112, R, G, B, W);
      // Oben Rechts
      pixels.setPixelColor(113, R, G, B, W);
      // Unten Rechts
      pixels.setPixelColor(110, R, G, B, W);
    }
    else if (mm5erRest == 4) {
      //Oben Links
      pixels.setPixelColor(112, R, G, B, W);
      // Oben Rechts
      pixels.setPixelColor(113, R, G, B, W);
      // Unten Rechts
      pixels.setPixelColor(110, R, G, B, W);
      // Unten Links
      pixels.setPixelColor(111, R, G, B, W);
    }
    if (mm5er == 5 || mm5er == 25 || mm5er == 35 || mm5er == 55) {
      //FÜF
      pixels.setPixelColor(0, R, G, B, W);
      pixels.setPixelColor(1, R, G, B, W);
      pixels.setPixelColor(2, R, G, B, W);
    }
    if (mm5er == 10 || mm5er == 50) {
      //ZÄÄ
      pixels.setPixelColor(19, R, G, B, W);
      pixels.setPixelColor(20, R, G, B, W);
      pixels.setPixelColor(21, R, G, B, W);
    }
    if (mm5er == 15 || mm5er == 45) {
      //VIERTU
      pixels.setPixelColor(11, R, G, B, W);
      pixels.setPixelColor(12, R, G, B, W);
      pixels.setPixelColor(13, R, G, B, W);
      pixels.setPixelColor(14, R, G, B, W);
      pixels.setPixelColor(15, R, G, B, W);
      pixels.setPixelColor(16, R, G, B, W);
    }
    if (mm5er == 20 || mm5er == 40) {
      //ZWÄNZG
      pixels.setPixelColor(27, R, G, B, W);
      pixels.setPixelColor(28, R, G, B, W);
      pixels.setPixelColor(29, R, G, B, W);
      pixels.setPixelColor(30, R, G, B, W);
      pixels.setPixelColor(31, R, G, B, W);
      pixels.setPixelColor(32, R, G, B, W);
    }
    if (mm5er == 25 || mm5er == 30 || mm5er == 35) {
      //HAUBI
      pixels.setPixelColor(36, R, G, B, W);
      pixels.setPixelColor(37, R, G, B, W);
      pixels.setPixelColor(38, R, G, B, W);
      pixels.setPixelColor(39, R, G, B, W);
      pixels.setPixelColor(40, R, G, B, W);
    }
    if (mm5er == 0) {
      //UHR
      pixels.setPixelColor(107, R, G, B, W);
      pixels.setPixelColor(108, R, G, B, W);
      pixels.setPixelColor(109, R, G, B, W);
    }
    if (mm5er == 5 || mm5er == 10 || mm5er == 15 || mm5er == 20 || mm5er == 35) {
      //AB
      pixels.setPixelColor(33, R, G, B, W);
      pixels.setPixelColor(34, R, G, B, W);
    }
    if (mm5er == 25 || mm5er == 40 || mm5er == 45 || mm5er == 50 || mm5er == 55) {
      //VOR
      pixels.setPixelColor(22, R, G, B, W);
      pixels.setPixelColor(23, R, G, B, W);
      pixels.setPixelColor(24, R, G, B, W);
    }
    hhdisplay = hh;
    if (mm >= 25) {                                       // ab der 25 Minuten ist es immer "vor" der nächsetn Stunde
      if (hh == 0 || hh == 12) {                          // bei 12 Uhr vor "Ein" Uhr
        hhdisplay = 1;
      }
      else
        hhdisplay = hh + 1;
    }

    switch (hhdisplay) {
      case 1:
      case 13:
        //EIS
        pixels.setPixelColor(52, R, G, B, W);
        pixels.setPixelColor(53, R, G, B, W);
        pixels.setPixelColor(54, R, G, B, W);
        break;
      case 2:
      case 14:
        //Zwöi
        pixels.setPixelColor(48, R, G, B, W);
        pixels.setPixelColor(49, R, G, B, W);
        pixels.setPixelColor(50, R, G, B, W);
        pixels.setPixelColor(51, R, G, B, W);
        break;
      case 3:
      case 15:
        pixels.setPixelColor(44, R, G, B, W);
        pixels.setPixelColor(45, R, G, B, W);
        pixels.setPixelColor(46, R, G, B, W);
        break;
      case 4:
      case 16:
        //Vieri
        pixels.setPixelColor(55, R, G, B, W);
        pixels.setPixelColor(56, R, G, B, W);
        pixels.setPixelColor(57, R, G, B, W);
        pixels.setPixelColor(58, R, G, B, W);
        pixels.setPixelColor(59, R, G, B, W);
        break;
      case 5:
      case 17:
        //Füfi
        pixels.setPixelColor(60, R, G, B, W);
        pixels.setPixelColor(61, R, G, B, W);
        pixels.setPixelColor(62, R, G, B, W);
        pixels.setPixelColor(63, R, G, B, W);
        break;
      case 6:
      case 18:
        //Sächsi
        pixels.setPixelColor(71, R, G, B, W);
        pixels.setPixelColor(72, R, G, B, W);
        pixels.setPixelColor(73, R, G, B, W);
        pixels.setPixelColor(74, R, G, B, W);
        pixels.setPixelColor(75, R, G, B, W);
        pixels.setPixelColor(76, R, G, B, W);
        break;
      case 7:
      case 19:
        //Sibni
        pixels.setPixelColor(66, R, G, B, W);
        pixels.setPixelColor(67, R, G, B, W);
        pixels.setPixelColor(68, R, G, B, W);
        pixels.setPixelColor(69, R, G, B, W);
        pixels.setPixelColor(70, R, G, B, W);
        break;
      case 8:
      case 20:
        //Achti
        pixels.setPixelColor(77, R, G, B, W);
        pixels.setPixelColor(78, R, G, B, W);
        pixels.setPixelColor(79, R, G, B, W);
        pixels.setPixelColor(80, R, G, B, W);
        pixels.setPixelColor(81, R, G, B, W);
        break;
      case 9:
      case 21:
        //Nüni
        pixels.setPixelColor(82, R, G, B, W);
        pixels.setPixelColor(83, R, G, B, W);
        pixels.setPixelColor(84, R, G, B, W);
        pixels.setPixelColor(85, R, G, B, W);
        break;
      case 10:
      case 22:
        //Zähni
        pixels.setPixelColor(95, R, G, B, W);
        pixels.setPixelColor(96, R, G, B, W);
        pixels.setPixelColor(97, R, G, B, W);
        pixels.setPixelColor(98, R, G, B, W);
        break;
      case 11:
      case 23:
        //Öufi
        pixels.setPixelColor(88, R, G, B, W);
        pixels.setPixelColor(89, R, G, B, W);
        pixels.setPixelColor(90, R, G, B, W);
        pixels.setPixelColor(91, R, G, B, W);
        break;
      case 0:
      case 12:
      case 24:
        //Zwöufi
        pixels.setPixelColor(99, R, G, B, W);
        pixels.setPixelColor(100, R, G, B, W);
        pixels.setPixelColor(101, R, G, B, W);
        pixels.setPixelColor(102, R, G, B, W);
        pixels.setPixelColor(103, R, G, B, W);
        pixels.setPixelColor(104, R, G, B, W);
        break;
    }
    //ES
    pixels.setPixelColor(9, R, G, B, W);
    pixels.setPixelColor(10, R, G, B, W);
    //ISCH
    pixels.setPixelColor(4, R, G, B, W);
    pixels.setPixelColor(5, R, G, B, W);
    pixels.setPixelColor(6, R, G, B, W);
    pixels.setPixelColor(7, R, G, B, W);

    pixels.show();
  }
  mm1 = mm;
 
}