LED Ansteuerung macht Probleme

Hallo zusammen!

Ich habe mehrere LED’s an einem MCP23017 angeschlossen. Bei einer bestimmten Kombination an Tastern sollen bestimmte LED’s an gehen und andere wiederum aus. Beispiel: In meinem Code sollen bei der “Tasterkombination - Taster9 und Taster6” die LED’s 11, 2 und 0 leuchten. Dies tun sie auch, allerdings nur beim ersten Mal. Wenn ich nun eine andere Tasterkombination drücke, beispielsweise “Taster9+Taster5”, flackert LED 3 und 11 nur kurz auf und nur LED 15 leuchtet, statt alle drei wie im Sketch definiert. Wenn ich nun wieder die erstgenannte Kombination (9+6) drücke, dann flackert LED11 kurz auf und 2 sowie 0 gehen an (statt alle drei)…

Kann jemand einen Fehler in meinem Code finden???

Besten Dank für jede Hilfe
René

#include <VarSpeedServo.h>


//#include <Servo.h>
#include <Wire.h>
#include <Centipede.h>

Centipede CS;

int taster9 = 0; 
int taster8 = 0; 
int taster10 = 0; 
int taster6 = 0; 
int taster5 = 0;
int taster4 = 0; 
int taster13 = 0; 
int taster14 = 0; 

VarSpeedServo weiche1;
VarSpeedServo weiche6;
VarSpeedServo weiche7;

void setup() {
  
   weiche1.attach(12); //12
  weiche6.attach(11); //11
  weiche7.attach(10); //10
  
  
  Wire.begin();
  CS.initialize();
  
  CS.pinMode(11, OUTPUT);
  CS.pinMode(7, OUTPUT);
  CS.pinMode(0, OUTPUT);
  CS.pinMode(1, OUTPUT);
  CS.pinMode(2, OUTPUT);
  CS.pinMode(3, OUTPUT);
  CS.pinMode(15, OUTPUT);
  CS.pinMode(7, OUTPUT);
  
  CS.pinMode(9, INPUT); CS.pinPullup(9, HIGH);
  CS.pinMode(8, INPUT); CS.pinPullup(8, HIGH);
  CS.pinMode(10, INPUT); CS.pinPullup(10, HIGH);
  CS.pinMode(6, INPUT); CS.pinPullup(6, HIGH);
  CS.pinMode(5, INPUT); CS.pinPullup(5, HIGH);
  CS.pinMode(4, INPUT); CS.pinPullup(4, HIGH);
  CS.pinMode(13, INPUT); CS.pinPullup(13, HIGH);
  CS.pinMode(14, INPUT); CS.pinPullup(14, HIGH);
  
  
  
  }

void loop() {
  
  taster9 = CS.digitalRead(9);
  taster8 = CS.digitalRead(8);
  taster10 = CS.digitalRead(10);
  taster6 = CS.digitalRead(6);
  taster5 = CS.digitalRead(5);
  taster4 = CS.digitalRead(4);
  taster13 = CS.digitalRead(13);
  taster14 = CS.digitalRead(14);
  
  
  // Ab hier werden die Fahrstraßen mit Hilfe von IF-Bedingungen gestellt
  
  // Fahrstraße HB - HBF1
  
  if (taster9 == LOW && taster6 == LOW) {
     delay(500);
     weiche1.slowmove(55,40); // abzweig
     delay(500);
     weiche6.slowmove(60,40); // gerade
     delay(500);
     CS.digitalWrite(11, HIGH);
     CS.digitalWrite(2, HIGH);
     CS.digitalWrite(0, HIGH);
     CS.digitalWrite(3, LOW);
     CS.digitalWrite(15, LOW);
     }
  
  // Fahstraße HB - HBF2
  if (taster9 == LOW && taster5 == LOW) {
     delay(500);
     weiche1.slowmove(100,40); // gerade
     delay(500);
     weiche7.slowmove (100, 40); // gerade 100 40
     delay(500);
     CS.digitalWrite(11, HIGH);
     CS.digitalWrite(3, HIGH);
     CS.digitalWrite(15, HIGH);
     CS.digitalWrite(2, LOW);
     CS.digitalWrite(0, LOW);
     }
     
  // Fahstraße HBF1 - HBF2 Umsezten
  if (taster6 == LOW && taster14 == LOW) {
     delay(500);
     weiche6.slowmove(100,40); // gerade
     delay(500);
     weiche7.slowmove(60,40); // gerade 60
     delay(500);
     CS.digitalWrite(2, HIGH);
     CS.digitalWrite(15, HIGH);
     //CS.digitalWrite(2, LOW);
     //CS.digitalWrite(0, LOW);
     }     
     
  // Fahstraße HBF2 - HbfEinfahrt
  if (taster14 == LOW && taster9 == LOW) {
     delay(500);
     weiche1.slowmove(100,40); // gerade
     delay(500);
     weiche7.slowmove(100,40); // gerade
     delay(500);
     CS.digitalWrite(11, HIGH);
     CS.digitalWrite(15, HIGH);
     CS.digitalWrite(3, HIGH);
     //CS.digitalWrite(2, LOW);
     //   
   }
}

Du hast die Taster nicht hardware-technisch entprellt, oder?

Wenn nein, mache es entweder/und mit Software-Bounce/Hardware-Entprellen

http://www.mikrocontroller.net/articles/Entprellung

Nein, habe ich nicht. Kann damit auch das Problem mit den Servos zusammenhängen?

Möglich, kann es hier gerade nicht reproduzieren. Aber Tasterprellen ist eine sehr nervige Sache. Die solltest du aufjedenfall entprellen. Du könntest mal die Taster ungedrückt lassen und die Befehle per Serial schicken.

Irgendwie sowas

// in setup() ergänzen
Serial.begin(9600);

//Oben in der loop()
byte incByte;
if(Serial.available >= 1) {
incByte = Serial.parseInt();
}

//im loop ersetzen
  if ((taster9 == LOW && taster5 == LOW) || incByte== 1) {

Nun Serial Monitor öffnen und 1 eingeben Enter...