← Kapitel 9: Schwellwertschalter | ↑ Übersicht | 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:

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

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:

kapitel10_variable.ino
#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);
  }
}

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 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 die Musterlösung.

Bei dieser Aufgabe und beim Schwellwertschalter von Kapitel 9 kann es zu Problem am Umschaltpunkt kommen. Welche das sind lernen wir in:

Kapitel 11: Hysterese