Go Down

Topic: Fehler im Sketch (Read 1 time) previous topic - next topic

XentriX5526

Quote
Grund: Oben setzt du LED (Pin 12) auf OUTPUT, willst dann aber unten LED_BUILTIN (Pin 13) ansteuern. Was davon willst du ansteuern? 12 oder 13?
Es soll die LED auf Pin 12 leuchten. Fehler wurde im obigen Post korrigiert.

Danke für den Hinweis.

HTML-Fan

#16
Jul 31, 2018, 05:33 pm Last Edit: Jul 31, 2018, 05:36 pm by HTML-Fan
Es soll die LED auf Pin 12 leuchten.
Okay, hier nochmal der neue Code mit LED 12:
Code: [Select]

const int Schalter = A1;
const int LED = 12;
void setup() {
  pinMode(Schalter, INPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}

void loop() {
  for(byte zaehler = 0;zaehler < 3;zaehler++){
    while(!digitalRead(Schalter));// Warte, solange nicht gedrueckt
    while(digitalRead(Schalter));// Warte, solange gedrueckt
  }
  BlinkZyklus();
}

void BlinkZyklus() {
  byte blinkZaehler = 1;
  unsigned long jetzt;
  while(true){ //wiederhole undendlich lange, bis von woanders unterbrochen wird
    digitalWrite(LED, HIGH);
    jetzt = millis(); // millis() gibt die Millisekunden seit dem Programmstart zurueck
    while(millis() - jetzt < 50){ // solange die aktuelle Zeit minus die Zeit gerade (= seit dem jetzt = millis(); vergangene Zeit) nidrieger ist
      if(digitalRead(Schalter)){ // fals der Schalter gedrückt ist
        return; // beende die Funktion und gehe zurueck zum loop
      }
    }
    digitalWrite(LED, LOW);
    jetzt = millis(); // wieder das Gleiche
    while(millis() - jetzt < blinkZaehler == 3 ? 500 : 50){ // falls dieses Mal das dritte Blinken ist, warte 500ms, sonst 50
      if(digitalRead(Schalter)){
        return;
      }
    }
    blinkZaehler = blinkZaehler == 3 ? 0 : blinkZaehler + 1; // falls dieses Mal das dritte Blinken mit der langen LOW-Zeit ist, ist das nächste wieder nummer Eins, sonst das naechste
  }
}

Ich habe ihn ausführlich erklärt und ich denke, dass du das auch alles so, wie es ist, verstehst. Fragen kannst du gerne stellen (ich beantworte sie sogar! ;)).

XentriX5526

Danke HTML-Fan für eine Mühen...

leider funktioniert es nicht.

dachte auch nicht, dass der CODE so komplex werden wird wie du Ihn gepostet hast.

Bei deinem Code:

IST-Stand:
- LED(12) leuchtet konstant
- mehrfaches Drücken auf den Tasten lässt die LED sporadisch mal kurz erlischen und sofort wieder angehen oder sie geht komplett aus und erst bei erneutem Druck nochmal an

HTML-Fan

#18
Jul 31, 2018, 05:42 pm Last Edit: Jul 31, 2018, 05:44 pm by HTML-Fan
Danke HTML-Fan für eine Mühen...

leider funktioniert es nicht.

dachte auch nicht, dass der CODE so komplex werden wird wie du Ihn gepostet hast.

Bei deinem Code:

IST-Stand:
- LED(12) leuchtet konstant
- mehrfaches Drücken auf den Tasten lässt die LED sporadisch mal kurz erlischen und sofort wieder angehen oder sie geht komplett aus und erst bei erneutem Druck nochmal an
Ach, ich habe auch schlecht geschlafen. Ein Problem ist, dass die LED beim Abbruch anbleiben kann. Hier nochmal:
Code: [Select]

const int Schalter = A1;
const int LED = 12;
void setup() {
  pinMode(Schalter, INPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}

void loop() {
  for(byte zaehler = 0;zaehler < 3;zaehler++){
    while(!digitalRead(Schalter));// Warte, solange nicht gedrueckt
    while(digitalRead(Schalter));// Warte, solange gedrueckt
  }
  BlinkZyklus();
  digitalWrite(LED, LOW);
}

void BlinkZyklus() {
  byte blinkZaehler = 1;
  unsigned long jetzt;
  while(true){
    digitalWrite(LED, HIGH);
    jetzt = millis(); // millis() gibt die Millisekunden seit dem Programmstart zurueck
    while(millis() - jetzt < 50){ // solange die aktuelle Zeit minus die Zeit gerade (= seit dem jetzt = millis(); vergangene Zeit) nidrieger ist
      if(digitalRead(Schalter)){ // fals der Schalter gedrückt ist
        return; // beende die Funktion und gehe zurueck zum loop
      }
    }
    digitalWrite(LED, LOW);
    jetzt = millis(); // wieder das Gleiche
    while(millis() - jetzt < blinkZaehler == 3 ? 500 : 50){ // falls dieses Mal das dritte Blinken ist, warte 500ms, sonst 50
      if(digitalRead(Schalter)){
        return;
      }
    }
    blinkZaehler = blinkZaehler == 3 ? 0 : blinkZaehler + 1; // falls dieses Mal das dritte Blinken mit der langen Aus-zeit ist, ist das nächste wieder nummer eins, sonst das naechste
  }
}

Wieviel klappt jetzt? (ich bin auch gespannt, weiß es auch nicht)

XentriX5526

...ich fange gerade an dieses ***** Multi-Shield zu lieben...

habe gerade herausgefunden, dass...
Code: [Select]
digitalWrite(LED,LOW);
...die LED ein..., und...
Code: [Select]
digitalWrite(LED,HIGH);
...die LED ausschaltet!

HTML-Fan

#20
Jul 31, 2018, 05:51 pm Last Edit: Jul 31, 2018, 06:25 pm by HTML-Fan
...ich fange gerade an dieses ***** Multi-Shield zu lieben...

habe gerade herausgefunden, dass...
Code: [Select]
digitalWrite(LED,LOW);
...die LED ein..., und...
Code: [Select]
digitalWrite(LED,HIGH);
...die LED ausschaltet!
Ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh!
Klappt es jetzt so, wie gewollt?

XentriX5526

mit deinem Code klappts nicht :/

Ich habe jetzt meinen nochmal versucht, damit komme ich jetzt etwas weiter...
Code: [Select]
const int Schalter = A1;
const int LED = 12;
int SchalterZustand;
int Zaehler = 0;

#define ON LOW
#define OFF HIGH

void setup() {
  pinMode(Schalter,INPUT);
  pinMode(LED,OUTPUT);
  digitalWrite(Schalter,LOW);
}

void loop() {
  SchalterZustand = digitalRead(Schalter);
 
  if(SchalterZustand==LOW) {
    Zaehler = Zaehler+1;
  }
 
  if(Zaehler==3) {
    BlinkZyklus();
  }
 
  if(Zaehler>=3) {
    digitalWrite(LED,OFF);
    Zaehler = 0;
  }
}

void BlinkZyklus() {
  // Blinkzyklus
  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
  delay(50);

  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
  delay(50);
 
  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
 
  delay(500);
}


IST-Stand:
  • Anfangs leuchtet die LED dauerhaft
  • beim gedrückt halten blinkt die LED im gewünschten Zyklus (Juhu!) :)
  • beim loslassen geht die LED aus


Was noch nicht geht:
  • Die LED soll erst beim 3ten drücken anfangen zu blinken, ohne den Knopf gedrückt zu halten.
  • Die LED soll beim 4ten drücken ausgehen und der Zähler soll auf 0 zurückgesetzt werden.

HTML-Fan

mit deinem Code klappts nicht :/

Ich habe jetzt meinen nochmal versucht, damit komme ich jetzt etwas weiter...
Code: [Select]
const int Schalter = A1;
const int LED = 12;
int SchalterZustand;
int Zaehler = 0;

#define ON LOW
#define OFF HIGH

void setup() {
  pinMode(Schalter,INPUT);
  pinMode(LED,OUTPUT);
  digitalWrite(Schalter,LOW);
}

void loop() {
  SchalterZustand = digitalRead(Schalter);
 
  if(SchalterZustand==LOW) {
    Zaehler = Zaehler+1;
  }
 
  if(Zaehler==3) {
    BlinkZyklus();
  }
 
  if(Zaehler>=3) {
    digitalWrite(LED,OFF);
    Zaehler = 0;
  }
}

void BlinkZyklus() {
  // Blinkzyklus
  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
  delay(50);

  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
  delay(50);
 
  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
 
  delay(500);
}


IST-Stand:
  • Anfangs leuchtet die LED dauerhaft
  • beim gedrückt halten blinkt die LED im gewünschten Zyklus (Juhu!) :)
  • beim loslassen geht die LED aus


Was noch nicht geht:
  • Die LED soll erst beim 3ten drücken anfangen zu blinken, ohne den Knopf gedrückt zu halten.
  • Die LED soll beim 4ten drücken ausgehen und der Zähler soll auf 0 zurückgesetzt werden.

Und immernoch verstehe ich nicht, warum du den Schalter ausmachst.

HTML-Fan

Code: [Select]

const int Schalter = A1;
const int LED = 12;

#define ON LOW
#define OFF HIGH
void setup() {
  pinMode(Schalter, INPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, OFF);
}

void loop() {
  for(byte zaehler = 0;zaehler < 3;zaehler++){
    while(!digitalRead(Schalter));// Warte, solange nicht gedrueckt
    while(digitalRead(Schalter));// Warte, solange gedrueckt
  }
  BlinkZyklus();
  digitalWrite(LED, OFF);
}

void BlinkZyklus() {
  byte blinkZaehler = 1;
  unsigned long jetzt;
  while(true){
    digitalWrite(LED, ON);
    jetzt = millis(); // millis() gibt die Millisekunden seit dem Programmstart zurueck
    while(millis() - jetzt < 50){ // solange die aktuelle Zeit minus die Zeit gerade (= seit dem jetzt = millis(); vergangene Zeit) nidrieger ist
      if(digitalRead(Schalter)){ // fals der Schalter gedrückt ist
        return; // beende die Funktion und gehe zurueck zum loop
      }
    }
    digitalWrite(LED, OFF);
    jetzt = millis(); // wieder das Gleiche
    while(millis() - jetzt < blinkZaehler == 3 ? 500 : 50){ // falls dieses Mal das dritte Blinken ist, warte 500ms, sonst 50
      if(digitalRead(Schalter)){
        return;
      }
    }
    blinkZaehler = blinkZaehler == 3 ? 0 : blinkZaehler + 1; // falls dieses Mal das dritte Blinken mit der langen Aus-zeit ist, ist das nächste wieder nummer eins, sonst das naechste
  }
}

Jetzt habe ich mal LOW und HIGH umgekehrt - klappt es so und wenn nein, wieviel klappt?

XentriX5526

im void setup() kann ich dieses auch weglassen
Code: [Select]
digitalWrite(Schalter,HIGH);

im void loop() wird bei HIGH/LOW einfach nur umgekehrt, ob der Schalter HIGH oder LOW sein muss um dass Programm zu starten.

HTML-Fan

im void setup() kann ich dieses auch weglassen
Code: [Select]
digitalWrite(Schalter,HIGH);

im void loop() wird bei HIGH/LOW einfach nur umgekehrt, ob der Schalter HIGH oder LOW sein muss um dass Programm zu starten.
Hä?

XentriX5526

Hier das Multifunction Shield welches ich nutze...

Multifunction Shield

Ich habe jetzt mal die 4stellige 7-Segment-Anzeige mit eingebunden, um mir den Wert für Zaehler anzeigen zu lassen...

IST-Stand:
- direkt nach dem Start ist der Zaehler auf 0
- bei drücken (und gedrückt halten) der Taste A1 wird der Zaehler auf 3 gesetzt
- beim loslassen des Tasters A1 wird der Zaehler wieder 0 wert

Code: [Select]
#include <MultiFuncShield.h>

const int Schalter = A1;
const int LED = 12;
int SchalterZustand;
int Zaehler = 0;

#define ON LOW
#define OFF HIGH

void setup() {
  Timer1.initialize();
  MFS.initialize(&Timer1); // initialize multi-function shield library
  MFS.write("Load");
  delay(2000);

 
  pinMode(Schalter,INPUT);
  pinMode(LED,OUTPUT);
  digitalWrite(Schalter,HIGH);
}

void loop() {
  MFS.write(Zaehler);
  digitalWrite(LED,OFF);
  SchalterZustand = digitalRead(Schalter);
 
  if(SchalterZustand==LOW) {
    Zaehler = Zaehler+1;
    MFS.write(Zaehler);
  }
 
  if(Zaehler==3) {
    BlinkZyklus();
    MFS.write(Zaehler);
  }
 
  if(Zaehler>=3) {
    digitalWrite(LED,OFF);
    Zaehler = 0;
    MFS.write(Zaehler);
  }

}

void BlinkZyklus() {
  // Blinkzyklus
  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
  delay(50);

  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
  delay(50);
 
  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
 
  delay(500);
}

HTML-Fan

Hier das Multifunction Shield welches ich nutze...

Multifunction Shield

Ich habe jetzt mal die 4stellige 7-Segment-Anzeige mit eingebunden, um mir den Wert für Zaehler anzeigen zu lassen...

IST-Stand:
- direkt nach dem Start ist der Zaehler auf 0
- bei drücken (und gedrückt halten) der Taste A1 wird der Zaehler auf 3 gesetzt
- beim loslassen des Tasters A1 wird der Zaehler wieder 0 wert

Code: [Select]
#include <MultiFuncShield.h>

const int Schalter = A1;
const int LED = 12;
int SchalterZustand;
int Zaehler = 0;

#define ON LOW
#define OFF HIGH

void setup() {
  Timer1.initialize();
  MFS.initialize(&Timer1); // initialize multi-function shield library
  MFS.write("Load");
  delay(2000);

 
  pinMode(Schalter,INPUT);
  pinMode(LED,OUTPUT);
  digitalWrite(Schalter,HIGH);
}

void loop() {
  MFS.write(Zaehler);
  digitalWrite(LED,OFF);
  SchalterZustand = digitalRead(Schalter);
 
  if(SchalterZustand==LOW) {
    Zaehler = Zaehler+1;
    MFS.write(Zaehler);
  }
 
  if(Zaehler==3) {
    BlinkZyklus();
    MFS.write(Zaehler);
  }
 
  if(Zaehler>=3) {
    digitalWrite(LED,OFF);
    Zaehler = 0;
    MFS.write(Zaehler);
  }

}

void BlinkZyklus() {
  // Blinkzyklus
  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
  delay(50);

  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
  delay(50);
 
  digitalWrite(LED,ON);
  delay(50);
  digitalWrite(LED,OFF);
 
  delay(500);
}

Zaehler wird nicht auf 3 gesetzt - er wird nur ganz schnell erhöht, da nicht abgewartet wird, bis der Button losgelassen wird. Also wird drei Mal Zaehler erhöht - so schnell, dass man es nicht sehen kann.

XentriX5526

Code: [Select]
  if(SchalterZustand==LOW) {
    Zaehler++;
    MFS.write(Zaehler);
    delay(100);
  }


hiermit konnte ich nun sichbar machen, dass er (nun jede 1/10sek) hoch zählt, einmal das Blinkmuster durchläuft, dieses aber bereits nach einem durchlaufen wieder verlässt, und den Zaehler auf 0 setzt.

Fragen:
- Wie bringe ich den Sketch dazu, beim drücken des Tasters den Wert für Zaehler[/i] nur um 1 zu erhöhen?
- Wie bringe ich den Sketch dazu, mein void BlinkZyklus solange zu durchlaufen, bis die Taste erneut gedrückt wird?

Tommy56

Du musst Zustandsänderungen und nicht Zustände auswerten, d.g. der User muss den Taster erst mal wieder los lassen. Dazu musst Du Dir den alten Zustand merken. Außerdem musst Du das Prellen des Tasters unterdrücken (entweder Bounce2-Lib oder delay(5) wenn er nicht zu schlecht ist).

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up