Taster an digitalem Eingang muss lange gedrückt werden um das Signal zu erhalten

Hallo liebe Arduino-Gemeinde,

ich habe erst seit kurzem einen Arduino und habe heute ein Verhalten bemerkt, dass ich mir nicht erklären kann.

Es geht um die digitalen Eingänge. Ich habe mit jeweils einem digitalen Eingang einen Taster verbunden. Und den Eingang als INPUT_PULLUP definiert, damit ich den internen Widerstand verwenden kann.

Mit einem Taster schalte ich eine LED ein mit dem andere Taster schalte ich die LED aus. Eigentlich ganz simpel.

Nun ist mir aufgefallen, dass ich für das Einschalten den Taster nur ganz kurz drücken muss. Das ist gut.
Dann ist wird der Ausgang für die LES angesteuert und die LED leuchtet.

Wenn ich nun den anderen Taster drücke, um die LED wieder auszuschalten ist mir aufgefallen, dass es nicht reicht den Taster genauso kurz zu drücken, sondern ich muss ihn ein kleines bisschen länger drücken.

Meine Anforderung an einem Mikroprozessor wäre eigentlich, dass ein sehr kurzer Tastendruck ausreicht und ich nicht ein zweites mal drücken muss.

Gerne kann ich euch Schaltbilder und Programmcode zukommen lassen. Aber vielleicht habt ihr auch so schon eine Erklärung für dieses Verhalten.

Danke!

Aber vielleicht habt ihr auch so schon eine Erklärung für dieses Verhalten.

Klar!

Du hast irgend einen Fehler gemacht, oder was nicht beachtet.
Welches dann zu deinem Problem führt.

bool memswitch;
 
void setup() {
  pinMode(8,INPUT_PULLUP);
  pinMode(9,INPUT_PULLUP);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
}

bool RTrig(bool input) {
  static bool mem;
  bool out;
  out=input and not mem;
  mem=input;
  return out;
}

void loop() {
  bool input1;
  bool rtrig1;
  input1=not digitalRead(8);
  rtrig1 = RTrig(input1);
  if (rtrig1 and memswitch)  {
    memswitch=false;
  }  else 
  if (rtrig1 and not memswitch) {
    memswitch=true;
  }

  if (memswitch==true)  {
    digitalWrite(13, true);   
    delay(50);               
    digitalWrite(13, false);    
    delay(50);                
    digitalWrite(12, true);    
    delay(50);                
    digitalWrite(12, false);    
    delay(50);                
    digitalWrite(11, true);    
    delay(50);                
    digitalWrite(11, false);    
    delay(50);                
  } 
  else  {
    digitalWrite(13, false);    
    digitalWrite(12, false);    
    digitalWrite(11, false);    
  }
}

Du hast Glück, meine Glaskugel ist gerade aus der Quarantäne zurück.

Die sagt mir, du verwendest millis, wo es nicht sein darf.

Aber mehr geht ohne deinen Sketch nicht.

Wenn ich nun den anderen Taster drücke, um die LED wieder auszuschalten ist mir aufgefallen, dass es nicht reicht den Taster genauso kurz zu drücken, sondern ich muss ihn ein kleines bisschen länger drücken.

Ich glaube dir nicht.

Dein Programm ist nicht nur gruselig zu lesen, sondern passt auch nicht zur Problembeschreibung.

Denn:
Da nur ein Taster gelesen wird, kann auf den zweiten keine Reaktion erfolgen.

Und wie ich sehe, meine Glaskugel hat Recht.

Deine zahlreichen millis stören deinen Sketch.

combie:
Ich glaube dir nicht.
Dein Programm ist nicht nur gruselig zu lesen, sondern passt auch nicht zur Problembeschreibung.
Denn:
Da nur ein Taster gelesen wird, kann auf den zweiten keine Reaktion erfolgen.

Bitte entschuldigt. Ich habe das Programm mittlerweile etwas modifiziert und arbeite nur noch mit einem Taster. Das Verhalten ist aber immer noch da.

Hier also das Originalprogramm - hoffentlich für euch einfacher zu lesen:

bool memswitch;
 
// the setup function runs once when you press reset or power the board
void setup() {

  pinMode(8,INPUT_PULLUP);
  pinMode(9,INPUT_PULLUP);

  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  
}

void loop() {
  bool input1;
  bool input2;

  input1=not digitalRead(8);
  input2=not digitalRead(9);
     
  if (input1)
  {
    memswitch=true;
  }
  else if (input2)
  {
    memswitch=false;
  }
  
  if (memswitch==true)
  {
    digitalWrite(13, true);   
    delay(50);               
    digitalWrite(13, false);    
    delay(50);                
    digitalWrite(12, true);    
    delay(50);                
    digitalWrite(12, false);    
    delay(50);                
    digitalWrite(11, true);    
    delay(50);                
    digitalWrite(11, false);    
    delay(50);                
  } else
  {
    digitalWrite(13, false);    
    digitalWrite(12, false);    
    digitalWrite(11, false);    
  }
}

HotSystems:
Und wie ich sehe, meine Glaskugel hat Recht.

Deine zahlreichen millis stören deinen Sketch.

Lass bitte mal Deine Glaskugel überholen. :slight_smile:
millis wäre gut, aber er verwendet das böse, böse delay.

@TO:
delay hält den Prozessor davon ab irgendwas anderes zu machen außer zu warten.
Schau Dir mal das Beispiel BlinkWithoutDelay in der IDE an und suche mal nach der Nachtwächtererklärung im Forum. Du musst Deine delay auf millis umbauen, dann geht es.

Gruß, Jürgen

Könnte es sein, dass deine delay() die zügige Tastenauswertung erfolgreich unterbinden?

HotSystems:
Und wie ich sehe, meine Glaskugel hat Recht.

Deine zahlreichen millis stören deinen Sketch.

Darf ich fragen was mit "zahlreichen milis" gemeint ist. Du meinst sicherlich die Wartezeiten (delay).

Dadurch dauert die Loop länger, wenn die LEDs an sind.

Vielen Dank! Das ist ein guter Hinweis.

Ich mache mir jetzt mal Gedanken wie man das vermeiden kann. Ich habe schon eine Idee.

Katsumi_S:
delay hält den Prozessor davon ab irgendwas anderes zu machen außer zu warten.
Schau Dir mal das Beispiel BlinkWithoutDelay in der IDE an und suche mal nach der Nachtwächtererklärung im Forum. Du musst Deine delay auf millis umbauen, dann geht es.
Gruß, Jürgen

Vielen Dank an alle. Ihr habt natürlich recht. Wie konnte ich nur so blöd sein?

Katsumi_S:
Lass bitte mal Deine Glaskugel überholen. :slight_smile:
millis wäre gut, aber er verwendet das böse, böse delay.

So ein Sch...., hat die sich tatsächlich angesteckt.
Sollte natürlich "delay()" heißen.

Also wieder zurück in die Quarantäne. :wink:

burkeybo:
Darf ich fragen was mit "zahlreichen milis" gemeint ist. Du meinst sicherlich die Wartezeiten (delay).

Dadurch dauert die Loop länger, wenn die LEDs an sind.

Vielen Dank! Das ist ein guter Hinweis.

Ich mache mir jetzt mal Gedanken wie man das vermeiden kann. Ich habe schon eine Idee.

Stimmt genau, sollte delay() heißen.
Aber gut, dass du es dennoch verstanden hast.

Stimmt genau, sollte delay() heißen.

Und ich habe es als Ironie wahrgenommen.
So man sich täuschen kann.

HotSystems:
Stimmt genau, sollte delay() heißen.
Aber gut, dass du es dennoch verstanden hast.

Natürlich ich als alter SPS Programmierer habe es sofort verstanden. Ich habe meinen Code nun angepasst und siehe da: Das LED-Lauflicht läuft (hat es ja vorher schon), und es reagiert schnell auf die Tastendrücker, insbesondere die Aus-Taste, wenn das Lauflicht läuft...

Danke nochmal für den stets freundlichen und hilfsbereiten Tonfall vom ersten Posting an und die freundliche Aufnahme.

Merke: Delay() ist böse!

bool bMemSwitch;
int iLedNo=0;
unsigned long uiPrevTime;

// the setup function runs once when you press reset or power the board
void setup() {

  pinMode(8,INPUT_PULLUP);
  pinMode(9,INPUT_PULLUP);

  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  
}

void loop() {

  bool bInput1;
  bool bInput2;
  unsigned long uiCurrTime;
  unsigned long uiDiffTime;   

  bInput1=not digitalRead(8);
  bInput2=not digitalRead(9);

  uiCurrTime=millis();

  uiDiffTime=uiCurrTime-uiPrevTime;

  if (bInput1) {
    bMemSwitch=true;
    iLedNo=0;
  }
  else if (bInput2) {
    bMemSwitch=false;
  }

  if (uiDiffTime>=200) {
    iLedNo=iLedNo+1;
    if (iLedNo>2) {
      iLedNo=0;
    }
    uiPrevTime=uiCurrTime;
  }
  
  if (bMemSwitch==true)  {
    if (iLedNo==0) {
      digitalWrite(13, true);
      digitalWrite(12, false);
      digitalWrite(11, false);
      }    
    if (iLedNo==1){
      digitalWrite(13, false);
      digitalWrite(12, true);
      digitalWrite(11, false);
      }     
    if (iLedNo==2) {
     digitalWrite(13, false);
     digitalWrite(12, false);
     digitalWrite(11, true);
    }     
  } else  {
    digitalWrite(13, false);    
    digitalWrite(12, false);    
    digitalWrite(11, false);    
  }
}

Gerne....und danke für die Rückmeldung.

@HotSystems:YMMD :slight_smile:

postmaster-ino:
@HotSystems:YMMD :slight_smile:

Oh....prima, auch das freut mich.