Google-Suche auf MEINE-SCHALTUNG.de :
|
Dauerkalender |
Arduino - EntscheidungenIf - AnweisungPraktisch in jedem Sketch müssen Entscheidungen getroffen werden. Wenn bestimmte
Werte erreicht, Grenzwerte überschritten oder Toleranzen verlassen werden, muss das Programm
entsprechend reagieren. Die bekannteste und am häufigsten verwendete Abfrage wird mit der
If-Anweisung realisiert. Sobald ein Sketch auf diese Anweisung stößt, wird der Vergleich, der
in Klammern angegeben wurde, durchgeführt. Ist das Ergebnis der Abfrage wahr, werden die
Anweisungen in den geschweiften Klammern {} ausgeführt. Ist das Ergebnis der Abfrage falsch,
wird mit dem Programmcode nach der If-Anweisung fortgesetzt. Somit nehmen die If-Anweisungen
einen direkten Einfluss auf die Programmsteuerung.
Hier ein Beispiel mit einer If-Abfrage:
// ----------------------------------------------------------
// If-Anweisung
float Temperatur;
float Umrechnungsfaktor = 30;
const int HeizungEinAus = 35;
void setup() {
pinMode (HeizungEinAus, OUTPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite (HeizungEinAus, LOW);
Temperatur = analogRead(0) / Umrechnungsfaktor;
Serial.print ("Aktuelle Temperatur beträgt ");
Serial.print (Temperatur);
Serial.println (" °C.");
if (Temperatur < 17)
{
digitalWrite (HeizungEinAus, HIGH);
Serial.println ("Heizung wurde eingeschaltet");
}
delay(1000);
}
// ----------------------------------------------------------
Hier werden zunächst die im Programm benötigten Größen definiert:
float Temperatur;
float Umrechnungsfaktor = 30;
const int HeizungEinAus = 35;
Die aktuelle Temperatur wird in der Variable Temperatur gespeichert. Der Umrechnungsfaktor
ist hier eine beliebige Größe, die als Beispiel eingeführt wurde. In einem "echten Programm"
muss diese Variable passend zu den Werten des analogen Eingangs, an dem z.B. ein
temperaturabhängiger Widerstand angeschlossen wäre, skaliert werden. Mit
const int HeizungEinAus = 35;
haben wir eine Variable eingeführt, die die Nummer des Pins repräsentiert, mit dem wir eine Heizung
ansteuern.
Im void setup() wird der oben definierte Pin als Ausgang deklariert:
pinMode (HeizungEinAus, OUTPUT);
Mit
Serial.begin(9600);
aktivieren wir die Verbindung zu dem seriellen Monitor, um die Ergebnisse auf dem Bildschirm
betrachten zu können.
Sobald der eigentliche Sketch startet, wird die Heizung ausgeschaltet
digitalWrite (HeizungEinAus, LOW);
und die aktuelle Temperatur berechnet. Dies geschieht indem wir den Messwert des analogen
Eingangs auslesen und durch den Umrechnungsfaktor dividieren:
Temperatur = analogRead(0) / Umrechnungsfaktor;.
Als Ergebnis bekommen wir folgende Meldung:
Aktuelle Temperatur beträgt 22.13 °C.
Der Temperaturwert ist hier natürlich von dem am analogen Eingang eingelesenen Wert abhängig.
Anschließend wird die If-Anweisung ausgeführt. Sobald die Temperatur die eingestellte Schwelle
unterschreitet, bekommen wir die Meldung
Heizung wurde eingeschaltet
und die Variable HeizungEinAus
wird mit dem Wert HIGH überschrieben. Damit wird die Heizung eingeschaltet.
Der Sketch wird im Takt von 1 Sek. wiederholt. Sobald die Temperatur wieder ansteigt und
die Schwelle überschreitet, wird die Heizung wieder ausgeschaltet. So funktioniert übrigens
eine ganz einfache Zwei-Punkt-Regelung.
If - Else - AnweisungDie If-Else-Anweisung stellt eine erweiterte Form der If-Anweisung dar. Mit der
Anweisung Else wird der If-Anweisung noch eine weitere Aktion hinzugefügt. Der Unterschied
besteht darin, dass nach der nicht erfüllten If-Abfrage, das Programm die Anweisungen, die
in den geschweiften Klammern {} hinter der Anweisung Else stehen, ausführt. Unser
umgeschriebener Sketch sieht jetzt so aus:
// ----------------------------------------------------------
// If-Else-Anweisung
float Temperatur;
float Umrechnungsfaktor = 30;
const int HeizungEinAus = 35;
void setup() {
pinMode (HeizungEinAus, OUTPUT);
Serial.begin(9600);
}
void loop() {
Temperatur = analogRead(0) / Umrechnungsfaktor;
Serial.print ("Aktuelle Temperatur beträgt ");
Serial.print (Temperatur);
Serial.println (" °C.");
if (Temperatur < 17)
{
digitalWrite (HeizungEinAus, HIGH);
Serial.println ("Heizung wurde eingeschaltet");
}
else
{
digitalWrite (HeizungEinAus, LOW);
}
delay(1000);
}
// ----------------------------------------------------------
Switch - Case - AnweisungBis jetzt wurde unsere Variable "Temperatur" auf zwei Zustände untersucht. Um
die Heizung ein- bzw. auszuschalten, wollten wir wissen, ob "Temperatur" über oder unter dem
angegebenen Schwellenwert lag. Solche If-Abfragen können wir auch dann anwenden, wenn eine
Variable auf mehrere Zustände überprüft werden muss. Doch für solche Fälle gibt es eine viel
elegantere Lösung: Die switch-case-Abfrage.
Um die Struktur und Funktionalität einer switch-case-Abfrage zu verdeutlichen, erweitern wir
unsere Temperatursteuerung um einen Kühlaggregat. Jetzt wollen wir nicht nur eine Heizung
zuschalten, wenn es zu kalt wird, sondern auch einen Kühlaggregat, wenn es zu warm wird.
Ein Sketch, mit dem wir diese Aufgabe erledigen und in dem eine switch-case-Abfrage vorkommt,
könnte wie folgt aussehen:
// ----------------------------------------------------------
// Switch-Case-Anweisung
float Temperatur;
float Umrechnungsfaktor = 30;
const int HeizungEinAus = 35;
const int KuehlungEinAus = 36;
void setup() {
pinMode (HeizungEinAus, OUTPUT);
pinMode (KuehlungEinAus, OUTPUT);
Serial.begin(9600);
}
void loop() {
Temperatur = analogRead(0) / Umrechnungsfaktor;
Serial.print ("Aktuelle Temperatur beträgt ");
Serial.print (Temperatur);
Serial.println (" °C.");
int IntTemp = Temperatur;
switch (IntTemp) {
case 0 ... 16: {
digitalWrite (HeizungEinAus, HIGH);
digitalWrite (KuehlungEinAus, LOW);
Serial.println ("Heizung wurde eingeschaltet");
break;
}
case 17 ... 20 : {
digitalWrite (HeizungEinAus, LOW);
digitalWrite (KuehlungEinAus, LOW);
break;
}
case 21 : {
Serial.println ("Das ist meine bevorzugte Umgebungstemperatur.");
break;
}
case 22 ... 24 : {
digitalWrite (HeizungEinAus, LOW);
digitalWrite (KuehlungEinAus, LOW);
break;
}
case 25 ... 35: {
digitalWrite (HeizungEinAus, LOW);
digitalWrite (KuehlungEinAus, HIGH);
Serial.println ("Kühlung wurde eingeschaltet");
break;
}
}
delay(1000);
}
// ----------------------------------------------------------
Kurz vor der Switch-Anweisung taucht die Variable IntTemp auf. Diese Variable ist
nur dazu da, den float-Wert der Temperatur in eine Integer-Zahl, mit der die Switch-Anweisung
arbeiten kann, umzuwandeln. Es wird anschließend untersucht, im welchen Bereich sich der
aktuelle Temperaturwert befindet. Sobald eine Bedingung erfüllt ist, wird der Programmcode
in den zugehörigen geschweiften Klammern {} ausgeführt. Mit break wird dann die Switch-Abfrage
abgebrochen und nach 1 Sek. erneut ausgeführt.
Google-Suche auf MEINE-SCHALTUNG.de :
|
|