Probleme mit Switches

Hallo,

ich habe gestern meine ersten Experimente mit dem Arduino Nano angefangen. Soweit habe ich bisher noch keine Erfahrungen mit Elektronik gesammelt und kenne daher nur die absoluten Basics. Zum Testen habe ich eine Platine mit Switches verwendet, die alle direkt an GND angeschlossen sind. Dadurch kann ich den Status dann ja nicht über den Digitalpin auslesen, da ja dann kein Strom fließt, wenn ich das richtig verstaanden habe? - Zumindest hats nicht geklappt ^^

Zum auslesen habe ich folgendes Sketch geschrieben:

const int forwardSwitch  = A4;
const int backSwitch     = A3;
const int dpiDec         = A2;
const int dpiInc         = A1;

const int ledPin         = 13;

int clockTime = millis();

void setup()
{ 
  pinMode(ledPin, OUTPUT);
  
  Serial.begin(9600);
  Serial.println("Starting");
}

void loop()
{
  int curTime = millis();
  
  if(curTime - clockTime >= 50)
  {
    int buttonStates[4];
    
    buttonStates[0] = analogRead(forwardSwitch);
    buttonStates[1] = analogRead(backSwitch);
    buttonStates[2] = analogRead(dpiDec);
    buttonStates[3] = analogRead(dpiInc);
    
    boolean ledState = false;
    
    for(int i = 0; i < 4; i++)
    {
       if(buttonStates[i] == 0) {
           ledState = true;
           
           Serial.print(i);
           Serial.println(" is HIGH");
       }
    }
    
    if(ledState) {
       digitalWrite(ledPin, HIGH); 
    }
    else {
       digitalWrite(ledPin, LOW);  
    }
    
    clockTime = millis();
  }
}

Damit habe ich jetzt allerdings das Problem, das wenn ich die Zustände zu schnell abfrage, dass ich Falsche Werte von den anderen Switches bekomme. Also wenn ich z.B. alle 20ms abfrage und Switch 1 gedrückt habe, bekomme ich ab und zu von Switch 2 ebenfalls die Meldung das dieser gedrückt sei, was jedoch nicht stimmt... Ohne Delay Spinnen die werte dann komplett. Woran liegt das?

Lass das mit analogRead() sein.

Wenn du die Taster an GND anschließt musst du den Pin über einen Widerstand an 5V anschließen damit du ein definiertes Potential hast.

Diese Widerstände nennen sich Pullups und sind auch dem Prozessor integriert:

Oder als Schaltbild:

(wobei der Widerstand wie gesagt entfallen kann wenn bei pinMode() INPUT_PULLUP macht)

Der Pin ist dann High wenn nicht gedrückt und Low wenn gedrückt.

Man kann die Taster auch gegen 5V schalten. Dann braucht man einen Pulldown gegen Masse:
http://www.honorlevel.com/data/Arduino/images/pullDownResistor.jpg
Dann ist der Pin Low wenn nicht gedrückt und High wenn gedrückt.

Und dass du unsinnige Wert bekommst, liegt auch bei der Abfrage mit digitalRead() an Taster-Prellen der mechanischen Kontakte:

Mit einem kurzen delay() von ein paar ms nach der Abfrage kann man das überspringen. Aufwendigerer nicht-blockierender Code dazu gibt es hier:

Oder als Library:
https://www.pjrc.com/teensy/td_libs_Bounce.html

Und wenn millis() im Spiel sind musst du immer den Datentyp "unsigned long" verwenden (siehe Reference: Millis.
Du verwendest den Datentyp "int", da wird es nach kurzer Zeit zu Fehlern kommen.

Udo