Die einfachste Variante haben wir bisher immer benutzt, ohne Sie mal genauer vorzustellen. Das holen wir jetzt nach. Ein Schalter hat normalerweise 2 Zustände (die anderen Schalterarten lassen sich fast immer auf mehrere Schalter von diesem Typ zurück bilden), an und aus. Diese müssen wir nun in die 2 Zustände einer MCU abbilden, 0 und 1. Intuitiv würde jeder sagen, 0 ist offen und 1 ist geschlossen.
Schaltungstechnisch würde das so aussehen:
Das funktioniert auch. Der Code dazu sieht dann so aus:
const byte SWITCH = 0; void setup() { pinMode(SWITCH , INPUT); } void loop() { if (digitalRead(SWITCH) == 1) { // Schalter geschaltet } }
WICHTIG: Ein Taster/Schalter prellt immer. d.h. wenn die Verarbeitung sehr schnell geht, kann es passieren das der gleiche Tastendruck mehrfach ausgewertet wird. Deswegen sollte man immer noch dem Lesen des Schalters eine kleine Pause einlegen. Hier wäre der richtige Ort z.B. einen delay(50) zu machen. Das reicht meistens schon aus.
Es gibt aber auch die andere Möglichkeit:
Hier wird der Schalter gegen Masse geschaltet. Das hat manchmal Vorteile. Denn Masse hat man meistens sowieso immer zur Verfügung. +V dagegen eher nicht so oft. Dann kann man diese Schaltung hier verwenden. Man beachte aber, Geschaltet bedeutet jetzt 0, ungeschaltet 1. Programm dazu:
const byte SWITCH = 0; void setup() { pinMode(SWITCH , INPUT); } void loop() { if (digitalRead(SWITCH) == 0) { // Schalter geschaltet } }
Bei den AVR's gibt es eine Besonderheit. Die Ports haben einen PullupWiderstand bereits eingebaut. Dieser wird aktiviert, wenn man auf einen Eingang mit dem Ausgangsbefehl eine logische 1 schreibt.
Die Schaltung vereinfacht sich zu:
und das Programm wird zu:
const byte SWITCH = 0; void setup() { pinMode(SWITCH , INPUT); digitalWrite(SWITCH, HIGH); } void loop() { if (digitalRead(SWITCH) == 0) { // Schalter geschaltet } }
Da das sehr oft gemacht wird, hat man im Arduino 1.0.1 die 2 Befehle in einem zusammengefasst. Und jetzt sieht das ganze so aus:
const byte SWITCH = 0; void setup() { pinMode(SWITCH , INPUT_PULLUP); } void loop() { if (digitalRead(SWITCH) == 0) { // Schalter geschaltet } }
Bei vielen Arduinos kann man die Analogeingänge auch als Digitaleingänge verwenden. Somit kann man dort auch einen Schalter anschliessen. Natürlich geht das auch analog.
const byte SWITCH = 0; void setup() { pinMode(SWITCH , INPUT); digitalWrite(SWITCH, HIGH); } void loop() { if (analogRead(SWITCH) < 10) { // Schalter geschaltet } }
Bei Benutzung der analogen Eingänge muss man immer mit etwas Drift ud Jitter rechnen. D.h. je nach Temperatur kann 0V auch mal 1 oder 2 sein. Und das kann zur Laufzeit variieren. Weiterhin kann man bemerken wenn man 2x den Eingang ließt, das man trotz gleicher Spannung meistens einen anderen Wert bekommt. D.h. bedeutet mann sollte bei der analogen Eingabe immer auf Schranken testen. Und nie auf feste Werte. So können wir natürlich einen Schalter abfragen. Aber mit einem analogen Eingang kann man in Bezug auf Schalter und Taster noch mehr machen.
Hier haben wir eine analoge Tastatur mit 5 Schaltern. Es gehen auch noch mehr, wenn man die Widerstandskette entsprechend berechnet. Aber immer bedenken, analoge Eingänge sind nicht digital.
Hier ist ein Joystick-ähnliches Gebilde dargestellt. Also Pfeiltasten und in der Mitte eine Selecttaste. Das Programm dazu sieht so aus:
int adc_key_val[5] ={ 30, 150, 360, 535, 760 }; int NUM_KEYS = 5; int adc_key_in; int key=-1; int oldkey=-1; void setup() { } void loop() { adc_key_in = analogRead(0); // read the value from the sensor key = get_key(adc_key_in); // convert into key press if (key != oldkey) // if keypress is detected { delay(50); // wait for debounce time adc_key_in = analogRead(0); // read the value from the sensor key = get_key(adc_key_in); // convert into key press if (key != oldkey) { oldkey = key; if (key >=0){ // Hier jetzt der eigentliche Programm switch (key) { case 0: // Rechts gedrückt // ... break; case 1: // Oben gedrückt // ... break; case 2: // Unten gedrückt // ... break; case 3: // Links gedrückt // ... break; case 4: // Select gedrückt // ... break; } } } } digitalWrite(13, LOW); } // Convert ADC value to key number int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS) k = -1; // No valid key pressed return k; }