delay durch millis ersetzen

Hallo

arbeite mit Mega 2560

meine Übungsaufgabe ist eine LED mit der Fernbedienung Taste 1 ein und solange hell zu bleiben bis Taste 1 gedrückt wird zum abzuschalten (funktioniert)

der fade Effekt bei an bzw. aus mit delay funktioniert.

Der fade Effekt bei an bzw. aus mit Millis funktioniert nur wenn er permanent alleine im Loop lauft,
nicht jedoch so wie im Sketsch Geschieben.

Was mache ich falsch.

nächste Übungsaufgabe ist LED an mit fade Effekt und flacker Effekt ( flacker Effekt alleine schon geschafft jedoch nicht in kombinaton).
Ich will es Schaffen auch einmal Hilfe zu geben und nicht nur um Hilfe zu Bitten.

Danke im vorraus
mfg. Kapitano

const int  buttonPin = 9; //alt 12
int Hof =  45;          // LED 7
int EG =   12;          // LED 1~ alt 11;
int EG1 =  11;          // LED 2~ alt 10;
int FEU =   6;          // LED 3~ alt 9;
int DG =    5;          // LED 4~
int DG1 =   3;          // LED 5
int ST =    2;          // LED 6~
int ST1 =  44;          // LED 8~

int itsONled[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
//                0, 1, 2, 3, 4, 5, 6, 7, 8
//int ledPins[] =    {12, 11, 6, 5, 3, 2, 45, 44}; //array with all the LED's pins
//int i = 0; //LED index for the arrays

//--- IR-Receiver: ----------------------------------------------------------------
#include <IRremote.h>
int RECV_PIN = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long result = results.value;


//IR Fernbedienugsmanegment-----------------------------------------
#define Taste1       16724175 // code received from button 1
#define Taste2       16718055 // code received from button 2

//--- Fade: -----------------------------------------------------------------
const unsigned int fadeAmount = 5;    // how many points to fade the LED by
int fadeValue;

//--- Millis: ---------------------------------------------------------------------
const unsigned int loopTime = 30;
long previousMillis;

void setup() {
pinMode(EG, OUTPUT);
pinMode(EG1, OUTPUT);
pinMode(FEU, OUTPUT);
pinMode(DG, OUTPUT);
pinMode(DG1, OUTPUT);
pinMode(ST, OUTPUT);
pinMode(ST1, OUTPUT);
pinMode(Hof, OUTPUT);

pinMode(buttonPin, INPUT);

Serial.begin(9600);
irrecv.enableIRIn(); // Startet den IR-Receiver.
}

void loop() {
FB();
}
//### diese variante funktioniert NICHT was ist falsch ################
void prEG() {
if (itsONled[1] == 1) {
if ((millis() - previousMillis + loopTime)) {
fadeValue -= fadeAmount;
analogWrite(EG, fadeValue);
previousMillis = millis();
}
itsONled[1] = 0;
} else {
fadeValue += fadeAmount;
analogWrite(EG, fadeValue);
previousMillis = millis();
}
itsONled[1] = 1;
}

//### diese variante funktioniert ################
void prEG1() {
if (itsONled[2] == 1) {
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
analogWrite(EG1, fadeValue);
delay(30);
}
itsONled[2] = 0;
} else {
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
analogWrite(EG1, fadeValue);
delay(30);
}
itsONled[2] = 1;
}
}

//##### Fernbedienung #####
void FB() {
if (irrecv.decode(&results)) {
unsigned long result = results.value;
Serial.println(result);

irrecv.resume(); // Receive the next value


//---Fernbedienung Tastenbelegung--------------------------------------------------------------
switch (result) {
break;
case Taste1:
Serial.println("Taste 1 getrueckt");
prEG();
break;
case Taste2:
Serial.println("Taste 2 getrueckt");
prEG1();
break;
}  //#### switch (result) Ende #####
}  //#### if irrecv Ende #####
}//#### void FB Ende #####

Ups.

 if ((millis() - previousMillis + loopTime)) {

Meintest du vielleicht

 if (millis() - previousMillis >= loopTime) {

?

schon alle rechen varianten probiert LED wird nur ganz minimal hell

bsp. 1000-1000+30=30
oder verrenne ich mich da in einen Logik Fehler ?

Na dann.

Wenn du schon alles versucht hast, brauche ich dir keine Vorschläge machen.

Kapitano:
Ich will es Schaffen auch einmal Hilfe zu geben und nicht nur um Hilfe zu Bitten.

Dann solltest du lernen, Code-Tags zu verwenden. :wink:

Verwende die Schaltfläche </> oder vor den Sketch [code] und hinter den Sketch [/code] setzen, aber ohne den Stern*.

So kann man den Sketch nicht lesen.

Du schaffst es.

Whandall:
Na dann.

Wenn du schon alles versucht hast, brauche ich dir keine Vorschläge machen.

Entschuldigung das wurde falsch verstanden (alles versucht nach meinen Minimum Wissensstand) und der ist noch in den Kinderschuhen.
deswegen die mir sebstgestellten Übungsaufgaben zum lernen.
nochmals Entschuldigung für meine falsche Antwort

HotSystems:
Dann solltest du lernen, Code-Tags zu verwenden. :wink:

Verwende die Schaltfläche </> oder vor den Sketch [code] und hinter den Sketch [/code] setzen, aber ohne den Stern*.

So kann man den Sketch nicht lesen.

Du schaffst es.

sorry da ist vorher was schiefgelaufen

hi,

wie schon gesagt wurde:

if ((millis() - previousMillis + loopTime)) {

in ein if mußt Du einen vergleich packen, der fehlt hier. Du berechnest eine zahl und vergleichst die dann mit nix.

gru´ß stefan

Eisebaer:
hi,

wie schon gesagt wurde:

if ((millis() - previousMillis + loopTime)) {

in ein if mußt Du einen vergleich packen, der fehlt hier. Du berechnest eine zahl und vergleichst die dann mit nix.

gru´ß stefan

Hallo Stefan
ok hab's jetzt auch gesehen das kommt von der herumkopierei zuviele klammern und vergleich mit nix (hab's verstanden)
aber noch mal von vorne das ich's kapier:
ich brauche pausen von 30 ms

bsp. (millis) 1000 - (previousMillis) 1000 = 0, ( 0 vergleiche mit ob grösser ist loopTime ) 0 ist nicht größer als 30 dann mache die 30 ms pausen.

verstehe ist das richt so ?
mfg.Kapitano

if (millis() - previousMillis >= loopTime) {

Manchmal hilft es auch Antworten zu lesen.

Kapitano:
verstehe ist das richt so ?

if (millis() - previousMillis >= loopTime) {

[Sarkasmus]Nein, das hatte ich dir nur geschrieben um dich zu verwirren.[/Sarkasmus]

Kapitano:
0 ist nicht größer als 30 dann mache die 30 ms pausen.

Eine Pause wird nicht gemacht. Es wird abgefragt ob was zu tun ist oder nicht. Wenn ja macht man was. Wenn nicht läuft loop() durch wo man anderen Dinge tun kann.

Whandall:
Manchmal hilft es auch Antworten zu lesen.
[Sarkasmus]Nein, das hatte ich dir nur geschrieben um dich zu verwirren.[/Sarkasmus]

Hallo
ich weis nicht was du damit meinst "Manchmal hilft es auch Antworten zu lesen" weil ich lese die Antworten sehr wohl weil sonst würde ich ja nicht im Forum um Hilfe zu bitten.

bitte dich jedoch höflich das unter #8 geschriebene zu kommentieren.

Danke im voraus.
mfg.Kapitano

if (millis() - previousMillis >= loopTime) {

er meint "aufmerksam" lesen :slight_smile:

Du mußt previousmillis (sind praktisch fast nie 0) von millis (auch fast nie null und vor allem meist ungleich previousmillis) abziehen und das ergebnis mit looptime vergleichen. das kätzchen hat deshalb >= geschrieben.

gruß stefan

vorerst Danke an Alle
jetzt habe ich das mit dem Code geändert

if (millis() - previousMillis >= loopTime)

LED schaltet nur auf min hell und aus
beim 2. betätigen der Taste 1 LED voll hell und danach geht nix mehr

mfg.Kapitano

const int  buttonPin = 9; //alt 12
int Hof =  45;          // LED 7
int EG =   12;          // LED 1~ alt 11;
int EG1 =  11;          // LED 2~ alt 10;
int FEU =   6;          // LED 3~ alt 9;
int DG =    5;          // LED 4~
int DG1 =   3;          // LED 5
int ST =    2;          // LED 6~
int ST1 =  44;          // LED 8~

int itsONled[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
//                0, 1, 2, 3, 4, 5, 6, 7, 8
//int ledPins[] =    {12, 11, 6, 5, 3, 2, 45, 44}; //array with all the LED's pins
//int i = 0; //LED index for the arrays

//--- IR-Receiver: ----------------------------------------------------------------
#include <IRremote.h>
int RECV_PIN = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long result = results.value;


//IR Fernbedienugsmanegment-----------------------------------------
#define Taste1       16724175 // code received from button 1
#define Taste2       16718055 // code received from button 2

//--- Fade: -----------------------------------------------------------------
const unsigned int fadeAmount = 5;    // how many points to fade the LED by
int fadeValue;

//--- Millis: ---------------------------------------------------------------------
const unsigned int loopTime = 30;
long previousMillis;

void setup() {
  pinMode(EG, OUTPUT);
  pinMode(EG1, OUTPUT);
  pinMode(FEU, OUTPUT);
  pinMode(DG, OUTPUT);
  pinMode(DG1, OUTPUT);
  pinMode(ST, OUTPUT);
  pinMode(ST1, OUTPUT);
  pinMode(Hof, OUTPUT);

  pinMode(buttonPin, INPUT);

  Serial.begin(9600);
  irrecv.enableIRIn(); // Startet den IR-Receiver.
}

void loop() {
  FB();
}
//### diese variante funktioniert NICHT was ist falsch ################
void prEG() {
  if (itsONled[1] == 1) {
    if (millis() - previousMillis >= loopTime) {
      fadeValue -= fadeAmount;
      analogWrite(EG, fadeValue);
      previousMillis = millis();
    }
    itsONled[1] = 0;
  } else {
    fadeValue += fadeAmount;
    analogWrite(EG, fadeValue);
    previousMillis = millis();
  }
  itsONled[1] = 1;
}

//### diese variante funktioniert ################
void prEG1() {
  if (itsONled[2] == 1) {
    for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
      analogWrite(EG1, fadeValue);
      delay(30);
    }
    itsONled[2] = 0;
  } else {
    for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
      analogWrite(EG1, fadeValue);
      delay(30);
    }
    itsONled[2] = 1;
  }
}

//##### Fernbedienung #####
void FB() {
  if (irrecv.decode(&results)) {
    unsigned long result = results.value;
    Serial.println(result);

    irrecv.resume(); // Receive the next value


    //---Fernbedienung Tastenbelegung--------------------------------------------------------------
    switch (result) {
        break;
      case Taste1:
        Serial.println("Taste 1 getrueckt");
        prEG();
        break;
      case Taste2:
        Serial.println("Taste 2 getrueckt");
        prEG1();
        break;
    }  //#### switch (result) Ende #####
  }  //#### if irrecv Ende #####
}//#### void FB Ende #####

Mein Mantra: delay() wird nicht durch millis() ersetzt!

Es wird ein einzelner lang laufender loop - Durchlauf ( "der Programm-Ablauf" )
durch unendlich viele, dafür keine Zeit dauernden loop-Durchläufe ersetzt.

In jedem dieser Durchläufe wird nur geprüft, ob was zu tun ist (meist nein), nur ab und zu ein neuer Zustand eingestellt oder eine andere Kleinigkeit.

Diese Zustände (u.a. das berühmte previousMillis) muss man sich natürlich von einem Durchlauf zum nächsten merken, und das Problem ist oft, genau zu definieren, was die jeweiligen Zustände bedeuten.

void prEG() {  // kommt millionenmal dran
  if (itsONled[1] == 1) {
    if (millis() - previousMillis >= loopTime) {
       // kommt alle 30 ms dran
       fadeValue -= fadeAmount;   // alle 30 ms einmal um ein bisschen verkleinern
      analogWrite(EG, fadeValue);
      previousMillis = millis();
    }
    itsONled[1] = 0;  // was soll das hier ?
  } else {
    fadeValue += fadeAmount;
    analogWrite(EG, fadeValue);
    previousMillis = millis();
  }
  itsONled[1] = 1;
}

Du musst auswerten, wie weitfadeValue(eine andere wichtige Zustandsvariable) ist.

michael_x:
Mein Mantra: delay() wird nicht durch millis() ersetzt!

void prEG() {  // kommt millionenmal dran

itsONled[1] = 0;  // was soll das hier ?

Setzt den Status der Led EG auf 0 damit die Fernbedienung beim zweiten drücken der Taste 1 die Led ausschaltet

void prEG() {  // kommt millionenmal dran

    itsONled[1] = 0;  // was soll das hier ?

so bei hell fade ?

if (fadeValue > 255) {
          fadeValue = 255;
          
        }
void prEG() {  // kommt millionenmal dran
  if (itsONled[1] == 1) {
    // evtl. runter dimmen
    itsONled[1] = 0;  
  } else {
     // evtl. hoch dimmen  ( bei dir übrigens unverzögert )
     itsONled[1]= 1;
  }
}

... und wie oft wechselt itsONled[1] seinen Zustand pro millisekunde ?

damit die Fernbedienung beim zweiten drücken der Taste 1 die Led ausschaltet

...brauchst du einen anderen Zustandsmerker, bzw. darfst ihn nicht hier und schon gar nicht so oft hin und her schalten.

michael_x:

void prEG() {  // kommt millionenmal dran

if (itsONled[1] == 1) {
   // evtl. runter dimmen
   itsONled[1] = 0;  
 } else {
    // evtl. hoch dimmen  ( bei dir übrigens unverzögert )
    itsONled[1]= 1;
 }
}



... und wie oft wechselt itsONled[1] seinen Zustand pro millisekunde ? ...brauchst du einen anderen Zustandsmerker, bzw. darfst ihn nicht hier und schon gar nicht so oft hin und her schalten.

Hallo Michael

der Standartwert von itsONled[1] (= EG) = 0 led ist aus nach drücken der Taste 1 wird led hochgedimmt und itsONled[1] (= EG) der wert 1 zugewiesen.
nach wiederum drücken der Taste 1 wird led niedergedimmt
und itsONled[1] (= EG) der wert 0 zugewiesen.

mit nachfolgenden Code funktioniert es super sowie andere Cod’s (aber auch nur durch deine Infos :slight_smile: )
sinn der ganzen Geschichte ist dazuzulernen und das “delay(30)” zu vermeiden da beim durchforsten des internts immer wieder gelesen habe delay zu vermeiden.

Das ganze Projekt lauft in einem Modellhaus mit Schuppen und Gartenanlage M 1:14 mit einem Standartprogramm.
Party, Romantik, Kerzenschein, Lagerfeuer usw. die wiederum mittels Fernbedienung dazu bzw aus geschalten werden.
Jeder Sketch allein laufen ja schon nicht schlecht jedoch beim zusammenfügen der Sketche in einem Sketch kommen halt die kleinen problemchen (am meisten dort wo delays sind) weil das eine oft das andere blockiert speziell bei Effekte der LEDs.
oder bin ich auch schon negativ Virus des delays angesteckt ?
mfg.Kapitano

void prEG1() {
  if (itsONled[2] == 1) {
    for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
      analogWrite(EG1, fadeValue);
      delay(30);
    }
    itsONled[2] = 0;
  } else {
    for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
      analogWrite(EG1, fadeValue);
      delay(30);
    }
    itsONled[2] = 1;
  }
}

Wenn du millis() in Funktionen verwendest ist das Prinzip gleich. Wenn die Zeit abgelaufen ist machst du was. Wenn nicht verlässt du die Funktion sofort wieder.

Na Super dann hab ich mich Heute mit meiner blöden Fragerei wieder schön palmiert.
aber nichts desto Trotz
ein Herzliches DANKE an alle.

mfg.Kapitano