Go Down

Topic: LED blinken ungewollt (Read 245 times) previous topic - next topic

Nick789

Aug 07, 2017, 03:16 pm Last Edit: Aug 07, 2017, 03:22 pm by Nick789
Hallo Community,

ist jemand in der Lage den Fehler in meinem Code zu finden? Und zwar sollen die Leds langsam die Helligkeit erhöhen, anschließend 5 sek. leuchten, und anschließend langsam dunkel werden. Das ist mein erster Code, deswegen sehr unübersichtlich...

Das Problem ist, wenn ich die Helligkeit mit den Tasten absenke, auf einen Wert von ca. 1-10. Blinken die LEDs in dem Abschnitt, wo diese 5 sek. lang dauerhaft leuchtet sollen. Wenn ich die LEDs ohne den Hauptcode dimme, leuchtet diese konstant, wie es sein soll. (Also muss der Code fehlerhaft sein und nicht die Verdrahtung)


Code: [Select]
int led1 = 11;
int led2 = 10;
int led3 = 9;
int brightness = 0;
int brightness2 = 0;
int fadeAmount = 1;
int pirPin1 = 13;
int pirPin2 = 12;
int eingang = A0;
int sensorWert = 0;
int DimmZeit = 30;
const int tasterPin1 = 4;          // Pin Nummer des Tasters
const int tasterPin2 = 5;
const int tasterPin3 = 3;
int Hell = 1;
int Hell2 = 1;
long dauer = 2000;
int sprung = 1000;
int start = 0;
int sStop = 0;
long counter = 0;
long counter2 = 0;
long counter3 = 0;
long counter4 = 0;
int mode = 0;
int count = 0;
int count2 = 0;
int count3 = dauer;
int i=0;

void setup() {
  pinMode(led1, OUTPUT); // 8 Aus-/ Eingänge notwendig
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(pirPin1, INPUT);
  pinMode(pirPin2, INPUT);
  pinMode(tasterPin1, INPUT);
  pinMode(tasterPin2, INPUT);
  pinMode(tasterPin3, INPUT);
  Serial.begin(9600);
}
void loop() {
  sensorWert = analogRead(eingang);

  
    Serial.print (" brightness : ");
  Serial.println (brightness);
  

  // Helligkeit LED 1
  while ((digitalRead(tasterPin3) == LOW) and ( Hell > 0) and (digitalRead(tasterPin1) == HIGH)and (mode == 0) ) {
    Hell = Hell - fadeAmount;
    analogWrite(led1, Hell);
    delay(DimmZeit);
  }
  while ((digitalRead(tasterPin3) == LOW) and ( Hell < 255) and (digitalRead(tasterPin2) == HIGH) and (mode == 0)) {
    Hell = Hell + fadeAmount;
    analogWrite(led1, Hell);
    delay(DimmZeit);
  }

     // Helligkeit LED 2
  while ((digitalRead(tasterPin3) == LOW) and ( Hell2 > 0) and (digitalRead(tasterPin1) == HIGH) and (mode == 1) ) {
    Hell2 = Hell2 - fadeAmount;
    analogWrite(led2, Hell2);
    delay(30);
  }
  while ((digitalRead(tasterPin3) == LOW) and ( Hell2 < 255) and (digitalRead(tasterPin2) == HIGH)and (mode == 1) ) {
    Hell2 = Hell2 + fadeAmount;
    analogWrite(led2, Hell2);
    delay(30);
  }

    // Mode Umschalten
  if ((digitalRead(tasterPin3) == HIGH)) {
    counter4 = millis ();
    count++;
    delay(300);
  }
  if (((millis() - counter4) < dauer) and (count > 1) and (mode == 0) and ((millis() - counter3) > dauer * 2) ) {
    mode = 1;
    counter2 = millis ();
  }
  if (((millis() - counter4) < dauer) and (mode == 1) and (count > 1) and ((millis() - counter2) > dauer * 2)) {
    mode = 0;
    counter3 = millis ();
  }
  if ((millis() - counter4) > dauer) {
    count = 0;
    count2 = 0;
  }

// Mode Aufleuchten
  if ((mode == 0) and (digitalRead(tasterPin3) == HIGH)) {
    analogWrite(led1, Hell);
    delay(30);
    digitalWrite(led1, LOW);
  }
  if ((mode == 1) and (digitalRead(tasterPin3) == HIGH)) {
    analogWrite(led2, Hell);
    delay(30);
    digitalWrite(led2, LOW);
  }

  // Einstellung Leuchtdauer
  while ((digitalRead(tasterPin3) == HIGH) and (digitalRead(tasterPin1) == HIGH) and ( dauer) < (300001))  {
    dauer = dauer + sprung;
    delay(500);
    count3 = 1;
  }
  while ((digitalRead(tasterPin3) == HIGH) and (digitalRead(tasterPin2) == HIGH) and ( dauer) > (1999))  {
    dauer = dauer - sprung;
    delay(500);
    count3 = 1;
  }
  while ((count3 == 1) and (i < (dauer / 1000))){
    digitalWrite(led2, HIGH);
    delay(300);
    digitalWrite(led2, LOW);
    delay(300);
    i++;
  }
  if ( i >= dauer/1000){
    count3 = 0;
    i = 0;
  }

  // Endbedingung
  if ((brightness == 0) and ((millis() - counter) > dauer) and (counter > 1) and (start == 3)) {
    start = 0;
    counter = 0;
    sStop = 0;
  }
  // startbedingung
  if (((sensorWert) < (700)) and (((digitalRead(pirPin1)) == (HIGH)) or ((digitalRead(pirPin2)) == (HIGH)))) {
    start = 1;
  }
  // aufleuchten
  if (((brightness) < (Hell))  and ((start) == (1)) and ((digitalRead(tasterPin1) == (LOW)) or (digitalRead(tasterPin2) == (LOW)))) {
    analogWrite(led1, brightness);
    brightness = brightness + fadeAmount;
    delay(DimmZeit);
    
  }
  if ((brightness == Hell) and (brightness2 == Hell2)) {
      sStop = 1;
    }
  if (((brightness2) < (Hell2))  and ((start) == (1)) and ((digitalRead(tasterPin1) == (LOW)) or (digitalRead(tasterPin2) == (LOW)))) {
    analogWrite(led2, brightness2);
    brightness2 = brightness2 + fadeAmount;
    delay(DimmZeit);
  }
  
  // Leuchten mit Verzögerung
  if ((brightness) == (Hell) and (start) == (1) and ((millis() - counter) < dauer) and ((digitalRead(tasterPin1) == (LOW)) or (digitalRead(tasterPin2) == (LOW)))) {
    analogWrite(led1, Hell);
    (brightness) = (Hell);
  }
  if ((brightness2) == (Hell2) and (start) == (1) and ((millis() - counter) < dauer) and ((digitalRead(tasterPin1) == (LOW)) or (digitalRead(tasterPin2) == (LOW)))) {
    analogWrite(led2, Hell2);
    (brightness2) = (Hell2);
  }

  // Verzögerung Zeitzähler
  if ((sStop == 1) and (counter == 0) and (digitalRead(pirPin1)) == (LOW)) {
    counter = millis ();
  }
  
// Abdunkeln
  if  ((brightness > 0) and ((millis() - counter) > dauer) and (counter > 0) and ((digitalRead(tasterPin1) == (LOW)) or (digitalRead(tasterPin2) == (LOW)))) {
    analogWrite(led1, brightness);
    brightness = brightness - fadeAmount;
    delay(DimmZeit);
    start = 2;
  }

  if  ((brightness2 > 0) and ((millis() - counter) > dauer) and (counter > 0) and ((digitalRead(tasterPin1) == (LOW)) or (digitalRead(tasterPin2) == (LOW)))) {
    analogWrite(led2, brightness2);
    brightness2 = brightness2 - fadeAmount;
    delay(DimmZeit);
  }
  
  if ((start == 2) and (brightness == 0) and (brightness2 == 0)) {
    digitalWrite(led1, LOW);
    delay(1);
    digitalWrite(led2, LOW);
    delay(1);
    start = 3;    
  }
}

Doc_Arduino

Hallo,

da blickt ja kaum jemand durch, sieht aber nach einer Zustandssteuerung aus.
die vielen while ... gefallen mir ehrlich gesagt auch nicht.
Gucke dir mal enum an. Wenn du das verstanden hast, kann man damit wunderbare Zustandsänderungen mit einer klar benannten Variablen und eben klaren Variablenwerten machen. Für eine Zustandssteuerung perfekt. Bringt ungemein Ordnung ins Kaos und viele Vergleiche fallen weg.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

guntherb

Das ist echt ein langer und unübersichtlicher Code.
Dass wenig kommentare drin sind macht das nicht einfacher. Wo, z.B. ist der "Abschnitt, wo diese 5 sek. lang dauerhaft leuchtet sollen"?  Kommentare hinter den Variablen, wofür diese sind, wären auch hilfreich.

Was mir auffällt: Deine Timervariablen hast du als long vereinbart, sollte aber unsigned long sein. Das wird aber erst nach 25 Tage zum Problem führen.

So in Trockenübung ist das echt schwierig.
Mein Vorschlag: in jeden Abschnitt ein Serial.println("Abschnitt XY"); rein, dann siehst du im Seriellen Monitor, in welchem Codeabschnitt sich der Arduino grad rumtreibt. Hier kannst du dir auch ggf den Inhalt von wichtigen Variablen ausgeben lassen. Serial.print("   dauer=");Serial.println(dauer);

So kannst du dich rantasten, an welcher Stelle was schief läuft.
Grüße
Gunther

michael_x

Wenn man etwas nicht versteht, weil es zu kompliziert ist, hilft das, was meistens hilft: vereinfachen ;)

In deinem Fall wäre auch sinnvoll, einen Test-Sketch neu zu schreiben, der nur das macht, was du auch als Funktion beschreibst:
 - nur 1 Led
 - wofür 3 Taster?
 - wofür die 2 PIR Eingänge?
 - wofür die verschiedenen Modi?
 - wofür die vielen count# - Variablen ?
 - Sinnvolle Variablennamen, mit Kommentar welchen Sinn und Wertebereich sie haben...

Wenn der dann immer noch sich anders verhält als du denkst, helfen Serial.println Test-Ausgaben.
Und der Sketch ist auch für uns faule Kurz-Drübergucker interessanter anzuschauen.

Und wenn du erst gar keine while-Schleifen in loop hast, bist du generell auf einem bessern Weg...

Nick789

Danke für die reichlichen Tipps, hab schon so gedacht, dass es einfacher wird alles neu zu schreiben, als den Fehler finden...


Wenn man etwas nicht versteht, weil es zu kompliziert ist, hilft das, was meistens hilft: vereinfachen ;)

In deinem Fall wäre auch sinnvoll, einen Test-Sketch neu zu schreiben, der nur das macht, was du auch als Funktion beschreibst:
 - nur 1 Led
 - wofür 3 Taster?
 - wofür die 2 PIR Eingänge?
 - wofür die verschiedenen Modi?
- mit 2 Tastern erhöhe/ senke ich die Helligkeit der einzellnen Farben RGB LEDs, oder die Leuchtdauer
3 Taste schaltet zwischen den LEDs Farben um, oder beim halten der Taste und drücken der anderen Tasten verändert die Leuchtdauer

- ich hab zwei Bewegungsmelder an unterschiedlichen Orten

- "Modi" um zwischen den RGB Farben umzuschalten

Deswegen fand ich "while" an den Stellen praktisch, da sie nur beim drücken der Tasten aktiviert werden und dabei den Hauptcode blockieren. Sonst kann man die Helligkeit nicht vernünftig einstellen

Serenifly

#5
Aug 12, 2017, 01:19 am Last Edit: Aug 12, 2017, 01:20 am by Serenifly
Deswegen fand ich "while" an den Stellen praktisch, da sie nur beim drücken der Tasten aktiviert werden und dabei den Hauptcode blockieren. Sonst kann man die Helligkeit nicht vernünftig einstellen
Völlig falsche Vorgehensweise. Du hast in loop() schon eine Schleife und i.d.R. muss die immer reagieren können. Mit entsprechenden Status-Variablen wird dann nur der Code ausgeführt den du gerade willst.

Wenn du willst dass eine Variable verändert wird solange ein Taster gedrückt wird (z.B. alle x Sekunden 1 weiter) dann geht das auch nicht-blockierend. Ist aber ein wenig komplizierter.

Go Up