Mikroschalter

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.

1. Aufgabe

Schalte die interne LED (Pin13) mit Hilfe des Schalters.

Quelltext

Mikroschalter

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);  }
}

2. Aufgabe

Schalte eine externe LED mit Hilfe des Schalters.

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.

3. Aufgabe: Ein Schalter zum ein- und ausschalten.

Ä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:

  1. Der Schalter prellt, d.h. wird ein Schalter gedrückt, so kann es passieren, dass die mechanischen Teile des Schalters nachschwingen, d.h. in kurzer Folge der Kontakt wieder offen ist.
  2. Drücken wir den Schalter, so wird er auch mit großer Mühe mindestens 40 -50 ms gedrückt werden. In dieser Zeit erfolgt aber ca. 5000 mal eine Abfrage durch den Mikrocontroller. Bei jeder Abfrage und bei jeweils gedrücktem Schalter, wird die LED abwechseld ein- bzw. ausgeschalten.
    Welchen Zustand dann unsere LED hat gleicht einem Glückspiel, wie die letzte Abfrage ausgesehen hat.

Lösung: LED soll nur geschalten werden, wenn die letzte Buttonveränderung (Buttonzustand) eine "Weile" zurückliegt. 

1. Versuch: Quelltext

1. Versuch: funktioniert leider so nicht

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;    
    }
  } 
}

Worin liegt der Unterschied?

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;    
    }
  } 
  }
}

Wie lange wird der Schalter betätigt?

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. 

Quelltext
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.

Quelltext
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

Zusatzaufgabe 2

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).

Quelltext