Einführung
Das Konzept der ➨Funktionen ist ein gutes Werkzeug zur Strukturierung eines Programms. Häufig verwendete Programmteile müssen nur einmal erstellt werden. Sie können dann an beliebiger Stelle im Programm aufgerufen werden. Eine Funktion kann einen Befehl ausführen und eine Variable an die Stelle zurückgeben (return), von der sie aufgerufen wurde oder lediglich eine Folge von Befehlen "abarbeiten".
Klassen und deren Objekte sind eine Weiterentwicklung der Funktionen.
Variablen besitzen vordefinierte Typen:int
, float
, char
, String
Ein Objekt muss als eine Art "Bauplan" programmiert werden. In der objektorientierten Programmierung wird dieser Objekttyp Klasse genannt.
Am Beispiel eines Zufallsgenerator soll das Prinzip erklärt werden.
Beispiel Zufallszahlen generieren
class
Zunächst wird die Klasse mit dem Schlüsselwort class eingeleitet. Anschließend werden die notwendigen Variablen für den Zahlenraum definiert, in dem die Zufallszahlen ermittelt werden sollen.
// Definition der Klasse
class Zufall
{
// Variablen der Klasse
int Minimum;
int Maximum;
Konstruktor
Der Konstruktor übermittelt dem später erzeugten Objekt einige Informationen. Der Konstruktor kann auf die Attribute (Variablen) einer Klasse zugreifen.Er wird genauso wie eine normale Methode definiert, jedoch ohne das Schlüsselwort void.
Das Schlüsselwort public teilt der Klasse mit, dass sie auf Methoden und Attribute zugreifen darf.
// Konstruktor
public:
Zufall(int minimumZahl, int maximumZahl)
{
Minimum = minimumZahl;
Maximum = maximumZahl;
}
Methode
Funktionen innerhalb einer Klasse werden Methoden genannt. Die Methode Zufallszahl() ermittelt eine Zufallszahl.
Die Definition der Klasse wird mit einem ; abgeschlossen.
// Funktion Zufallszahl
int Zufallszahl()
{
int Zahl = random(Minimum, Maximum);
return Zahl;
}
};
Objekte erzeugen
Wie an einem Abreißblock können Objekte der Klasse Zufall erzeugt werden. Als Parameter wird dem Objekt die kleinste und die größte Zahl des Zahlenraums übergeben.
/*
neue Objekte der Klasse Zufall erzeugen
Parameter: Minimum und Maximum des Zahlenraums der Zufallszahlen
random rundet immer nach unten
-> Zahlenraum um 1 erhöhen
*/
Zufall ersteZufallsZahl(1, 7);
Zufall zweiteZufallsZahl(10, 21);
Zufall dritteZufallsZahl(100, 201);
Das Programm
Objekt und Methode der Klasse werden durch einen . getrennt.
// Definition der Klasse
class Zufall
{
// Variablen der Klasse
int Minimum;
int Maximum;
// Konstruktor
public:
Zufall(int minimumZahl, int maximumZahl)
{
Minimum = minimumZahl;
Maximum = maximumZahl;
}
// Funktion Zufallszahl
int Zufallszahl()
{
int Zahl = random(Minimum, Maximum);
return Zahl;
}
};
/*
neue Objekte der Klasse Zufall erzeugen
Parameter: Minimum und Maximum des Zahlenraums der Zufallszahlen
random rundet immer nach unten
-> Zahlenraum um 1 erhöhen
*/
Zufall ersteZufallsZahl(1, 7);
Zufall zweiteZufallsZahl(10, 21);
Zufall dritteZufallsZahl(100, 201);
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println("Zahl zwischen 1 und 6: " + String(ersteZufallsZahl.Zufallszahl()));
Serial.println("Zahl zwischen 10 und 20: " + String(zweiteZufallsZahl.Zufallszahl()));
Serial.println("Zahl zwischen 100 und 200: " + String(dritteZufallsZahl.Zufallszahl()));
delay(1000);
Serial.println("------------------------------");
Serial.println("Neue Zahlen");
Serial.println("------------------------------");
}
Beispiel Blinklichter
Das Programm im Film
Erläuterung des Programms
Das Programm erstellt eine Klasse Blinklicht, die Methode Blinken sorgt für das Ein- und Ausschalten der LED für variable Zeitspannen.
Beachte die Kommentare.
// Definition der Klasse
class Blinklicht
{
/*
Variablen der Klasse
LEDPin = digitaler Pin der LED
ZeitEingeschaltet = Einschaltdauer der LED
ZeitAusgeschaltet = Ausschaltdauer der LED
*/
int LEDPin;
long ZeitEingeschaltet;
long ZeitAusgeschaltet;
// Status der LED (ein/aus)
int LEDStatus;
// gesicherte Zeit, wird für die Ermittlung der Ein- und Ausschaltdauer benötigt
unsigned long gesicherteZeit;
// Konstruktor
public:
Blinklicht(int PinMummer, long einGeschaltet, long ausGeschaltet)
{
LEDPin = PinMummer;
pinMode(LEDPin, OUTPUT);
ZeitEingeschaltet = einGeschaltet;
ZeitAusgeschaltet = ausGeschaltet;
LEDStatus = LOW;
gesicherteZeit = 0;
}
void Blinken()
{
// aktuelle Zeit ermitteln
unsigned long aktuelleZeit = millis();
/*
wenn die LED eingeschaltet ist
und (&&) die Zeitdifferenz zwischen der aktuellen Zeit und der zuvor gesicherten Zeit
größer als die Einschaltdauer ist
-> LED ausschalten und aktuelle Zeit für den nächsten Durchlauf sichern
*/
if ((LEDStatus == HIGH) && (aktuelleZeit - gesicherteZeit > ZeitEingeschaltet))
{
LEDStatus = LOW;
gesicherteZeit = aktuelleZeit;
digitalWrite(LEDPin, LEDStatus);
}
/*
wenn die LED ausgeschaltet ist
und (&&) die Zeitdifferenz zwischen der aktuellen Zeit und der zuvor gesicherten Zeit
größer als die Ausschaltdauer ist
-> LED einschalten und aktuelle Zeit für den nächsten Durchlauf sichern
*/
else if ((LEDStatus == LOW) && (aktuelleZeit - gesicherteZeit > ZeitAusgeschaltet))
{
LEDStatus = HIGH;
gesicherteZeit = aktuelleZeit;
digitalWrite(LEDPin, LEDStatus); }
}
};
// neue Objekte der Klasse Blinklicht erzeugen, zwei LEDs an Pin 6 und 7
// Parameter: Pin, Dauer eingeschaltet, Dauer ausgeschaltet
Blinklicht led1(6 100, 400);
Blinklicht led2(7, 350, 350);
void setup()
{
// bleibt leer
}
// Objekt und Methode durch . getrennt
void loop()
{
led1.Blinken();
led2.Blinken();
}
Beispiel Blinklicht mit einem Array
class Led
{
int LedPin;
bool StatusLED;
public:
Led(byte PinNummer)
{
LedPin = PinNummer;
StatusLED = false;
pinMode(LedPin, OUTPUT);
}
// Methoden der Klasse
void Blinken()
{
digitalWrite(LedPin, HIGH);
delay(200);
digitalWrite(LedPin, LOW);
delay(200);
}
void EinAus()
{
StatusLED = !StatusLED;
digitalWrite(LedPin, StatusLED);
delay(200);
}
};
// Array mit den Pins der LEDs
Led ListeLED[] = {Led(3), Led(4), Led(5), Led(6), Led(7), Led(8), Led(9)};
void setup()
{
// bleibt leer
}
void loop()
{
// alle LEDs blinken nacheinander
for (int i = 0; i < sizeof(ListeLED) / sizeof(ListeLED[0]); i++)
{
ListeLED[i].Blinken();
}
// Lauflicht
for (int i = 0; i < sizeof(ListeLED) / sizeof(ListeLED[0]); i++)
{
ListeLED[i].EinAus();
}
}
Quellen
- https://spacehal.github.io/docs/arduino/objectOriented
- https://wolles-elektronikkiste.de/bibliotheken-und-klassen-erstellen-teil-i
Letzte Aktualisierung: