Querschluss durch Pull-Down Widerstände

Hallo zusammen,
ich habe einen Sketch erstellt, welcher zwei Eingaben möglichst schnell erfassen soll.
Einmal wird ein Bewegungsmelder, das andere mal ein Taster ausgelesen.
Alles erfolgt über interrupts, in welchen der entsprechende boolean gesetzt wird. Die eigentliche ISR wird dann in der loop-Schleife ausgeführt. Der Bewegungsmelder und der Taster sind beide durch einen eigenen 10k Ohm Pulldown-Widerstand auf GND geschalten.

Hier mein Problem:
Die ISR des Tasters wird zufällig mehrmals, in unregelmäßigen Abständen, ausgeführt. Die ISR des Bewegungsmelders ist auch total wirr. Nun frage ich mich, was hier der wahrscheinlichste Fehler ist, ich bin mit meinem Latein langsam am Ende. Vielen Dank für jede Hilfe!

// Defines
#define pin_taster D2
#define pin_motion D3
volatile bool taster_enable = false;
volatile bool motion_enable = false;


void setup() { 
  Serial.begin(115200);

  // Taster & BM
  pinMode(pin_taster, INPUT);  
  pinMode(pin_motion, INPUT);
  attachInterrupt(digitalPinToInterrupt(pin_taster), taster, RISING); 
  attachInterrupt(digitalPinToInterrupt(pin_motion), motion, RISING);

void loop() {
  delay(5000);

  if(taster_enable == true){
    // Aktion 1
    taster_enable = false;
  }
  else{
    // Nichts
  }

  if(motion_enable == true){
    // Aktion 2
    motion_enable = false;
  }
  else{
    // Nichts
  }
}


void taster(){
  taster_enable = true;
}

void motion(){
  motion_enable = true;
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

  1. Fehler: Interrupts für Taster benutzen

  2. So was macht man mit Polling in einer Statemaschine. Und die macht dann auch das Debouncing.

Wie geht das?

Eine ISR ist nebenläufig und wird sicher nicht in der loop() ausgeführt. Wenn doch, dann ist es keine.

Ohne hier konkreten Code zu zeigen, wirst Du dir die Frage nach dem wahrscheinlichen Fehler noch länger stellen müssen.

In der ISR wird ein boolean gesetzt, welcher dann im loop ausgelesen bzw. ausgeführt wird. Die Idee dahinter war, die ISR möglichst kurz zu halten.

Pulldown/Taster falsch angeschlossen.

Merke: Taster prellen.


exit status 1
'D2' was not declared in this scope; did you mean 'A2'?

Der Taster wurde nie gedrückt, deswegen wundert much das mit dem Prelle ein wenig. Deswegen hab ich allem voran einen Delay von 5 Sekunden eingebaut. Hab mir erhofft, das so irgendwie umschiffen zu können.

Natürlich darfst du 66,6667% meiner Ansagen ignorieren.

Hab ich überlesen, sorry :confused:

Hast Du nun einen PullDown-Widerstand am Tastereingang oder nicht?
Was für einen Ausgang hat der PIR? (Link bitte)

Gruß Tommy

Daraus könnte man schließen das es sich um einen ESP handelt. Beim ESP werden die ISR in einem anderen Speicherbereich abgelegt

z.B so

// ============ ISR Function ============
ICACHE_RAM_ATTR void myISR() {
  i_count++;
}

Da soll der TO halt mal mit klaren Infos rüber kommen. Alles Schätzen bringt nichts.
Wir sollten warten, bis mehr Infos gekommen sind.

Gruß Tommy

Hallo Tommy,
meine beiden PullDown-Widerstände sind nach dem Taster auf GND geschalten. Der Schaltdraht läuft selbstverständlich auf den entsprechenden Pin.

Ich habe folgenden Bewegungsmelder verbaut:
Bewegungsmelde Modul HC-SR501 PIR
(Bewegungssensor Bewegungsmelde Modul HC-SR501 PIR kompatibel mit Ardui)

Dieser gibt beim Erkennen einer Bewegung ein HIGH aus, dessen Länge eingestellt werden kann.

Lese ich beide Pins (PIR & Taster) simpel mit einem digitalRead() aus, ist alles in Ordnung.

Vielen Dank!

Grüße Axel

Liegt im Widerspruch zu:

Deine Prosa ist nicht eindeutig.

Ein Bild sagt mehr als tausend Worte. Aus deinen Worten kann ich nicht entnehmen, was da wie angeschlossen ist. Zeichne bitte ein Schaltbild ( handschriftlich auf Papier und abfotografiert reicht ) wie Du deine Peripherie angeschlossen hast.

Warum machst Du es dann nicht so? Die ISR bringt Dir kaum Gewinn, aber evtl. viele Nachteile. (wie Du gerade merkst)

Gruß Tommy


Hier kannst Du meine Verdrahtung sehen.
Ich hoffe, ich habe keinen offensichtlichen Fehler gemacht :face_with_peeking_eye:

Sorry, unsauber formuliert...
Wenn ich die beiden Eingänge mit einem kleinen extra Sketch auslese und nur digitalRead() verwende, und über den seriellen Monitor auslese, dann scheint alles so zu funktionieren, wie es soll.

Teste ich das ganze dann allerdings ohne Rechner mit anderer Spannungsquelle geben mir die Ereignisse (in meinem Sketch Aktion 1 und Aktion 2) Anlass zu denken, dass hier scheinbar nicht alles in Ordnung ist. Die Aktionen prasseln unkontrolliert herein...

Meine Idee dahinter war, dass ich die Aktion nur einmal ausführen will, deswegen bin ich auf die Idee mit der steigenden Flanke gekommen. Also wenn man den Taster z.B. 5 Sekunden drückt, meine "Aktion 1" nicht wiederholt ausgeführt wird. Könnte man sowas mit einer neuen Variablen lösen, mit der man sozusagen nach einmaligem Betätigen einen Counter laufen lässt, der die Aktion dann für n Sekunden sperrt? Das würde dann vermutlich auch ein mögliches Prellproblem lösen, oder?

Gruß Axel