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.
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
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.
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...
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.
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.
Rechnerisch fallen an der H-Bridge 150mW an Leistung an. Vermutlich wird sich das Teil nicht erwärmen, aber ich bin beim Anfassen vorsichtig
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.