[[uc-welt:gscheiduino:09-schwellwert|← Kapitel 9: Schwellwertschalter]] | [[uc-welt:gscheiduino:00-uebersicht|↑ Übersicht]] | [[uc-welt:gscheiduino:11-hysterese|Kapitel 11: Hysterese →]] ====== Kapitel 10: Übungsaufgabe Batterietester ====== Anstatt des Potis verwenden wir nun eine Standard-Alkali-Batterie, die wir gerne testen möchten. Der Aufbau sieht also wie folgt aus: {{:uc-welt:gscheiduino:gscheiduino_breadboard_kap10-batterie.png?direct&300|Aufbau Batterietester}} Der Batterietester soll die Spannung an der Batterie messen und anhand folgender Schwellen entscheiden: ^ Wert ^ Aktion ^ | Spannung < 1,3V | Batterie ist leer | | 1,3V < Spannung < 1,4V | Batterie ist gebraucht | | Spannung >1,4V | Batterie ist ok | ===== Zusätzliche Funktionen ===== ==== if-else if-else ==== Damit man die Aufgabe einfacher lösen kann erweitern wir vorher noch unser if-else-then-Statement. Es gibt nämlich nicht nur wenn-dann-sonst sondern diese Anweisung kann weiter verschachtelt werden: if(BEDINGUNG1) { #CODE1# } else if(BEDINGUNG2) { #CODE2# } else { #CODE3# } Der Ablauf sieht also so aus: Wenn Bedingung1 zutrifft wird Code1 ausgeführt. Ist Bedingung1 **false** wird Code1 übersprungen und die nächste Abfrage wird gestartet: Wenn Bedingung2 **true** ist, wird Code2 ausgeführt. Wenn diese Bedingung auch nicht zutrifft, wird Code3 ausgeführt. ==== Variablen ==== Zusätzlich lernen wir noch einen ganz wichtigen Punkt, wenn wir fortgeschrittene Programme wollen: **Variablen** Variablen sind etwas total tolles. Wie der Name schon sagt sind sie variabel, das heißt, ihr Wert ist nicht fest vorgegeben wie etwa bei einem #define. Wir verwenden in unserem Beispiel eine Variable, um den Wert von analogRead zu speichern. Damit wir die Variable verwenden können, müssen wir sie ganz oben bei den #defines definieren: int analogwert = 0; Nun wird für diese Variable ein Speicherbereich im RAM des Prozessors reserviert. Damit keine zufälligen Daten im Speicherbereich stehen belegen wir diesen bei der Definition mit dem Wert "0". Nun können wir in unserem Code der Variable Werte zuweisen, das funktioniert so: analogwert = 123; // Der Wert 123 wird zugewiesen analogwert = analogRead(ANALOGPIN); // Der gemessene Wandlerwert wird in die Variable geschrieben // Der Wert kann auch gelesen werden: if(analogwert < 100) { } Wenn wir zum Beispiel einen Wandlerwert des Analogeingangs öfter im Code benötigen, können wir ihn ganz am Anfang unserer loop()-Funktion in die Variable schreiben und dann mit der Variable weiterarbeiten. Der komplette Code sieht dann so aus: #define LED_ROT 13 #define LED_GRUEN 11 #define ANALOGPIN A0 int analogwert = 0; void setup() { pinMode(LED_ROT, OUTPUT); // Pin auf Ausgang pinMode(LED_GRUEN, OUTPUT); // Pin auf Ausgang pinMode(ANALOGPIN, INPUT); // Pin auf Eingang } void loop() { analogwert = analogRead(ANALOGPIN); if(analogwert>613) { digitalWrite(LED_ROT, HIGH); digitalWrite(LED_GRUEN, LOW); } else { digitalWrite(LED_ROT, LOW); digitalWrite(LED_GRUEN, HIGH); } } ===== Aufgabenstellung ===== Die Aufgabe lautet wie folgt: * Wenn die Batterie leer ist, soll die rote LED leuchten * Wenn die Batterie gebraucht ist, soll die gelbe LED leuchten * Wenn die Batterie ok ist, soll die grüne LED leuchten Wenn diese Aufgabe gelöst ist, können wir damit Batterien testen indem wir die zwei Kabel wie im Bild gezeigt an die Batterie halten. Um das Ganze ohne Batterie zu testen, können wir auch wieder das Poti wie in [[uc-welt:gscheiduino:08-analoginputs#praxis|Kapitel 8]] verwenden. Wenn wir es auf Anschlag gegen den Uhrzeigersinn drehen, sollte die rote LED leuchten. Bei langsamen drehen im Uhrzeigersinn leuchtet dann die gelbe und danach die grüne LED. Zur Kontrolle gibt es hier wieder [[uc-welt:gscheiduino:10-batterie-loesung|die Musterlösung]]. Bei dieser Aufgabe und beim Schwellwertschalter von [[uc-welt:gscheiduino:09-schwellwert|Kapitel 9]] kann es zu Problem am Umschaltpunkt kommen. Welche das sind lernen wir in: [[uc-welt:gscheiduino:11-hysterese|Kapitel 11: Hysterese]]