Nabend
Eigentlich habe ich nicht gedacht, dass ich bei dieser Aufgabe ein
Problem bekommen werde.
Das Ganze ist die Steuerung für meine Aquarium Beleuchtung.
Mittels ESP, welcher eine KSQ mittels PWM ansteuert, welche die LED
betreiben.
Hier mal der Code:
Das Problem ist, dass wenn die Url: IP/ein/ aufgerufen wird, der Zähler
"brightness" nicht bei 1020 aufhört,
sondern weiterzählt.
Der Fall aus funktioniert hingegen.
Warum?
Danke für eure Hilfe
Kolja
Kolja L. schrieb:> brightness = brightness - fadeAmount;
Kann es sein, dass "brightness = brightness - fadeAmount;" den Wert 1020
nicht trifft (schreibe da besser >=, und dann ebenso <= 0 beim
Ausschalten).
Ansonsten würde ich noch vorschlagen, bei Programmieren gloabale
Variablen zu vermeiden - Code ist besser zu verstehen, wenn Funktionen
nur auf Variablen und Strukturen arbeiten, die im Funktionskopf
übergeben werden.
Sascha W. schrieb:> wie ist brightness und fadeAmount definiert?> Man schreibt bei so was lieber >=1020
Bloß nich, dann musste den gesamten Code, nach solchen Misst
durchsuchen.
Lieber den Gesamten Code Posten!
Oh, sorry zu früh abgeschnitten:
int brightness = 0;
int fadeAmount = 1;
int state = 3;
unsigned long currentTime;
unsigned long loopTime;
und doch, die 1020 werden getroffen:
100 1018
100 1019
100 1020
hell100 1021
100 1022
100 1023
100 1024
100 1025
Deshalb finde ich es ja so merkwürdig.
Sascha W. schrieb:> Man schreibt bei so was lieber >=1020
Sorry, hab erst jetzt gerafft was Du meintest.
Für Heute lass ich's lieber, find ja nich mal die Loop. Das Rattert für
mich einfach so durch :/
Sieht so aus als ob "server.handleClient()" den state, nachdem er von
"einschalten()" oder "ausschalten()" auf 3 gesetzt wurde sofort wieder
auf 0 oder 1 setzt.
dlchnr schrieb:> Ansonsten würde ich noch vorschlagen, bei Programmieren gloabale> Variablen zu vermeiden - Code ist besser zu verstehen, wenn Funktionen> nur auf Variablen und Strukturen arbeiten, die im Funktionskopf> übergeben werden.
Ja, da gebe ich dir Recht.
Für mich als Anfänger ist es so (leider) erstmal einfacher.
Und viel mehr Code wird es nicht.
Joe F. schrieb:> Sieht so aus als ob "server.handleClient()" den state, nachdem er von> "einschalten()" oder "ausschalten()" auf 3 gesetzt wurde sofort wieder> auf 0 oder 1 setzt.
Das würde zumindest das "Überzählen" erklären.
Wie könnte ich es anders machen?
Joe F. schrieb:> z.B. so:
Ähh, Dankeschön :-)
Der Code ist nur halb so lang,
funktioniert aber deutlich besser als mein Konstrukt.
Ich verstehe auch, was er (der Code) macht.
Soll jetzt nicht komisch klingen, aber so anspruchsvoll ist es ja auch
nicht.
Nur, warum komme ich nicht auf solche einfachen Lösungen?
Vielen Dank auf jeden Fall!
P.S.
Der Code ist ja auch so "flexibel" damit kann ich die Helligkeitswerte
auch dynamisch übergeben.
Also über die URL.
Das war auch mein ursprüngliches Vorhaben,
wovon ich aber, mangels Erfolg, Abstand genommen habe.
P.P.S.
Wie wäre denn der Ansatz (nicht die Lösung),
wenn ich die 4 LED nicht alle zeitgleich dimmen möchte?
Also erst 12 und 14 langsam hochfahren
und dann (auch wenn 12 und 14 noch nicht ganz an sind)
4 und 5 hochfahren.
Die LED-Reihen haben andere Lichtfarben,
12 und 14 sind warm und 4 und 5 kaltweiß.
4 Werte alleine reichen ja nicht.
Ein Szenario wäre z.B.:
4 langsam hochfahren (dauert 60s)
ab Sekunde 30 5 hochfahren (also noch während 4 hochfährt)
ab Sekunde 120 12 hochfahren
ab Sekunde 180 14 hochfahren
Kolja L. schrieb:> Wie wäre denn der Ansatz (nicht die Lösung),> wenn ich die 4 LED nicht alle zeitgleich dimmen möchte?
1
int brightness_set[4] = { 0, 0, 0, 0 };
2
int brightness[4] = { 1, 1, 1, 1 };
3
int i;
4
5
void loop()
6
{
7
server.handleClient();
8
9
currentTime = millis();
10
if (currentTime >= (loopTime + 10))
11
{
12
for (i=0; i<4; i++)
13
{
14
if (brightness_set[i] > brightness[i])
15
{
16
brightness[i]++;
17
update_brightness(i, brightness[i]);
18
}
19
else if (brightness_set[i] < brightness[i])
20
{
21
brightness[i]--;
22
update_brightness(i, brightness[i]);
23
}
24
}
25
loopTime = current_time;
26
}
27
}
28
29
void update_brightness(int led_nr, int b)
30
{
31
const int output_map[4] = {12, 14, 4, 5};
32
analogWrite(output_map[led_nr], b);
33
}
34
35
void set_led(int led_nr, int b)
36
{
37
brightness_set[led_nr] = b;
38
}
Statt state_ein() und state_aus() musst du es irgendwie schaffen
set_led() als Server Callback einzubinden, und zwar mit Parametern -
LED-Nummer (von 0 bis 3) und Helligkeit.
Wie man das macht weiss ich nicht, das wäre jetzt deine Aufgabe.
PS:
Kolja L. schrieb:> Nur, warum komme ich nicht auf solche einfachen Lösungen?
Aller Anfang ist schwer, man beisst sich buchstäblich die Zähne aus.
Wenn es dann irgendwann mal Klick gemacht hat - so nach dem 20. Mal -
wird es zur Fingerübung ;-)
Nicht aufgeben. Genau an solchen Projekten lernt man.