LEDs flackern bei Wechselblinker

Hallo zusammen,
in meinem Projekt ersetze ich bei einer LED-Lichterkette ( LED-Lichterkette) die kleine Solarzelle durch ein größeres Solarpanel mit Akku und schalte die Beleuchtung von 00:10 - 10:00 Uhr zeitgesteuert aus. Eingeschaltet wird die Beleuchtung bei Dunkelheit, gesteuert durch den LDR. Zum Einsatz kommt der ESP8266 mit WLAN-Anbindung. Die LEDs der Kette sind gegeneinander geschaltet, so dass in einer Richtung immer nur die Hälfte leuchtet. Für das schnelle Umschalten der Stromrichtung nutze ich einen Wechselblinker mit kurzen Pausen. Mit dem Auge wird die ständige Umschaltung aufgrund der Trägheit des Augenlichtes nicht wahrgenommen. Soweit funktioniert auch alles wie gewünscht, nur dass die LEDs der Kette unregelmäßig flackern. Nach stundenlanger Suche komme ich nicht weiter und wären für einen Tipp dankbar. Der beigefügte Sketch läuft ohne weitere Hardware nach Eingabe der eigenen WLAN-Daten und die beiden internen LEDs blinken sehr schnell. Vielleicht sieht jemand von euch auf Anhieb meinen Fehler im Sketch.
Die LED-Kette wird zur Demo hier nicht über den LDR eingeschaltet.
Vielen Dank für die Hilfe.

// 12.06.2023
// ESP8266, COM5
// Quellen:
// https://draeger-it.blog/esp8266-ntp-protokoll-fuer-das-lesen-eines-genauen-zeitstempels/
// https://www.childs.be/blog/post/how-to-connect-a-photoresistor-or-light-dependant-resistor-to-an-esp8266-12e
// LED D5 = Nachtruhe (00:10 - 10 Uhr)
// LED D7 = Leuchtdauer LEDs Gelb
// Leuchtdauer zum Test in Sekunden: 30
// LED D0 = LEDs Lichterkette
// LED D4 = LEDs Lichterkette

// Fehler: LEDs flackern!

// Bibliotheken
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

// Pausen mit millis
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
const long interval1 = 1000;
const long interval2 = 1000;

// Pins definieren
const int ledPinRight = 16;
const int ledPinLeft = 2;

static const uint8_t D5 = 14;  // D5 = Pin 14 (Kontroll-LED)
static const uint8_t D7 = 13;  // D7 = Pin 13 (Kontroll-LED)

// LDR
int sensorValue = 0;  // Variable für den Sensorwert mit 0 als Startwert

// SSID & Passwort des WLAN Netzwerkes eintragen
String ssid = "xxx";
String password = "xxx";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
char* wochentage[7] = { "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" };
////////////////////////////////////////////////////////
void setup() {
  // Beginn der seriellen Kommunikation
  Serial.begin(9600);

  // Aufbau der Verbindung zum WLAN Netzwerk
  Serial.print("Verbindung zu ");
  Serial.print(ssid);
  Serial.print(" wird aufgebaut.");
  WiFi.begin(ssid, password);
  // Solange keine Verbindung besteht einen Punkt ausgeben
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  /////////////////////////

  // Initialisieren des NTPClients um die Zeit auszulesen
  timeClient.begin();
  // Offset in Sekunden zur GMT +/- 0 Zeitzone
  // Für Deutschland muss man 1h = 3600 Sekunden nehmen,
  // Je nach Sommer- /Winterzeit muss noch zusätzlich eine 1h (also 3600 Sekunden)
  // auf diese Zeit addiert werden.
  timeClient.setTimeOffset(7200);

  // LEDs intern
  pinMode(ledPinLeft, OUTPUT);
  pinMode(ledPinRight, OUTPUT);

  // LEDs extern
  pinMode(D5, OUTPUT);  // Blau
  pinMode(D7, OUTPUT);  // Gelb
}
///////////////////////
void uhrzeit() {
  // Aktualisieren des Zeitstempels
  unsigned long currentMillis1 = millis();
  if (currentMillis1 - previousMillis1 >= interval1) {
    previousMillis1 = currentMillis1;
    timeClient.update();
    // Ausgabe des formatierten Zeitstempels
    String formattedTime = timeClient.getFormattedTime();
    Serial.print("Uhrzeit: ");
    Serial.println(formattedTime);

    // Einzelne Werte der Uhrzeit lesen
    int aktuellerTag = timeClient.getDay();
    int aktuelleStunde = timeClient.getHours();
    int aktuelleMinute = timeClient.getMinutes();
    int aktuelleSekunde = timeClient.getSeconds();

    // Nachtruhe um 00:10 Uhr ein
    //  if (aktuelleSekunde > 10 && aktuelleSekunde < 20) { // Test
    if (aktuelleStunde == 00 && aktuelleMinute == 10) {
      Serial.println("Nachtruhe Ein");
      digitalWrite(D5, HIGH);  // LED Blau
    }
    // Nachtruhe um 10 Uhr aus
    //  if (aktuelleSekunde > 30 && aktuelleSekunde < 40) { // Test
    if (aktuelleStunde == 10) {
      Serial.println("Nachtruhe Aus");
      digitalWrite(D5, LOW);
    }
  }
}
////////////////////
void ldr() {
  // LDR-Wert einlesen über analog Pin A0
  unsigned long currentMillis2 = millis();
  if (currentMillis2 - previousMillis2 >= interval2) {
    previousMillis2 = currentMillis2;
    int sensorValue = analogRead(A0);
    int ldr = digitalRead(D5);
    //  Serial.println(ldr);
    Serial.print("LDR-Wert: ");
    Serial.println(sensorValue);
    if (sensorValue < 512 && ldr == 0) {
      Serial.println("LEDs ein");
      digitalWrite(D7, HIGH);
    } else {
      Serial.println("LEDs aus");
      digitalWrite(D7, LOW);
    }
  }
}
/////////////////////////
void led() {
  // LEDs Gartenhaus einschalten
  digitalWrite(ledPinLeft, LOW);
  digitalWrite(ledPinRight, HIGH);
  delay(5);
  digitalWrite(ledPinLeft, HIGH);
  digitalWrite(ledPinRight, LOW);
  delay(5);
}
/////////////////////////
void loop() {
  uhrzeit();
  ldr();
  led();
}

Zumindest die angegebenen 30 mA sind für die Pins des ESP8266 deutlich zu viel.
Lt. Datenblatt sollten das nicht mehr wie 12 mA sein.
Bei längerem Betrieb überlebt der ESP8266 das nicht.

da kann ich mir nichts drunter vorstellen. Sind die Ketten eigentlich für Wechselstrom gedacht?!?

Im Sketch fällt mir nur auf, dass du eine externe NTP Library verwendest. Das braucht es seit mehreren Jahren nicht mehr am ESP. Das ist alles im Core vorgesehen - ink. Sommerzeit.

Siehe:

ESP8266 NTP Abfrage mit Sommerzeit / Winterzeit (NodeMCU, Wemos D1) (rothschopf.net)

Die bedenken bezüglich dem entnommenen Strom für die LED Kette teile ich. Das schaltet man normalerweie über Transistoren oder Mosfets. Das gibts auch fix und fertig mit ESP8266

noch mal ein externer Link auf meine Seite:
H801 PWM RGBW Wifi Dimmer - Programming the internal ESP8266 module (rothschopf.net)

Danke für den Hinweis. Ich hatte die Werte für den Uno im Gedächtnis. Werde dann zum Schalten MOSFETs benutzen.

Nein, für Gleichstrom. Ich habe das bemerkt, als ich sie an mein Labornetzgerät angeschlossen habe. Dann leuchtet nur jede zweite LED und wenn ich die Spannung umpole, leuchten die anderen LEDs.

Bei meiner Quelle war die Library genannt.

Ich werde nun alles umbauen und melde mich wieder. Vermutlich flackern die LEDs der Kette auch danach. Danke für die bisherigen Hinweise.

Und woran machst du das fest ?
Das Problem ist vermutlich der zu geringe Strom.

Du kannst die doch einfach direkt an Spannung testen.

Bei einer angeschlossenen LED fließen etwa 0,9 mA Strom.

Wenn ich die kleinen Pausen aus dieser Funktion entfernen, flackern die LEDs nur noch selten:

void led() {
  // LEDs Gartenhaus einschalten
  digitalWrite(ledPinLeft, LOW);
  digitalWrite(ledPinRight, HIGH);
//  delay(5);
  digitalWrite(ledPinLeft, HIGH);
  digitalWrite(ledPinRight, LOW);
//  delay(5);
}

Zum Steuern der LED-Kette bräuchte ich eine H-Bridge. Meine selbstgebaute Bridge mit Power-MOSFETs schaltet bei 3,3 V nicht durch. Mit einem Umweg über einen zusätzlichen Schalttransistor je Zweig geht es aber. Natürlich ist das ganze Überdimensioniert und ich suche daher eine kleine H-Bridge, welche mit den 3,3 V des ESP8266 durchschaltet. Habt ihr dazu eine Empfehlung?
Die Original-Steuerung mit winziger Solarzelle und kleinem Akku habe ich als Bild beigefügt. 

warum schaltest nicht einfach dieses Kästchen mit dem ESP ein und überlässt diesem die Generierung der Versorgungsspannung - irgendwas wird sich der Hersteller schon dabei gedacht haben...

Du brauchst keine H-Bridge. Vermutlich verwendest du falsche Mosfets.

Welche Led meinst du.
Dein Schaltbild sprach von 30 mA, da macht der Ausgangspin nicht mit.

DRV8838 könnte passen.

Das Kästchen enthält eine winzige Solarzelle, einen LDR, einen Akku 1,5 Volt und die Steuerung. Zum Betrieb müsste ich den Akku durch eine Stromversorgung von 1,5 Volt ersetzen. Der Solar-Regler liefert 12 Volt und 2x USB 5 Volt. Für das Geld steckt erstaunlich viel Technik drin und auf die gegeneinander geschalteten LEDs muss man erst mal kommen. Ein Mix mit vorhandener und neuer Technik gefällt mir nicht, weshalb ich das Ganze neu aufbaue.

Meine vorhandenen Power-MOSFETs schalten erst bei 5 Volt durch.

Die 0,9 mA Strom betraf die Kontroll-LED, welche ich angesteckt habe. Die LED-Kette benötigt etwa 30 mA. Deshalb die Überlegung mit einer H-Bridge.

Danke. Das schaue ich mir näher an. Kleine Transistoren gibt es bei Amazon oft nur in Großpackungen, was ich nicht brauche.

Ich melde mich wieder mit dem Ergebnis des nächsten Schrittes.
Vielen Dank für eure Tipps.

Der ESP arbeitet mit 3,3V

Ich sag ja, du verwendest die falschen Mosfets.

Daher auch das Flackern (meine Vermutung)

Und eine H-Bridge setzt man üblicherweise bei Motoren ein, die in beide Richtungen drehen sollen.

Ich weiß. Deswegen kann ich die MOSFETs nicht direkt mit dem ESP betreiben.

Damit alle LEDs leuchten, muss die Spannung ständig umgepolt werden. M. E. geht das mit einer H-Bridge.

Diese MOSFETs habe ich in meinem Magazin und sie schalten bei 3,3 Volt. Leider gibt es diese Version nur als N-Kanal:
N-Kanal-MOSFETs

Ok, dann macht die H-Bridge Sinn.

Wenn Du Arduino-PWM an DRV8838-PHASE anschließt, sollte das gehen. Probiert habe ich es aber noch nicht :wink:

Ich habe mich für diesen Artikel entschieden:
https://www.amazon.de/dp/B07YC1GFM3/ref=pe_27091401_487024491_TE_item
Kommt Morgen. Ich hoffe, es klappt damit und berichte später.
Den DRV8838 gibt es nicht ei Amazon und beim anderen Händler kommen noch Versandkosten dazu.

Das ist im Gegensatz zu MOSFET alte bipolare Technik mit relativ viel Wärmeentwicklung durch Spannungsabfall und Strom. Hat der auf das IC gelegte Finger eine Brandblase, war es eine schlechte Wahl. Nicht ohne Grund gibt es sowas auch mit Kühlkörper.

Anstelle Brandblase nutze ich IR-Thermometer :blush:

Rechnerisch fallen an der H-Bridge 150mW an Leistung an. Vermutlich wird sich das Teil nicht erwärmen, aber ich bin beim Anfassen vorsichtig :slight_smile:
Im Sommer werden die LEDs etwa 2-3 Stunden leuchten und im Winter bis zu 7 Stunden. Nach Mitternacht schaltet der ESP die LEDs ab, damit die Nachbarn nicht die ganze Nacht Licht im Garten sehen. Update zum Projekt folgt. Die komplette Schaltung mit Sketch stelle ich nach dem Probebetrieb hier ein.

Gut!

Wäre jetzt noch zu klären, wie Du beim ESP8266 gegenphasiges PWM mit der Hardware des µCs erzeugst. Meine Erwartung wäre, daß es dann nicht flackert.

Der DRV8838 hätte nur einen Ausgang benötigt.