Eine Steuerung für das Gewächshaus mit Arduino
Falls Sie die Menüsteuerung des in der Make 2/20 vorgestellten vollautomatischen Gewächshauses anpassen möchten, erfahren Sie hier, wie die Steuerung arbeitet.
Das Luxus-Pflanzenpflegeheim versorgt Ihre grünen Zimmergenossen vollautomatisch.
- Heinz Behling
Das Projekt eines Gewächshauses mit Arduino-Steuerung ist lediglich als Bauvorschlag gedacht und kann leicht an eigene Ansprüche angepasst werden. Insbesondere die Menüsteuerung läßt sich anpassen. Dazu erhalten Sie hier eine ausführliche Erklärung über den Aufbau und die Arbeitsweise der Menüsteuerung. Anhand der Einstellung der Solltemperatur im Inneren des Gewächshauses soll das Menü erläutert werden.
Nach dem Doppelklick landet man im Hauptmenü, wo mittels des Drehimpulsgebers durch das Menü gescrollt werden kann. Ein Ausschnitt davon ist in Listing 1 abgebildet.
Listing 1
while (Ebene != -1) {
rotating = false; //Debouncer resetten
switch (Ebene) {
case 0: //Hauptmenü Ebene 0 (Ebene)
if (Enc_A == true) {
counter[0] += 1;
Enc_A = false;
lcd.clear();
}
if (Enc_B == true) {
counter[0] -= 1;
Enc_B = false;
lcd.clear();
}
if (counter[0] > MAXCOUNTER[0]) {
counter[0] = 0;
lcd.clear();
}
if (counter[0] < 0) {
counter[0] = MAXCOUNTER[0];
lcd.clear();
}
switch (counter[0]) {//Durch Hauptmenü scrollen
case 0: //Eintrag 0 (Hauptmenü, Zurück) counter[0]
for (int i = 0; i <= 3; i++) {
lcd.setCursor(0, i);
if (counter[0] == i) {
lcd.write("|");
lcd.print(HauptMenueEntry[i]);
}
else {
lcd.write(" ");
lcd.print(HauptMenueEntry[i]);
}
}//for
if (pressed == true) {
pressed = false;
Ebene = -1; //Zurück zum Infobildschrim
lcd.clear();
}
break;
case 1: //Eintrag 1 (Hauptmenü, Temperatur) counter[0]
for (int i = 0; i <= 3; i++) {
lcd.setCursor(0, i);
if (counter[0] == i) {
lcd.write(">");
lcd.print(HauptMenueEntry[i]);
}
else {
lcd.write(" ");
lcd.print(HauptMenueEntry[i]);
}
}//for
if (pressed == true) {
pressed = false;
Ebene = 1; //Temperatur Untermenü
lcd.clear();
}
break;
case 2: //Eintrag 2 (Hauptmenü, Feuchtigkeit) counter[0]
...
case 3:
...
Das Menü läuft in einer while-Schleife so lange, bis der Schleifenparameter den Wert -1 annimmt. Die einzelnen Menüpunkte zur Einstellung der Temperatur, Luftfeuchtigkeit, Bewässerung etc. sind in der Switch-Case-Verzweigung mit dem Parameter Ebene aufgefädelt. Die einzelnen Cases sind wiederum die Anzeigen, die das Display ausgibt.
Pro Drehung des Encoders wird ein Zähler hoch- bzw. runtergezählt (siehe Zeilen 5 bis 14) und somit die einzelnen Menüelemente selektiert. Die Variablen Enc_A und Enc_B stehen für die Drehrichtungen und werden vom Interrupt auf true gesetzt. Anschließend werden sie in den jeweiligen Codeteilen wieder auf false zurückgesetzt, womit der Drehimpulsgeber entprellt wird. Über- beziehungsweise unterschreitet dieser Zähler die maximalen Menüeinträge, die für jedes Einzelmenü in der Konstante MAXCOUNTER gespeichert sind, springt der Zähler über (siehe Zeilen 15 bis 22) und das Menü fängt wieder von vorne beziehungsweise hinten an (umlaufend).
Videos by heise
Steht der Zähler counter[0] auf dem Wert 0, verzweigt das Menü in der switch-Anweisung aus Zeile 23 in den Case 0. In einer for-Schleife werden die ersten vier Menüeinträge angezeigt (das Display hat vier Zeilen!). Das oberste Element wird zusätzlich mit einer vorstehenden vertikalen Linie versehen (Zeile 28). Dadurch soll signalisiert werden, dass man beim Anwählen dieses Menüeintrags eine Ebene höher ins Menü kommt. Wird in diesem Fall der Taster gedrückt (Zeile 30), wechselt die Variable Ebene zu -1, das Menü wird verlassen und das Gewächshaus setzt seine normale Arbeit fort.
Ebenen
Hat die Variable counter[0] den Wert 1, springt die entsprechende switch-Anweisung in den Case 1, siehe Zeile 42. Die ersten vier Menüelemente werden angezeigt, wobei das aktuell selektierte mit einem >-Symbol versehen wird (Zeile 46). Wird an diesem Punkt der Taster gedrückt (Zeile 54) wird der Variable Ebene der Wert 1 zugewiesen und man gelangt ins Temperatur-Untermenü. Auf diese Weise können auch alle anderen Menüebenen vor- und zurück gescrollt werden.
Hat das Menü mehr Einträge als das Display Zeilen, muss bei dem entsprechenden Case (ab 4) die for-Schleife aus Zeile 25 von 4 bis 7 laufen, um die restlichen Elemente darzustellen. Sollte beim Nachbauen die Anzeige nicht ruhig an jedem Menüpunkt stehen bleiben, sondern hektisch durch die anderen Menüpunkte laufen, wurden sicherlich die break-Anweisungen nach jedem Case vergessen (Zeilen 41 und 59).