Problem mit LED-Lauflicht

Hallo zusammen, ich habe ein Problem mit den WS2812B LED-Stripe. Mein Vorhaben war es, eine kleine WortUhr zu bauen und zu Programmieren. Allerdings scheint etwas mit dem Programm nicht zu passen. Wenn ich es auf meinen ESP8266 hochlade, funktioniert alles wie es soll, bis auf die erste LED des Stripes, die dauerhaft Leuchtet (meistens in grün oder blau). Mit Beispiel Code von der FastLED libary, die ich verwende scheint es keine Probleme zu geben. Ich habe ein 1000uF Elko, ein 470 Ohm Widerstand, ein 3,3V zu 5V Shifter und ein ausreichen starkes Netzteil verbaut. Somit sollten Hardware technische Probleme eigentlich ausgeschlossen sein. Wäre Cool wenn mir jemand sagen könnte an was das liegt oder was ich verbessern müsste. (Code ist dabei)

Danke im voraus.

#include <ESP8266WiFi.h>
// #include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>
#include <FastLED.h>
#include <time.h>
#include <WiFiManager.h>

#define MY_NTP_SERVER "at.pool.ntp.org"
#define MY_TZ "CET-1CEST,M3.5.0/02,M10.5.0/03"

#define NUM_LEDS 200
#define DATA_PIN 4
#define BRIGHTNESS  100
CRGB leds[NUM_LEDS];

int hours;
int minutes;

bool es;
bool ist;
bool viertel;
bool halb;
bool dreiviertel;
bool nach;
bool vor;
bool ein;
bool eins;
bool zwei;
bool drei;
bool vier;
bool fünf;
bool fünfvornach;
bool sechs;
bool sieben;
bool acht;
bool neun;
bool n;
bool zehn;
bool zehnvornach;
bool elf;
bool zwölf;
bool zwanzig;
bool uhr;

//RGB einstellungen
int rot = 180;
int blau = 180;
int grün = 180;

time_t now;
tm tm;

void setup() {
  delay(3000);
  configTime(MY_TZ, MY_NTP_SERVER);     //NTP Server

  Serial.begin(115200);

  //WiFi Manager start
  WiFi.mode(WIFI_STA);
  WiFiManager wm;
  bool res;
  res = wm.autoConnect("WortUhr", "12345678");
  if (!res) {
    Serial.println("Verbindung fehlgeschlagen");

  } else {
    Serial.println("Verbunden.....nice :)");
  }
  // WiFi Manager ende

  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();  // clear all pixel data
  FastLED.show();
}

void loop() {
  //NTP Zeit start
  time(&now);                       // read the current time
  localtime_r(&now, &tm);
  hours = tm.tm_hour;
  minutes = tm.tm_min;
  Serial.println((String)" (" + hours + ":" + minutes + ")");
  delay(1000);
  //NTP Zeit ende

  //UHR Programm
  zeitreset();
  //ES IST
  Serial.print("ES IST ");
  es = HIGH;
  ist = HIGH;



  //show minutes
  if (minutes >= 5 && minutes < 10)
  {
    //Fünf nach
    Serial.print("FÜNF NACH ");
    fünfvornach = HIGH;
    nach = HIGH;
  }
  else if (minutes >= 10 && minutes < 15)
  {
    //Zehn nach
    Serial.print("ZEHN NACH ");
    zehnvornach = HIGH;
    nach = HIGH;
  }
  else if (minutes >= 15 && minutes < 20)
  {
    //Viertel nach
    Serial.print("VIERTEL NACH ");
    viertel = HIGH;
    nach = HIGH;
  }
  else if (minutes >= 20 && minutes < 25)
  {

    //Zehn
    Serial.print("ZEHN VOR HALB ");
    zehnvornach = HIGH;
    vor = HIGH;
    halb = HIGH;

  }
  else if (minutes >= 25 && minutes < 30)
  {
    //Fünf
    Serial.print("FÜNF VOR HALB ");
    fünfvornach = HIGH;
    vor = HIGH;
    halb = HIGH;
  }
  else if (minutes >= 30 && minutes < 35)
  {
    //Halb
    Serial.print("HALB ");
    halb = HIGH;
  }
  else if (minutes >= 35 && minutes < 40)
  {
    //Fünf
    Serial.print("FÜNF NACH HALB ");
    fünfvornach = HIGH;
    nach = HIGH;
    halb = HIGH;
  }
  else if (minutes >= 40 && minutes < 45)
  {
    //Zehn
    Serial.print("ZEHN NACH HALB ");
    zehnvornach = HIGH;
    nach = HIGH;
    halb = HIGH;
  }
  else if (minutes >= 45 && minutes < 50)
  {
    //Viertel vor
    Serial.print("VIERTEL VOR ");
    viertel = HIGH;
    vor = HIGH;
  }
  else if (minutes >= 50 && minutes < 55)
  {
    //Zehn vor
    Serial.print("ZEHN VOR ");
    zehnvornach = HIGH;
    vor = HIGH;

  }
  else if (minutes >= 55 && minutes < 60)
  {

    //Fünf vor
    Serial.print("FÜNF VOR ");
    fünfvornach = HIGH;
    vor = HIGH;
  }



  //

  //convert hours to 12h format
  if (hours >= 12)
  {
    hours -= 12;
  }
  if (minutes >= 20)
  {
    hours++;
  }
  if (hours == 12)
  {
    hours = 0;
  }

  // show hours
  switch (hours)
  {
    case 0:
      //Zwölf
      Serial.print("ZWÖLF ");
      zwölf = HIGH;
      break;
    case 1:
      //EIN(S)
      Serial.print("EIN");
      ein = HIGH;
      if (minutes > 4) {
        eins = HIGH;
        Serial.print("S");
      }
      break;
    case 2:
      //Zwei
      Serial.print("ZWEI ");
      zwei = HIGH;
      break;
    case 3:
      //Drei
      Serial.print("DREI ");
      drei = HIGH;
      break;
    case 4:
      //Vier
      Serial.print("VIER ");
      vier = HIGH;
      break;
    case 5:
      //Fünf
      Serial.print("FÜNF ");
      fünf = HIGH;
      break;
    case 6:
      //Sechs
      Serial.print("SECHS ");
      sechs = HIGH;
      break;
    case 7:
      //Sieben
      Serial.print("SIEBEN ");
      sieben = HIGH;
      break;
    case 8:
      //Acht
      Serial.print("ACHT ");
      acht = HIGH;
      break;
    case 9:
      //Neun
      Serial.print("NEUN ");
      neun = HIGH;
      break;
    case 10:
      //Zehn
      Serial.print("ZEHN ");
      zehn = HIGH;
      break;
    case 11:
      //Elf
      Serial.print("ELF ");
      elf = HIGH;
      break;
  }
  if (minutes < 5)
  {
    //UHR
    Serial.print("UHR ");
    uhr = HIGH;
  }

  //Genaue Minuten Anzeige

  nicozahl(uhr, 0, 5);
  nicozahl(es, 180, 184);
  nicozahl(ist, 186, 191);
  nicozahl(dreiviertel, 140, 160);
  nicozahl(viertel, 147, 160);
  nicozahl(halb, 100, 107);
  nicozahl(nach, 120, 127);
  nicozahl(vor, 134, 140);
  nicozahl(eins, 93, 100);//erst eins auf LOW um das "ein" bei "ein"  HIGH zu setzen
  nicozahl(ein, 95, 100);
  nicozahl(zwei, 80, 87);
  nicozahl(drei, 60, 67);
  nicozahl(vier, 73, 80);
  nicozahl(fünfvornach, 193, 199);
  nicozahl(fünf, 112, 120);
  nicozahl(sechs, 50, 60);
  nicozahl(sieben, 20, 31);
  nicozahl(acht, 40, 47);
  nicozahl(zehn, 14, 20); //erst zehn auf LOW um das "n" bei "N"eun erneut HIGH zu setzen
  nicozahl(neun, 7, 13);
  nicozahl(n, 13, 14);
  nicozahl(zehnvornach, 172, 180);
  nicozahl(elf, 109, 114);
  nicozahl(zwölf, 30, 40);
  nicozahl(zwanzig, 160, 173);
  FastLED.show();
}

void nicozahl(bool wort, int startwert, int endwert ) {

  if (wort == HIGH) {
    Serial.println((String)wort + "+");
    for ( int i = startwert; i < endwert; i++) {
      leds[i] = CRGB(rot, grün , blau );
    }
  } else if (wort == LOW) {
    Serial.println((String)wort + "-");
    for ( int i = startwert; i < endwert; i++) {
      leds[i] = CRGB::Black;
    }
  }
}

void zeitreset () {
  viertel = LOW;
  halb = LOW;
  dreiviertel = LOW;
  nach = LOW;
  vor = LOW;
  ein = LOW;
  eins = LOW;
  zwei = LOW;
  drei = LOW;
  vier = LOW;
  fünf = LOW;
  fünfvornach = LOW;
  sechs = LOW;
  sieben = LOW;
  acht = LOW;
  zehn = LOW;
  neun = LOW;
  zehnvornach = LOW;
  elf = LOW;
  zwölf = LOW;
  zwanzig = LOW;
  uhr = LOW;

}

flagge deinen Post und melde einem Moderator, dass er den Beitrag ins deutsche Unterforum verschiebt (oder übersetze deinen Beitrag auf englisch).

LED 0 wird mindestens dadurch angesprochen:

wann rufst du das auf?

Habe ich schon gemacht!

Das wird jede Sekunde aufgerufen. Und je nach dem ob das Wort HIGH oder LOW ist wird es dann Weiß oder Schwarz. Und danke fürs Flaggen

Probiere mal ein Beispiel der FastLED.h Bibliothek aus, ob alle WS2812 richtig angesteuert werden. So eliminirst Du einen etwaigen HardwareFehler und wir können uns einer Fehlersuche im Sketch widmen.

Grüße Uwe

Hey Uwe, ich hab mal Pride2015 und Cylon ausprobiert. Funktioniert beides einwandfrei. Es wird dann wahrscheinlich was mit Software sein, denn sobald ich mein Wortuhr Programm hochlade, geht die erste LED unbeabsichtigt an.

bei einer schnellen Durchsicht des Sketches sehe ich auch hier die einzige Stelle, bei der die ersten 5 LEDs innerhalb der ersten 5 Minuten pro Stunde eingeschaltet werden und wohl das Wort "Uhr" anzeigen sollen.. Also dass sie sofort angehen scheint wohl richtig, wieso unbeabsichtigt? Welches Wort beleuchten denn die ersten LEDs?

Hey derGeppi, das mit dem anzeigen von "Uhr" funktioniert soweit. Allerdings leuchtet nur die erste LED 0 durchgehend und auch in Unterschiedlichen Farben. Obwohl ich diese doch aktiv ausschalte.

Wo, ich kann da nichts finden?

??? - Das möchte ich schon fast aussschliessen... Denn:

Und ich sehe nirgendwo einen tik mit ner Sekunde...

Wann wird diese Bedingung erfüllt?

Gibt es irgendwo einen Moment während des Durchlaufs, wo

mal LOW geht?

Da gibt es bestimmt noch einige Ungereimtheiten.

Naja ich ruf am Anfang des loops zeitreset() auf. Das setzt alle relevanten Variablen auf LOW
und wenn z.B. Minuten größer 5 ist, dann wird Uhr HIGH. Andernfalls bleibt es LOW. Am Ende vom loop übergebe ich der Methode nicozahl() das jeweilige Wort und die Start bis End LED des Wortes. Die Methode schaut sich den Wert des Worts an. Ist dieser LOW werden die LEDs auf Black gesetzt, andernfalls auf White.

Wie meinst du das mit dem delay?

Wann wird diese Bedingung erfüllt?

Wenn die Uhrzeit Zwölf Stunden beträgt, werden die auf 0 gesetzt, weil man mit der WortUhr ja nur im 12h Format anzeigen kann. Ist aber dann das gleiche, weil es im switch-case bei 0 trozdem "zwölf " auf HIGH setzt.

Nein die WortUhr zeigt immer Es ist ... an.
Bin mir auch ziemlich sicher, das irgendetwas noch nicht so ist, wie es sein soll.

Nein. Die Frage war, wann wird diese Bedingung erfüllt.
Antwort NIE.
Warum?

  //convert hours to 12h format
  if (hours >= 12)
  {
    hours -= 12;
  }

Und dann nochmal: Dein delay(1000) sorgt für alles. Nur nicht für das, das irgendwas im Sekundentakt geht.

Dann hab ich noch einen...

  if (wort == HIGH) {
    Serial.println((String)wort + "+");
    for ( int i = startwert; i < endwert; i++) {
      leds[i] = CRGB(rot, grün , blau );
    }
  } else if (wort == LOW) {

das zweite if ist unnötig.
Wenn das erste nicht erfüllt ist, ist das zweite IMMER erfüllt.

Ich kann jetzt nur keinen CodeReview machen - Aber ich würde das nochmal von ganz von vorn bauen und alles was unnötig ist (z.B. das wiederholte setzen von es und ist) nicht übernehmen.

So hier kommt jetzt gleich das ganz große Funkloch.

Man liest sich morgen.

Hey! Ich hab mal das was du geschrieben hast Umgesetzt. Ging danach Leider immer noch nicht. Dann hab ich mal eine andere libary getestet und siehe da mit "Adafruit_NeoPixel.h" funktioniert es jetzt soweit. Trotzdem danke für eure mithilfe!

Grüße :slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.