Digitaler Eingang

Ein Schalter wird an einen Pin angeschlossen, welcher als Eingang deklariert werden muss. Ein digitaler Eingang kann entweder den Zustand HIGH oder LOW haben. Ein typisches Bauteil ist ein Schalter, der entweder gerückt oder losgelassen sein kann. Den Schalter kann man auch als einen Widerstand betrachten, der entweder den Widerstand 0 Ω (Schalter gedrückt) oder einen unendlich großen Widerstand (Schalter losgelassen) hat.

Spannungsteiler

Alle analogen und digitalen Widerstände müssen über den Spannungsteiler angeschlossen werden, damit am Messpin ein klare definierte Spannung anliegt.

 

 

Warum braucht man einen Spannungsteiler?

Zunächst schließen wir am Arduino einen Button an. Wir verbinden den Button mit einem digitalen Pin und andererseits mit einem 5 V - Pin (mit dem GRN - Pin).

Es gibt 4 Fälle:
Welche Spannung müsste jeweils am Pin ablesbar sein?
Wir überprüfen dies, indem wir uns über die serielle Schnittstelle den Zustand des Pins anzeigen. Es ist besser, sich nur dann etwas anzeigen zu lassen, wenn sich der Zustand ändert.

 

Man stellt fest, dass der Zustand des Pins nur dann genau definiert ist, wenn der Button geschlossen ist. Ist der Schalter offen, so liegt der Buttonpin quasi in der "Luft". Der Zustand ist nicht genau definiert und seine Werte werden zufällig.

Deshalb muss der digitale Eingangspin an einem Spannungsteiler angeschlossen werden. Der Pin liegt also immer zwischen zwei Widerständen. Wobei einer der Widerstände ein Sensor ist. Im Falle des Schalters kann der Widerstand fast Null oder unendlich groß sein.

Bei anderen Sensoren (Temperatur, Licht, ...) sind aller Zwischenwerte denkbar; diese werden deshalb an einem analogen Port angeschlossen.

 

Beispielprogramm: Solange man den Schalter drückt, wird die interne LED Nr. 13 angeschalten.

int led = 13; // interne LED
int schalter = 8; // Pin, an der der Schalter angeschlossen ist
int buttonState = 0; // Variable für den Zustand des Schalters
 
void setup() {                
  pinMode(led, OUTPUT);      // LED-Pin wird als Ausgang deklariert
  pinMode(schalter, INPUT); // Button-Pin wird als Eingang deklariert
  Serial.begin(9600);     // serielle Kommunikation wird gestartet
}
void loop() {
  buttonState = digitalRead(schalter); // Einlesen des Pinzustandes und Abspeichern in der Variablen
  Serial.print(buttonState); // zusätzlich wird der Zustand über die serielle Schnittstelle ausgegeben
  if (buttonState == HIGH) {      // falls der Zustand HIGH (Schalter geschlossen) ist
    digitalWrite(led, HIGH);   }  // Lampe an
  else {
    digitalWrite(led, LOW);  } // Lampe aus
}

  Aufgabe 1: Drückt man den Schalter, so wird eine externe LED angeschalten.
  Aufgabe 2: Es soll die Anzahl gezählt werden, wie oft man auf den Schalter drückt.

Aufgabe 2: Es soll die Anzahl gezählt werden, wie oft man auf den Schalter drückt.

int led = 3;
int schalter = 8;
int buttonState = 0;  //aktueller Zustand
int buttonStateAlt = 0; // vorheriger Zustand
int anzahl = 0; // wie oft wurde der Schalter gedrückt
void setup() {
  pinMode(led, OUTPUT);
  pinMode(schalter, INPUT);
  Serial.begin(9600);
}
void loop() {
  buttonState = digitalRead(schalter); // einlesen des digitalen Einganges

  if ((buttonState != buttonStateAlt) ) { // hat sich der Zustand geändert
    if (buttonState == 1) { // wurde der Schalter gedrückt (also nicht losgelassen)
      anzahl = anzahl + 1;  // zähle 
      Serial.println(anzahl); // gib das Ergebnis aus
    }
    buttonStateAlt = buttonState; // speichere den aktuellen Zustand als den alten ab
  }
}

  Aufgabe 3: Einen Schalter zum Ein- und Ausschalten einer LED

4. Aufgabe: Verkehrsampel

Die Ampel soll ganz normal von Rot über Gelb nach Grün schalten. Wir der Schalter betätigt, so soll die rote LED sofort beginnen für 5 Sekunden 10 mal zu blinken.
 
  Aufgabe 4:Verkehrsampel

Aufgabe 4: Verkehrsampel

int gelb = 6;
int gruen = 5;
int rot = 3;
int schalter = 8; // PinNr des Schalters

int buttonState = 0;  //Zustand des Schalters (0 oder 1)

boolean fussgaenger = false;  // Ampel im Fussgänger/Auto -zustand
unsigned long start;  // Variable für Millisekunden

void setup() {
  pinMode(rot, OUTPUT);
  pinMode(gelb, OUTPUT);
  pinMode(gruen, OUTPUT);
  pinMode(schalter, INPUT);
  start = millis();   // speichert die Zeit seit Programmstart in der Variablen ab
}

void loop() {

  buttonState = digitalRead(schalter); // einlesen des digitalen Einganges (Druckknopf)
  if (buttonState == 1) { // wenn Schalter gedrückt wird
    fussgaenger = true;  // Für Fussgänger schalten
  }

  if ( fussgaenger == false) {   // falls die Fussgängerampel noch nicht gedrückt ist
    if ((millis() - start) < 1000) {  // 0 < start < 1000
      ampelschaltung(1, 0, 0); // rot
    }
    if ((millis() - start) > 1000 && (millis() - start) < 2000) { // 1000 < start < 2000
      ampelschaltung(1, 1, 0);                                     // rot-gelb
    }
    if ((millis() - start) > 2000 && (millis() - start) < 3000) { // 2000 < start < 3000
      ampelschaltung(0, 0, 1);                                    // grün
    }
    if ((millis() - start) > 3000 && (millis() - start) < 4000) { // 3000 < start < 4000
      ampelschaltung(0, 1, 0);                                    // gelb
    }
    if (millis() - start > 4000) {       // 4000 < start
      start = millis();                  // Zeit zurücksetzen
    }
  } // ende if fussgaenger== false
  else {  // Fussgängerampel gedrückt
    fussgaengerschaltung();  // Fussgänger programm aufrufen
    start = millis();        // danach Zeit wieder auf start setzen
    fussgaenger = false;    // Fussgängerampel ausschalten
  }  // ende els
} // ende loop

void fussgaengerschaltung() {
  digitalWrite(rot, LOW);      // rot ausschalten
  digitalWrite(gelb, LOW);     // gelb ausschalten
  digitalWrite(gruen, LOW);     // grün ausschalten
  for (int i = 0 ; i < 10; i++) {    // rote LED soll 10x für 5 Sekunden blinken
    digitalWrite(rot, HIGH);        // rot an
    delay(250);
    digitalWrite(rot, LOW);        // rot aus
    delay(250);
  }
}  // ende void fussgaengerschaltung


void ampelschaltung(boolean ro, boolean ge, boolean gr) {
  if (ro == 1) { // schaltet rot
    digitalWrite(rot, HIGH);
  } else {
    digitalWrite(rot, LOW);
  }
  if (ge == 1) {// schaltet gelb
    digitalWrite(gelb, HIGH);
  } else {
    digitalWrite(gelb, LOW);
  }
  if (gr == 1) {// schaltet gruen
    digitalWrite(gruen, HIGH);
  } else {
    digitalWrite(gruen, LOW);
  }
} // ende void ampelschaltung

Fehler finden

Leider haben sich in die Versuche einige Fehler eingeschlichen.