Mit Hilfe eines Schalters soll die interne LED 13 an bzw. ausgeschalten werden.
Beachte: Der Schalter hat eine direkte Verbindung zum Pluspol, der Widerstand ist mit dem Minuspol verbunden. Was passiert, wenn man die Schaltung anders aufbaut, d.h. Plus- und Minuspol vertauscht wird?
Es gibt verschiedene Schalter: Bei einem Kippschalter hat man immer eine Verbindung des PINs; entweder zu 5V oder zu GND. Es liegt am PIN also immer eine definierte Spannung an. Anders, wenn man einen Schalter hat, der den Stromkreis einfach unterbricht. Dann kann es sein, dass der PIN gar nicht geerdet ist. Bei einer Messung kann man dann keine definierte Spannung messen.
Deshalb muss man hier mit Hilfe eines Spannungsteilers eine Sensorschaltung. vgl.
int led = 13; int schalter = 8; int buttonState = 0; void setup() { pinMode(led, OUTPUT); pinMode(schalter, INPUT); // Serial.begin(9600); } void loop() { buttonState = digitalRead(schalter); // Serial.print(buttonState); if (buttonState == HIGH) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } }
Vertauscht man am Mikroschalter den Plus- mit dem Minuspol verhält sich das Programm ganz merkwürdig. Warum? Informiere dich über die Möglichkeit über die serielle Schnittstelle Daten vom Arduino an den PC zu schicken.
Wann erhält der digitale Eingang ein HIGH bzw. LOW Signal?
Hier hat man mit der Möglichkeit Informationen über die Serielle Schnittstelle zu schicken das Programm (bzw. die Variablen) zu überprüfen.
Ändere das Programm so, dass das Licht beim 1. Betätigen des Schalters an und beim nächsten Betätigen aus geschalten wird.
Dies hört sich einfach an, doch sieht man, dass das folgende Programm nicht funktionieren kann. Es gibt zwei Probleme:
Lösung: LED soll nur geschalten werden, wenn die letzte Buttonveränderung (Buttonzustand) eine "Weile" zurückliegt.
const int buttonPin = 2; const int ledPin = 8; int buttonState = 0; int ledState = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop(){ buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { if(ledState ==0){ digitalWrite(ledPin, HIGH); ledState=1; } else { digitalWrite(ledPin, LOW); ledState=0; } } }
const int buttonPin = 2; const int ledPin = 8; int buttonState = 0; int ledState = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop(){ buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { delay(10); if(buttonState== digitalRead(buttonPin)){ if(ledState ==0){ digitalWrite(ledPin, HIGH); ledState=1; } else { digitalWrite(ledPin, LOW); ledState=0; } } } }
Im folgenden Programm wird gemessen, wieviel Millisekunden der Schalter betätigt wird. Man sieht, dass ein kurzes Drücken des Schalters mindestens 50 ms dauert. In dieser Zeit wird der Pin bis zu 5000 mal abgefragt. Es ist also ein kleines Glücksspiel, was das Ergebnis der letzten Abfrage ausschaut.
const int buttonPin = 7; int buttonStateNeu = 0; int buttonStateAlt = 0; long wechselZeit = 0; long i=0; void setup(){ pinMode(buttonPin, INPUT); Serial.begin(9600); wechselZeit = millis(); } void loop(){ buttonStateNeu = digitalRead(buttonPin); i++; // Schleifenzähler if(buttonStateNeu != buttonStateAlt){ Serial.print(buttonStateAlt); Serial.print("\t Anzahl: "); Serial.print(i); Serial.print("\t Zeitdauer: "); Serial.println(millis()-wechselZeit); // neu definieren wechselZeit = millis(); buttonStateAlt = buttonStateNeu; i=0; } }// ende loop
Die LED soll nur reagieren, falls der letzte Lichtwechsel länger als ein bestimmtes Intervall (z.B. 500ms) zurückliegt. Dadurch soll vermieden werden, dass die LED in kürzester Folge an und ausgeschalten werden kann.
const int buttonPin = 7; const int ledPin = 13; int buttonState = 0; int ledState = 0; long wechselZeit = 0; // Variable für die Zeit, in der sich der Status der Lampe geändert hat. int intervall =500; // Intervall, so lange soll sich der Status der Lampe nicht ändern void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); Serial.begin(9600); } void loop(){ buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { if((millis()-wechselZeit)>intervall ){ wechselZeit = millis(); if(ledState==0){ digitalWrite(ledPin, HIGH); ledState=1; } else { digitalWrite(ledPin, LOW); ledState=0; } } } // ende ButtonState } // ende loop
Eine Lampe soll regelmäßig blinken. Eine 2. Lampe soll mit einem Mikroschalter an bzw. ausgeschalten werden (während die andere Lampe natürlich weiter blinkt).
const int buttonPin = 2; const int ledPin = 8; long aktuelleZeit= 0; long wechselZeit = 0; int intervall =2000; int buttonState = 0; int ledState = 0; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop(){ aktuelleZeit=millis(); if(aktuelleZeit - wechselZeit > intervall){ if(ledState ==0){ digitalWrite(ledPin, HIGH); ledState=1; } else { digitalWrite(ledPin, LOW); ledState=0; } wechselZeit= millis(); } buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { delay(10); if(buttonState== digitalRead(buttonPin)){ if(ledState ==0){ digitalWrite(ledPin, HIGH); ledState=1; } else { digitalWrite(ledPin, LOW); ledState=0; } wechselZeit= millis(); } } }