Finde den Fehler für's Timen nicht

Hallo

das timen geht nicht LED schaltet nur ein mit voller Leuchtkraft.
wenn ich den abschnitt extra im Sketch laufen lasse funktioniert super.

bitte um hilfe weil ich bin ratlos (und blutiger anfänger)
danke
Herbert

//  Infrarot-Steuerung
//  #include <IRremote.h>  <--  IRremote.h im libraries folder
//  #include "IRremote.h"  <--  IRremote.h im sketch folder

#include "IRremote.h"
// Pin mit Makierung 3, 5, 6, 9, 10, 11,
int RECV_PIN = 13;
int EG = 10;
int EG1 = 9;
int DG = 5;
int DG1 = 6;
int ST = 7;
int ST1 = 8;
int Frei = 3;
int Frei1 = 4;
//Zeitmanegment-----------------------------------------
int z = 2500; //=delay / Zeit bei Einschalten
int zz = 2500; //=delay / Zeit bei Ausschalten
//-----------------------------------------------------

IRrecv irrecv(RECV_PIN);
decode_results results;

//------------------------------------------------------
char programm = 'x';
//------------------------------------------------------
//int fb1 = 0; // 0 = Ein , 1= Aus
//Timen-------------------------------------------------
int fadeValue;
int lastCounter = 1;
int counter;
//------------------------------------------------------

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver

  pinMode(EG, OUTPUT);
  pinMode(EG1, OUTPUT);
  pinMode(DG, OUTPUT);
  pinMode(DG1, OUTPUT);
  pinMode(ST, OUTPUT);
  pinMode(ST1, OUTPUT);

}

//------------------------------------------------------

void loop() {
  infrarotWert();
  if (programm == 'e') Ende();
  if (programm == 'p') programmPlus();
  if (programm == 'e') programmMinus();
  if (programm == '0') programm0();
  if (programm == '1') programm1();
  if (programm == '2') programm2();
  if (programm == '4') programm4();
  if (programm == '5') programm5();
  if (programm == '6') programm6();
  if (programm == '8') programm8();
}

//------------------------------------------------------

void programm0() {

}
//------------------------------------------------------

void programm1() {
  //alles Ein---------------------------------------------------------------

  digitalWrite(EG, HIGH);
  delay(z);

  digitalWrite(EG1, HIGH);
  delay(z);

  digitalWrite(DG, HIGH);
  delay(z);

  digitalWrite(DG1, HIGH);
  delay(z);

  digitalWrite(DG, HIGH);
  delay(z);

  digitalWrite(ST, HIGH);
  delay(z);

  digitalWrite(ST1, HIGH);
  delay(z);

}
//------------------------------------------------------

void programm2() {

  { for (int helligkeit = 1; helligkeit <= 25; helligkeit = helligkeit + 1)

      analogWrite(EG, helligkeit);
    delay(100);
  }
  { for (int helligkeit = 1; helligkeit <= 25; helligkeit = helligkeit + 1)
      analogWrite(EG1, helligkeit);
    delay(100);
  }
}
//------------------------------------------------------

void programm3() {

}
//------------------------------------------------------

void programm4() {
}
//------------------------------------------------------

void programm5() {
}
//------------------------------------------------------

void programm6() {
  digitalWrite(DG, HIGH);
  delay(200);
  digitalWrite(EG, LOW);
  delay(200);
}
//------------------------------------------------------

void programm8() {
  if (millis() % 2000 == 0) {
    digitalWrite(DG1, HIGH);
  }
  if (millis() % 2000 == 1000) {
    digitalWrite(DG1, LOW);
  }
}
//------------------------------------------------------
void Ende() {
//alles Aus---------------------------------------------------------------
  digitalWrite(DG1, LOW);
  delay(zz);

  digitalWrite(DG, LOW);
  delay(zz);

  digitalWrite(EG1, LOW);
  delay(zz);

  digitalWrite(EG, LOW);
  delay(zz);

  digitalWrite(ST1, LOW);
  delay(zz);

  digitalWrite(ST, LOW);
  delay(zz);

}
//------------------------------------------------------
void programmPlus() {
//alles hell Timen-----------------------------------------------------------
  counter = lastCounter;
  counter ++;

  if (counter > 8) {     
    counter = 8;
  }

  if (counter < 2) {   
    counter = 1;
  }

  switch (counter) {   

    case 1:
      fadeValue = 0;
      break;

    case 2:
      fadeValue = 4;
      break;

    case 3:
      fadeValue = 8;
      break;

    case 4:
      fadeValue = 16;
      break;

    case 5:
      fadeValue = 32;
      break;

    case 6:
      fadeValue = 64;
      break;

    case 7:
      fadeValue = 128;
      break;

    case 8:
      fadeValue = 255;
      break;

  }
//###############################################################
  analogWrite(EG, fadeValue);    //set led with PWM value

//###############################################################
  lastCounter = counter;          //reset counter
}
//------------------------------------------------------
void programmMinus() {
//alles dunkel Timen-----------------------------------------------------------  
  counter = lastCounter;
  counter --;

  if (counter > 8) {     
    counter = 8;
  }

  if (counter < 2) {   
    counter = 1;
  }

  switch (counter) {   

    case 1:
      fadeValue = 0;
      break;

    case 2:
      fadeValue = 4;
      break;

    case 3:
      fadeValue = 8;
      break;

    case 4:
      fadeValue = 16;
      break;

    case 5:
      fadeValue = 32;
      break;

    case 6:
      fadeValue = 64;
      break;

    case 7:
      fadeValue = 128;
      break;

    case 8:
      fadeValue = 255;
      break;
  }
  //###############################################################
  analogWrite(EG, fadeValue);    //set led with PWM value

  //###############################################################
  lastCounter = counter;          //reset counter
}
//------------------------------------------------------

void infrarotWert() {
  if (irrecv.decode(&results)) {
    Serial.print("Code: ");
    Serial.print(results.value, DEC);
    if (results.value == 4294967295) programm = programm; else programm = '?';
    if (results.value == 16753245) programm = 'e';
    if (results.value == 16748655) programm = 'p';
    if (results.value == 16754775) programm = 'm';
    if (results.value == 16738455) programm = '0';
    if (results.value == 16724175) programm = '1';
    if (results.value == 16718055) programm = '2';
    if (results.value == 16743045) programm = '3';
    if (results.value == 16716015) programm = '4';
    if (results.value == 16726215) programm = '5';
    if (results.value == 16734885) programm = '6';
    if (results.value == 16728765) programm = '7';
    if (results.value == 16730805) programm = '8';
    if (results.value == 16732845) programm = '9';
    Serial.print(" --> Programm: ");
    Serial.println(programm);
    //  Receive the next value
    irrecv.resume();
  }
}

Dein Sketch ist ein wenig unübersichtlich, aber ich vermute in "void programm2" hast du zu viel von den Klammern "{".

Nicht zu viele, sondern falsch gesetzt. Die öffnende Klammer muss nach dem for Statement kommen. So umschließt der Block die drei Zeilen, aber nur die zweite gehört zur for-Schleife. Das delay() wird nur einmal gemacht

ich vermute mal hier sollte die fünfte Zeile

void loop() {
  infrarotWert();
  if (programm == 'e') Ende();
  if (programm == 'p') programmPlus();
  if (programm == 'e') programmMinus();
  if (programm == '0') programm0();
  if (programm == '1') programm1();
  if (programm == '2') programm2();
  if (programm == '4') programm4();
  if (programm == '5') programm5();
  if (programm == '6') programm6();
  if (programm == '8') programm8();
}
 if (programm == 'm') programmMinus();

lauten

Serenifly:
Nicht zu viele, sondern falsch gesetzt. Die öffnende Klammer muss nach dem for Statement kommen. So umschließt der Block die drei Zeilen, aber nur die zweite gehört zur for-Schleife. Das delay() wird nur einmal gemacht

Ja stimmt, hatte übersehen, das die hinter “for” fehlt.

HotSystems:
Dein Sketch ist ein wenig unübersichtlich, aber ich vermute in "void programm2" hast du zu viel von den Klammern "{".

"void programm2" Klammern "{" entfernt "void programm2" lauft gleich ok wie vorher.
das Problem liegt im " void programmPlus " und " void programmMinus " da leuchtet die LED nur volle pulle.

wegen der Übersichtlichkeit: ich hab erst vor einer Woche mit dieser Materie das erste mal begonnen aber ich bin
dankbar für tips wo man sich das anschauen kann wie man das richtig übersichtlich macht.

ardubu:
ich vermute mal hier sollte die fünfte Zeile

void loop() {

infrarotWert();
 if (programm == ‘e’) Ende();
 if (programm == ‘p’) programmPlus();
 if (programm == ‘e’) programmMinus();
 if (programm == ‘0’) programm0();
 if (programm == ‘1’) programm1();
 if (programm == ‘2’) programm2();
 if (programm == ‘4’) programm4();
 if (programm == ‘5’) programm5();
 if (programm == ‘6’) programm6();
 if (programm == ‘8’) programm8();
}





if (programm == ‘m’) programmMinus();



lauten

danke Super jetzt leuchtet die LED volle pulle kann sie ein und ausschalten aber timt noch nicht

Mal den falschen Code formatiert damit es vielleicht deutlicher wird:

void programm2() 
{

  { 
     for (int helligkeit = 1; helligkeit <= 25; helligkeit = helligkeit + 1)
        analogWrite(EG, helligkeit);
    
     delay(100);
  }
 
  { 
     for (int helligkeit = 1; helligkeit <= 25; helligkeit = helligkeit + 1)
        analogWrite(EG1, helligkeit);
    
     delay(100);
  }
}

Jetzt klarer wieso das nicht machst was du willst?

Abgesehen davon: willst du das wirklich von 1-25 in 1er Schritten laufen lassen? Normal macht man eher 0-255 in 5er oder vielleicht 10er Schritten.

Serenifly:
Mal den falschen Code formatiert damit es vielleicht deutlicher wird:

void programm2() 

{

{
    for (int helligkeit = 1; helligkeit <= 25; helligkeit = helligkeit + 1)
        analogWrite(EG, helligkeit);
   
    delay(100);
  }

{
    for (int helligkeit = 1; helligkeit <= 25; helligkeit = helligkeit + 1)
        analogWrite(EG1, helligkeit);
   
    delay(100);
  }
}




Jetzt klarer wieso das nicht machst was du willst?

Abgesehen davon: willst du das wirklich von 1-25 in 1er Schritten laufen lassen? Normal macht man eher 0-255 in 5er oder vielleicht 10er Schritten.

Bitte programm2 ist schon gelöscht das hab ich von irgendwo her kopiert.

das Problem liegt im " void programmPlus " und " void programmMinus " da leuchtet die LED nur volle pulle.

setze mal versuchsweise ein delay(500) hinter die zeile Counter++

Kapitano:
...wegen der Übersichtlichkeit: ich hab erst vor einer Woche mit dieser Materie das erste mal begonnen aber ich bin dankbar für tips wo man sich das anschauen kann wie man das richtig übersichtlich macht.

Übersichtlicher wird es, wenn du den Sketch vernünftig formatierst. Das geht in der IDE unter "Werkzeuge-Automatische Formatierung" oder "Strg+T". Und wenn du nicht so viele Dinge reinschreibst, die du noch nicht benötigst, z.B. leere Funktionen.

Und beachte bitte den Beitrag von Serenifly, er hat es berichtigt, die Klammer war nur falsch gesetzt.

Kapitano:
Bitte programm2 ist schon gelöscht das hab ich von irgendwo her kopiert.

das Problem liegt im " void programmPlus " und " void programmMinus " da leuchtet die LED nur volle pulle.

Das ist auch ein Problem der fehlenden Übersichtlichkeit.

Und nicht immer nur reinkopieren, wenn man nicht versteht , was man da macht.
Woher sollen wir dann wissen, was richtig und was falsch ist. :smiling_imp:

Ach ja, da wir gerade dabei sind, das was du meinst ist "Dimmen", nicht Timen. :wink:

ardubu:
setze mal versuchsweise ein delay(500) hinter die zeile Counter++

DAAAAAAAAAAAAAANKE Super das war’s jetzt funktionierts

HotSystems:
Das ist auch ein Problem der fehlenden Übersichtlichkeit.

Und nicht immer nur reinkopieren, wenn man nicht versteht , was man da macht.
Woher sollen wir dann wissen, was richtig und was falsch ist. :smiling_imp:

Leere Funktionen: werden noch befüllt.
sorry wegen dem was ich da reinkopiert habe aber irgendwie muss ich als Anfänger probieren was was ist und
was was macht.

weiters Entschuldigung an alle habe versehentlich meinen übungssketch hereingestellt und nicht das original
( das nicht weniger chaotisch aussieht. Anfänger seit einer Woche halt)

das Problem ist, dass deine Loop schätzungsweise 2ms für einen Durchlauf benötigt, und du von 1 bis 8 hochzählst, dass dauert dann ca 16ms, und dein Auge meint es wird direkt eingeschaltet.

Das delay solltest du aber durch millis ersetzen.

ardubu:
das Problem ist, dass deine Loop schätzungsweise 2ms für einen Durchlauf benötigt, und du von 1 bis 8 hochzählst, dass dauert dann ca 16ms, und dein Auge meint es wird direkt eingeschaltet.

Das delay solltest du aber durch millis ersetzen.

bitte hilf mir. millis() ist der befehl richtig so, und welchen wert soll ich einsetzen ( es werden 6bis 8 Standart weisse LED getimt)

schaue dir unter Beispiele/02Digital/BlinkWithoutDelay an

ardubu:
schaue dir unter Beispiele/02Digital/BlinkWithoutDelay an

Danke

oder du machst es so

counter = lastCounter;
  counter ++;

  if (counter > 4000)  counter = 4000;
  if (counter < 2)   counter = 1;
  
  static uint16_t counter1=counter/500;
  switch (counter1) {

( es werden 6bis 8 Standart weisse LED getimt)

ich hoffe du willst die nicht alle direkt an einem Pin des Arduino anschließen, dass könnte den Arduino zerstören.