Go Down

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

XentriX5526

Hey Leute,

anscheinend hat mich mein neues Projekt gestern Abend so lange beschäftigt, dass ich heute morgen einen
 (oder mehrere) große(n) Fehler im Sketch eingebaut habe... leider finde ich Ihn nicht :(

Funktion des Programms:

- LED-Blinkzyklus aktivieren, nachdem ich 3x auf einen Taster drücke
- LED-Blinkzyklus stoppen, nachdem ein weiteres mal auf den Taster gedrückt wird, dabei wird ein Counter auf Null gesetzt um mit erneuten 3 Drücken wieder von vorne zu beginnen

Mein Sketch:

Code: [Select]
// constants won't change. They're used here to set pin numbers:
const int Schalter = A1;      // the number of the pushbutton pin
const int LED =  12;          // the number of the LED pin

// variables will change:
int SchalterZustand = LOW;    // variable for reading the pushbutton status
int Zaehler = 0;              // variable for Zaehler the pushbutton pushes


void setup() {
  // initialize the pushbutton pin as an input:
  pinMode(Schalter,INPUT);
  // initialize the LED pin as an output:
  pinMode(LED,OUTPUT);
  // start with button status LOW:
  digitalRead(Schalter,LOW);
}

void loop() {
 
  SchalterZustand = digitalRead(Schalter);
 
  if(SchalterZustand == HIGH){
    Zaehler = Zaehler+1;
  }
 
  if(Zaehler==3){
   // Blinkzyklus
   BlinkZyklus();
  }
 
  if(Zaehler==4){
    digitalWrite(LED,LOW);
    Zaehler = 0;
  }
 
}

void BlinkZyklus() {
  // Blinkzyklus
  digitalWrite(LED_BUILTIN, HIGH);
  delay(50);
  digitalWrite(LED_BUILTIN, LOW);
  delay(50);

  digitalWrite(LED_BUILTIN, HIGH);
  delay(50);
  digitalWrite(LED_BUILTIN, LOW);
  delay(50);

  digitalWrite(LED_BUILTIN, HIGH);
  delay(50);
  digitalWrite(LED_BUILTIN, LOW);
 
  delay(500);
}

Tommy56

Wie wäre es, wenn Du uns noch mitteilst, was funktioniert und was/wie nicht?

Den Zustand vor der Änderung hast Du nicht? Denke mal über eine Form der Versionierung nach.

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

HotSystems

Und wieso verwendest du einen analogen Eingang als digitalen Pin, wo du so viele digitale Pins noch frei hast ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

HTML-Fan

#3
Jul 31, 2018, 04:10 pm Last Edit: Jul 31, 2018, 04:12 pm by HTML-Fan
Hey Leute,

anscheinend hat mich mein neues Projekt gestern Abend so lange beschäftigt, dass ich heute morgen einen
 (oder mehrere) große(n) Fehler im Sketch eingebaut habe... leider finde ich Ihn nicht :(

Funktion des Programms:

- LED-Blinkzyklus aktivieren, nachdem ich 3x auf einen Taster drücke
- LED-Blinkzyklus stoppen, nachdem ein weiteres mal auf den Taster gedrückt wird, dabei wird ein Counter auf Null gesetzt um mit erneuten 3 Drücken wieder von vorne zu beginnen

Mein Sketch:

Code: [Select]
// constants won't change. They're used here to set pin numbers:
const int Schalter = A1;      // the number of the pushbutton pin
const int LED =  12;          // the number of the LED pin

// variables will change:
int SchalterZustand = LOW;    // variable for reading the pushbutton status
int Zaehler = 0;              // variable for Zaehler the pushbutton pushes


void setup() {
  // initialize the pushbutton pin as an input:
  pinMode(Schalter,INPUT);
  // initialize the LED pin as an output:
  pinMode(LED,OUTPUT);
  // start with button status LOW:
  digitalRead(Schalter,LOW);
}

void loop() {
 
  SchalterZustand = digitalRead(Schalter);
 
  if(SchalterZustand == HIGH){
    Zaehler = Zaehler+1;
  }
 
  if(Zaehler==3){
   // Blinkzyklus
   BlinkZyklus();
  }
 
  if(Zaehler==4){
    digitalWrite(LED,LOW);
    Zaehler = 0;
  }
 
}

void BlinkZyklus() {
  // Blinkzyklus
  digitalWrite(LED_BUILTIN, HIGH);
  delay(50);
  digitalWrite(LED_BUILTIN, LOW);
  delay(50);

  digitalWrite(LED_BUILTIN, HIGH);
  delay(50);
  digitalWrite(LED_BUILTIN, LOW);
  delay(50);

  digitalWrite(LED_BUILTIN, HIGH);
  delay(50);
  digitalWrite(LED_BUILTIN, LOW);
 
  delay(500);
}

Lass mich raten: Bei nur einem Druck blinkt es schon und dann muss man lange gedrückt halten, damit es wieder aufhört, richtig? Das Problem ist, dass nicht gewartet wird, bis nicht mehr der Button gedrückt ist und der Arduino also beim Runterdrücken ganz schnell jedes Mal HIGH bekommt und jedes Mal den Zaehler erhöht. Mit while(!digitalRead(schalter)); nach dem ersten ifwäre dies unterbunden. Zweites Problem: Solange L blinkt kann dies nicht beendet werden, da delay den Programmablauf blockiert und währenddessen nicht abgefragt wird. Oder ist das Absicht? Wir wissen ja nicht, was genau du willst und wieviel davon schon klappt.

Tommy56

Mit while(!digitalRead(schalter)); nach dem ersten ifwäre dies unterbunden.
Vorsicht, sowas kann einem schnell auf die Füße fallen. Lieber den Status des Schalters merken und auf Statusänderung prüfen.

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

XentriX5526

Hallo,

schonmal danke für die Antworten.

Ihr habt recht... der "Schlafmangel" hat anscheinend ein paar Infos im ersten Post untergehen lassen.

Also nochmal detailliert...

Setup:
- Arduino UNO (Original)
- Multifunction-Shield
  (digital-output=12) - eine von 4 onBoard LEDs
  (analog-input=A1) - einer von 3 onBoard Schaltern

Projekt-Zweck (Was soll am Ende raus kommen):
Ich möchte eine Schaltung, welche mit einem "Geheimen"-Tastendruck-Muster (3x drücken) eine LED zum blinken bringt (BlinkZyklus).
Ein weiterer Druck auf den Taster soll die LED zum erlöschen bringen (LED=LOW & COUNTER=0).

IST-Stand:
- LED auf Pin12 leuchtet dauerhaft
- keine Reaktion beim drücken des Tasters

HTML-Fan

Code: [Select]
Was mich etwas irritiert, ist diese Zeile:
[quote author=XentriX5526 link=msg=3825454 date=1533041629]
  digitalRead(Schalter,LOW);

[/quote]
Was macht das? Nach Referenz lautet der Befehl digitalRead(pin), nicht irgendwie digitalRead(pin, state) oder sowas.

XentriX5526

dies sollte eigentlich definieren, dass der Anfangs-Status der LED=LOW ist... kann man aber eigentlich weg lassen?!

hätte das wenn nicht sogar "digitalWrite" sein müssen?

ich bin total raus :(

Tommy56

Ob Du von dem Pin lesen willt oder etwas dahin ausgeben willst, solltest Du eigentlich wissen.

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

HTML-Fan

#9
Jul 31, 2018, 05:01 pm Last Edit: Jul 31, 2018, 05:04 pm by HTML-Fan
dies sollte eigentlich definieren, dass der Anfangs-Status der LED=LOW ist
DU SCHALTEST DEN SCHALTER AUS!!!
Egal, am Anfang passieren Fehler! :)
hätte das wenn nicht sogar "digitalWrite" sein müssen?
Ja, wenn das die LED ausmachen soll, muss es digitalWrite(LED, LOW); sein, das ist aber auch sowasvon egal, kann man weglassen, aber bei meinem Due ist das anders (Anfangsstatus = HIGH) , darum solltest du dier das so angewöhnen, das ist besser und wird dich weiter bringen.

HTML-Fan

IST-Stand:
- LED auf Pin12 leuchtet dauerhaft
- keine Reaktion beim drücken des Tasters
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?

XentriX5526

Danke für eure Geduld!

Quote
Egal, am Anfang passieren Fehler! :)
Dass stimmt... aber oft sind die Menschen im Forum dadurch genervt... :)

Ich habe meinen Sketch jetzt mal aufs wesentliche reduziert:
Code: [Select]
int Schalter = A1;
int LED = 12;
int SchalterZustand = LOW;
int Zaehler = 0;

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

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


Quote
(Anfangsstatus = HIGH) , darum solltest du dier das so angewöhnen, das ist besser und wird dich weiter bringen.
habe ich geändert...
Code: [Select]
digitalWrite(Schalter,HIGH);
digitalRead -> digitalWrite
LOW -> HIGH

bringt aber keinen Unterschied... hätte ich ja auch weglassen können.


IST-Stand
(nach wie vor):
- LED brennt dauerhaft
- keine Aktion bei mehrfachem drücken des Tasters

Fragen
:
- Wieso gibt es keine Reaktion beim drücken des Schalters?
- Wieso startet die LED mit HIGH, obwohl oben "int SchalterZustand = LOW" ist?

HotSystems

- Wieso startet die LED mit HIGH, obwohl oben "int SchalterZustand = LOW" ist?
Da kommt es drauf an, wie du die Led angeschlossen hast.
Hier wäre ein Schaltbild hilfreich.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

HTML-Fan

#13
Jul 31, 2018, 05:22 pm Last Edit: Jul 31, 2018, 05:30 pm by HTML-Fan
IST-Stand (nach wie vor):
- LED brennt dauerhaft
- keine Aktion bei mehrfachem drücken des Tasters

Fragen
:
- Wieso gibt es keine Reaktion beim drücken des Schalters?
- Wieso startet die LED mit HIGH, obwohl oben "int SchalterZustand = LOW" ist?
Ich habe es doch schon geschrieben:
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?
Ich gehe mal von 13, der eingebauten onBoard-LED aus.

HTML-Fan

#14
Jul 31, 2018, 05:27 pm Last Edit: Jul 31, 2018, 05:30 pm by HTML-Fan
Ich war jetzt mal ganz lieb und habe den Code so umgeschrieben, dass er (glaue ich) klappt:
Code: [Select]

const int Schalter = A1;
void setup() {
  pinMode(Schalter, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 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, bis anders unterbrochen
    digitalWrite(LED_BUILTIN, 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_BUILTIN, 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
  }
}

Go Up