INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
LED langsam über 15 Minuten dimmen
16.01.2017, 20:31 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2017 20:45 von Bitklopfer.)
Beitrag #1
LED langsam über 15 Minuten dimmen
Hallo zusammen! Ich bin neu, ein absoluter Anfänger, kann löten aber nicht programmieren und habe echte Schwierigkeiten es zu lernen ;-).

Also im Moment befasse ich mich mit millis statt delay und würde gerne mit for uns millis langsam eine LED faden. Doch wie soll das gehen?

Code:
void loop() {
  // fade in from min to max in increments of 5 points:
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 1) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    delay (50); // das würde ich gerne vermeiden
  }

  // fade out from max to min in increments of 5 points:
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 2) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(50);
  }
Tagg Tagg...lgbk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2017, 20:42 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2017 21:43 von Tommy56.)
Beitrag #2
RE: LED langsam über 15 Minuten dimmen
(16.01.2017 20:31)Kriskind schrieb:  Hallo zusammen! Ich bin neu, ein absoluter Anfänger, kann löten aber nicht programmieren und habe echte Schwierigkeiten es zu lernen ;-).

Also im Moment befasse ich mich mit millis statt delay und würde gerne mit for uns millis langsam eine LED faden. Doch wie soll das gehen?
Code:
void loop() {
  // fade in from min to max in increments of 5 points:
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 1) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    delay (50); // das würde ich gerne vermeiden
  }

  // fade out from max to min in increments of 5 points:
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 2) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(50);
  }
Du hast doch noch delay() drin.

Bitte setze Deinen Sketch in Codetags (oben # im Foreneditor oder [*code] davor und [*/code] dahinter - ohne die *).
Das kannst Du auch noch nachträglich durch Editieren tun. Bitte mach das, der Sketch ist besser zu lesen, besonders auf mobilen Geräten.

for (und while) sind genau so kontraproduktiv, wie delay, da sie den Prozessor für andere Aufgaben blockieren.
Du hast doch schon eine Schleife, in der alles wiederholt wird: loop()
Also merke Dir die millis der letzten Änderung und wenn
millis() -letzte_millis >= wartezeit, dann setze den fadeWert += delta und die letzte_millis auf aktuelle millis.
Bei Erreichen der Grenze den delta = -delta und da geht es in die andere Richtung.

Suche mal nach Blinkwithoutdelay und der Nachtwächtererklärung.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2017, 20:48 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2017 21:19 von Kriskind.)
Beitrag #3
RE: LED langsam über 15 Minuten dimmen
Okay, also hochdimmen klappt. Nur wie mache ich 2 aufrufbare Funktionen draus?

void hochdimmen
void runterdimmen z.B.

Habe auch Probleme ihm zu sagen, dass bei 255 Schluss ist und er 255 nach dem Hochdimmen halten soll.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2017, 21:16
Beitrag #4
RE: LED langsam über 15 Minuten dimmen
(16.01.2017 20:48)Kriskind schrieb:  gedacht habe ich mir das schon. Da diese Dimmerfunktion aber über for gelöst wurde, war ich verunsichert. Klar, also einfach millis vergleichen und Wert setzen. Das im normalen loop. Dann versuche ich das mal zu realisieren.

Kann ich das denn als eine Dimmerfunktion auslagern als void dimmer oder so, damit es übersichtlicher wird, wenn andere Funktionen dazu kommen?
Klar kannst Du das. Grundregel:

Prüfen am Anfang der Funktion, ob überhaupt was zu tun ist (millis). Wenn nicht, sofort wieder raus.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2017, 21:46 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2017 22:16 von Kriskind.)
Beitrag #5
RE: LED langsam über 15 Minuten dimmen
Zitat:Klar kannst Du das. Grundregel:

Prüfen am Anfang der Funktion, ob überhaupt was zu tun ist (millis). Wenn nicht, sofort wieder raus.

Gruß Tommy

Danke sehr Tommy,

direkt wieder raus geht von alleine, oder? Also er springt an den Punkt an dem er die loop verlassen hat, oder?

Und wie stoppe ich bei Wert 255?
Code:
void loop() {
  
unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= wartezeit){
    previousMillis = currentMillis;
      if (fadeWert != 255 && fadeWert < 10)
        fadeWert += 1;
      if (fadeWert != 255 && fadeWert >= 10)
        fadeWert += 5;
          analogWrite(ledPin, fadeWert);
        }
      }

Kann man das so machen? Klappt jedenfalls...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2017, 22:23
Beitrag #6
RE: LED langsam über 15 Minuten dimmen
(16.01.2017 21:46)Kriskind schrieb:  
Zitat:Klar kannst Du das. Grundregel:

Prüfen am Anfang der Funktion, ob überhaupt was zu tun ist (millis). Wenn nicht, sofort wieder raus.

Gruß Tommy

Danke sehr Tommy,

direkt wieder raus geht von alleine, oder? Also er springt an den Punkt an dem er die loop verlassen hat, oder?

Und wie stoppe ich bei Wert 255?
Code:
void loop() {
  
unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= wartezeit){
    previousMillis = currentMillis;
      if (fadeWert < 10)
        fadeWert += 1;
      if (fadeWert >=10)
        fadeWert += 10;
          analogWrite(ledPin, fadeWert);
  }
}
Ja, er macht direkt nach dem Funktionsaufruf weiter, wenn Du mit return raus gehst oder die Funktion zu Ende ist.

Entweder Du nimmst fadeWert als int, dann kannst Du >= 255 und <=0 gut detektieren und benutzt für die Ausgabe der Zwischnwerte nur das LOW-Byte (gibts ne Funktion zu)
oder Du musst schon vor dem Addieren / Subtrahieren prüfen, ob es die Grenze uber-/unterschreiten würde.
Ich würde Variante 1 vorziehen.
Code:
if (fadeValue >= 255) {
  fadeValue = 255;
  delta = -delta;
}
if (fadeValue <= 0) {
  fadeValue = 0;
  delta = -delta;
}
...
// Ausgabe
analogWrite(lowByte(fadeValue));
Nur als Anmerkung (ich weiß ja nicht, was es werden soll):

Hast Du schon mal darüber nachgedacht, dass das Helligkeitsempfinden des Auges nichtlinear ist? Im niederigen Bereich werden kleine Änderungen als groß empfunden, im oberen Bereich kaum noch.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2017, 18:51
Beitrag #7
RE: LED langsam über 15 Minuten dimmen
(16.01.2017 22:23)Tommy56 schrieb:  
(16.01.2017 21:46)Kriskind schrieb:  
Zitat:Klar kannst Du das. Grundregel:

Prüfen am Anfang der Funktion, ob überhaupt was zu tun ist (millis). Wenn nicht, sofort wieder raus.

Gruß Tommy

Danke sehr Tommy,

direkt wieder raus geht von alleine, oder? Also er springt an den Punkt an dem er die loop verlassen hat, oder?

Und wie stoppe ich bei Wert 255?
Code:
void loop() {
  
unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= wartezeit){
    previousMillis = currentMillis;
      if (fadeWert < 10)
        fadeWert += 1;
      if (fadeWert >=10)
        fadeWert += 10;
          analogWrite(ledPin, fadeWert);
  }
}
Ja, er macht direkt nach dem Funktionsaufruf weiter, wenn Du mit return raus gehst oder die Funktion zu Ende ist.

Entweder Du nimmst fadeWert als int, dann kannst Du >= 255 und <=0 gut detektieren und benutzt für die Ausgabe der Zwischnwerte nur das LOW-Byte (gibts ne Funktion zu)
oder Du musst schon vor dem Addieren / Subtrahieren prüfen, ob es die Grenze uber-/unterschreiten würde.
Ich würde Variante 1 vorziehen.
Code:
if (fadeValue >= 255) {
  fadeValue = 255;
  delta = -delta;
}
if (fadeValue <= 0) {
  fadeValue = 0;
  delta = -delta;
}
...
// Ausgabe
analogWrite(lowByte(fadeValue));
Nur als Anmerkung (ich weiß ja nicht, was es werden soll):

Hast Du schon mal darüber nachgedacht, dass das Helligkeitsempfinden des Auges nichtlinear ist? Im niederigen Bereich werden kleine Änderungen als groß empfunden, im oberen Bereich kaum noch.

Gruß Tommy

Oh, danke sehr Tommy, so weit bin ich wohl noch nicht. lowByte ??? delta? Und es wird doch nie größer als 255 sein und nie kleiner als 0, oder?

Das Auge habe ich berücksichtigt. Bis zu einem Wert von 10 fade ich in 1er Schritten, danach in 10er Schritten.

Ich möchte damit eine Leuchte schalten, die sich über einen langen Zeitraum (ca. 10-15 Min) eindimmt. Ein Ausdimmen soll erst nach Prüfung eines Außenlichtsensors erfolgen, wenn die Helligkeit draußen zunimmt. Also würde ich 2 Funktionen stricken. Einblenden und Ausblenden.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2017, 20:34
Beitrag #8
RE: LED langsam über 15 Minuten dimmen
(17.01.2017 18:51)Kriskind schrieb:  
(16.01.2017 22:23)Tommy56 schrieb:  
(16.01.2017 21:46)Kriskind schrieb:  
Zitat:Klar kannst Du das. Grundregel:

Prüfen am Anfang der Funktion, ob überhaupt was zu tun ist (millis). Wenn nicht, sofort wieder raus.

Gruß Tommy

Danke sehr Tommy,

direkt wieder raus geht von alleine, oder? Also er springt an den Punkt an dem er die loop verlassen hat, oder?

Und wie stoppe ich bei Wert 255?
Code:
void loop() {
  
unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= wartezeit){
    previousMillis = currentMillis;
      if (fadeWert < 10)
        fadeWert += 1;
      if (fadeWert >=10)
        fadeWert += 10;
          analogWrite(ledPin, fadeWert);
  }
}
Ja, er macht direkt nach dem Funktionsaufruf weiter, wenn Du mit return raus gehst oder die Funktion zu Ende ist.

Entweder Du nimmst fadeWert als int, dann kannst Du >= 255 und <=0 gut detektieren und benutzt für die Ausgabe der Zwischnwerte nur das LOW-Byte (gibts ne Funktion zu)
oder Du musst schon vor dem Addieren / Subtrahieren prüfen, ob es die Grenze uber-/unterschreiten würde.
Ich würde Variante 1 vorziehen.
Code:
if (fadeValue >= 255) {
  fadeValue = 255;
  delta = -delta;
}
if (fadeValue <= 0) {
  fadeValue = 0;
  delta = -delta;
}
...
// Ausgabe
analogWrite(lowByte(fadeValue));
Nur als Anmerkung (ich weiß ja nicht, was es werden soll):

Hast Du schon mal darüber nachgedacht, dass das Helligkeitsempfinden des Auges nichtlinear ist? Im niederigen Bereich werden kleine Änderungen als groß empfunden, im oberen Bereich kaum noch.

Gruß Tommy

Oh, danke sehr Tommy, so weit bin ich wohl noch nicht. lowByte ??? delta? Und es wird doch nie größer als 255 sein und nie kleiner als 0, oder?

Das Auge habe ich berücksichtigt. Bis zu einem Wert von 10 fade ich in 1er Schritten, danach in 10er Schritten.

Ich möchte damit eine Leuchte schalten, die sich über einen langen Zeitraum (ca. 10-15 Min) eindimmt. Ein Ausdimmen soll erst nach Prüfung eines Außenlichtsensors erfolgen, wenn die Helligkeit draußen zunimmt. Also würde ich 2 Funktionen stricken. Einblenden und Ausblenden.
Da Du mit verschiedenen Schrittweiten arbeitest, ist es einfacher, mit einer Steuervariable vom Typ int zu arbeiten, da die > 255 und <0 werden kann. Das kannst Du abfragen und Deine Grenzen entsprechend bearbeiten.
Das Delta ist einfach der Wert, den Du immer drauf addierst (bei Dir 1 und 10 bzw. -1 und -10).

Ja, bei Dir würden das dann zwei getrennte funktionen. Da brauchst Du das mit dem delta in der Form nicht.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Auto mit Kamera über Bluetooth gnagfloW 4 386 19.06.2020 08:23
Letzter Beitrag: gnagfloW
  Steuerung über Infrarot und Bluetooth SimonTau 4 468 20.05.2020 07:37
Letzter Beitrag: Corvus
  Lauftext mit WS2812, der über Seriellen Monitor eingegeben wird Bastian 3 382 12.05.2020 16:47
Letzter Beitrag: Tommy56
  Fehler bei delay über 32767 Kleingärtner 5 391 07.05.2020 18:51
Letzter Beitrag: Kleingärtner
  Aktion bei Wert über- oder unterschreiten Kleingärtner 18 883 05.05.2020 20:19
Letzter Beitrag: hotsystems
  Betätigung d. Sensors soll Steuerung abschalten und nur über Taster einschalten Floydi 12 736 26.04.2020 07:47
Letzter Beitrag: MicroBahner
  Waage über RS 232 / Serial auswerten 425t 9 753 31.03.2020 06:44
Letzter Beitrag: 425t
  Vorlage für Char Array über Serielle Schnittstelle Luis90 2 479 08.03.2020 18:05
Letzter Beitrag: hotsystems
  Spannungssensor über Tm1637 Display Boreallus 5 642 10.02.2020 17:17
Letzter Beitrag: hotsystems
  Statusabfrage über SoftwareSerial Scouter 6 593 07.02.2020 15:04
Letzter Beitrag: Scouter

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste