Der Initialisierungsvorgang
Wie bereits in der Programmplanung aufgezeigt, startet der Quellcode für den ESP32 mit dem Initialisierungsvorgang.
Dieser beinhaltet das Einbinden der Bibliotheken, das erstellen einzelner globaler Objekte der Bibliotheksklassen, das erzeugen von globalen Variablen und Konstanten sowie die "setup()"-Methode.
Im nächsten Teil folgen dann die "loop()"-Methode und die Methodendeklaration, welche die eigentliche Programmfunktion abbilden.
Grundsätzlich wird das Programm für den ESP32/Arduino von oben nach unten Zeile für Zeile durchlaufen. Die Besonderheit hierbei ist die "loop()"-Methode. Alles, was an Programmcode vor dieser Methode steht, zum Beispiel die Variablendeklaration, wird auch davor ausgeführt. Wenn die "loop()"-Methode einmal erreicht wurde, dann wird wiederholt nur noch diese Methode ausgeführt, bis der ESP32 neu gestartet wird oder beispielsweise durch bestimmte Befehle in den Ruhezustand versetzt wird.
Bevor man mit dem eigentlichen Initialisierungsvorgang starten ist es in der Praxis angebracht neben einer ordentlichen Kommentierung des Programmcodes, zu Beginn des Programmes einen kurzen Absatz mit einer prägnanten Beschreibung der Programmfunktion und Angaben wie Autor, Datum, Version, Firma etc. einzufügen. Ein Beispiel dafür könnte so aussehen:
/*
Dieses Programm dient der Steuerung der Unterbodenbeleuchtung eines T1-xplorers über einen ESP32 mittels eines Smartphones.
Der ESP32 und das Smartphone kommunizieren dabei über Bluetooth, was nur möglich ist, wenn der ESP32 vorher mit dem Smartphone
über dessen Bluetooth-Einstellungen gekoppelt wurde. Die Kommunikation erfolgt über das Versenden von Strings als Codewörter
beim Betätigen bestimmter Tasten auf dem Smartphone. Diese Strings werden vom ESP32 eingelesen und entsprechend verarbeitet,
sodass eine RGB-LED entsprechend angesteuert wird. Zur Funktion des Programmcodes auf einem ESP32 muss dieser erst ordnungsgemäß
in der Arduino IDE eingerichtet werden. Außerdem werden die Bibliotheken "OneWire", "DallasTemperature" und "BluetoothSerial"
benötigt.
Autor: Edgar Baal
Datum: 04.07.2021
Version V1.0
*/
Anschließend beginnt der Initialisierungsvorgang mit dem Einbinden der drei im vorherigen Abschnitt angesprochenen Bibliotheken und dem Erzeugen von Objekten aus Klassen dieser Bibliotheken:
/* Einbinden der Bibliotheken und Erzeugen von Instanzen */
#include <OneWire.h> //Einbinden der OneWire-Bibliothek
#include <DallasTemperture.h> //Einbinden der DallasTemperature-Bibliothek
#include <BluetoothSerial.h> //Einbinden der Bibliothek zur seriellen Kommunikation über Bluetooth
BluetoothSerial SerialBT; //Erzeugen einer Instanz der BluetoothSerial-Bibliothek
OneWire oneWire(32); //Festlegen von Pin 32 als OneWire-Bus-Instanz
DallasTemperature dallasTemp(&oneWire); //OneWire-Referenz wird der DallasTemoerature-Bibliothek übergeben
Mit dem OneWire erzeugen und diesem Pin 32 als Kommunikationspin zuweisen. Gleich im Anschluss daran, wird das erzeugte Objekt oneWire als Referenz (ein direkter Verweis auf das originale Objekt) &oneWire zur Erzeugung eines Objektes der Klasse DallasTemperature an deren Konstruktor übergeben. Ein Konstruktor einer Klasse ist diejenige Klassenmethode, die bei der Erzeugung eines Objektes aufgerufen wird und Argumente entgegennehmen kann. Auch beim erstellen des Objektes oneWire wurde ein Konstruktor aufgerufen, dem als Argument der Pin 32 übergeben wurde. Im nächsten Teil des Initialisierungsvorganges werden einzelne Konstanten und Variablen definiert, auf die das Programm später zurückgreift.
-Befehl fügst du eine Bibliothek in deinem Programm ein und kannst dann auf die darin enthaltenen Klassen und Methoden zugreifen. Davon machen wir auch direkt danach Gebrauch, indem wir das Objekt der Klasse/* Speichervariablen und Pinzuweisungen */
const int LED_R = 0; //Zuweisen von Pin 0 zur Ansteuerung der roten LED in der RGB-LED
const int LED_G = 2; //Zuweisen von Pin 2 zur Ansteuerung der grünen LED in der RGB-LED
const int LED_B = 15; //Zuweisen von Pin 15 zur Ansteuerung der blauen LED in der RGB-LED
const int R_channel = 0; //Setzen des Pulsweitenmodulations(PWM)-Channels der roten LED der RGB-LED auf Channel 0
const int G_channel = 1; //Setzen des PWM-Channels der grünen LED der RGB-LED auf Channel 1
const int B_channel = 2; //Setzen des PWM-Channels der blauen LED der RGB-LED auf Channel 2
const int pwm_frequency = 5000; //Setzen der PWM-Frequenz in Hz
const int pwm_resolution = 8; //Setzen der PWM-Auflösung in Bit(8 Bit entspricht 0 bis 255)
String order; //Erzeugen eines Strings zum zwischenspeichern der vom Smartphone gesendeten Befehle
char incomingChar; //Erzeugen einer Char-Variablen zum Zwischenspeichern der einzelnen Zeichen des order-Strings
int temp; //Erzeugen einer integer-Variablen zum Zwischenspeichern der gemessenen Temperaturwerte
Da der Programmcode umfangreich kommentiert wurde, werden nur noch auf einige spezielle Punkte bei den Variablen erläutert. Die ersten acht Werte sind Konstanten und alle von Typ integer, was an dem Begriff const int erkannt werden kann. Die Pinbelegung der drei LEDs der RGB-LED haben wir bereits beim Erstellen des Schaltplanes festgelegt, weshalb diese als Konstanten abgespeichert werden. Auch die PWM-Kanäle, von denen man für jede LED einen benötigen, ändern sich nicht und können als Konstanten festgelegt werden. Wie in dem Abschnitt zum ESP32 erklärt wurde, gibt es 16 PWM-Kanäle. Diese können mit den Ziffern 0 bis 15 angesprochen werden. Auch die PWM-Frequenz, welche wir mit 5000 Hz ausreichend groß wählen, um den Spannungsrippel klein zu halten und die Auflösung der PWM, welche man aufgrund des RGB-Farbraums von 0 bis 255 auf \( 8\,\mathrm{Bit} \Rightarrow 2^8=256 \) legen, sind beides konstante ganze Zahlen.
Die drei Variablen am Ende werden für das Zwischenspeichern von ausgelesenen Temperaturwerten über den DS18B20 und eingelesenen Befehlen über die Bluetooth-Schnittstelle benötigt. Der incomingChar dient der iterativen Erfassung der einzelnen Buchstaben eines an der Bluetooth-Schnittstelle anliegenden String und die order ist der stückchenweise über den char eingelesene, vom Smartphone versendete Befehl.
Als abschließender Teil des Initialisierungsvorgangs folgt dann die void setup()-Methode. Diese wird beim Hochfahren des ESP32 nur einmal durchlaufen und beinhaltet den Start der seriellen Kommunikation, und das Einrichten und Zuweisen der PWM-Kanäle.
/* Pininitialisierung, parametrieren der PWM-Kanäle und starten der Bluetooth-Verbindung */
void setup() //Diese Funktion wird vor dem Schleifenbetrieb der loop()-Funktion einmalig durchlaufen
{
Serial.begin(115200); //Initialisieren der seriellen Kommunikation mit einer Baud-Rate von 115200 (notwendig für Bluetooth)
SerialBT.begin("T1-RGB Tuning"); //Initialisieren eines BluetoothSerial-Gerätes mit dem Namen T1-RGB Tuning
dallasTemp.begin(); //Kommunikation mit der Temperatur-Elektrode über den Datenpin 32 wird hochgefahren
ledcAttachPin(LED_R, R_channel); //Festlegen von Pin und Channel des PWM-Signals der roten LED der RGB-LED
ledcAttachPin(LED_G, G_channel); //Festlegen von Pin und Channel des PWM-Signals der grünen LED der RGB-LED
ledcAttachPin(LED_B, B_channel); //Festlegen von Pin und Channel des PWM-Signals der blauen LED der RGB-LED
ledcSetup(R_channel, pwm_frequency, pwm_resolution); //Setzen von PWM-Frequenz und PWM-Auflösung der roten LED der RGB-LED
ledcSetup(G_channel, pwm_frequency, pwm_resolution); //Setzen von PWM-Frequenz und PWM-Auflösung der grünen LED der RGB-LED
ledcSetup(B_channel, pwm_frequency, pwm_resolution); //Setzen von PWM-Frequenz und PWM-Auflösung der blauen LED der RGB-LED
}
Für die Bluetooth-Kommunikation ist es essentiell die serielle Kommunikation mit einer Baud-Rate von 115200 einzurichten. Dies wird mittels Serial.begin(115200); erreicht. SerialBT.begin("T1-RGB Tuning"); sorgt dafür, dass der ESP32 nach außen hin für andere Bluetooth-Geräte mit dem Namen "T1-RGB Tuning" sichtbar ist und sich das Smartphone bereits mit diesem koppeln kann. Die Kommunikation mit dem DS18B20 wird über dallasTemp.begin(); hochgefahren. Die Methode ledcAttachPin(Pin-LED, PWM-Kanal); benötigt als Argumente den Pin der LED und den PWM-Kanal, der diesem LED-Pin zugewiesen werden soll. Die Methode ledcSetup(PWM-Kanal, PWM-Frequenz, PWM-Auflösung); hingegen weist dem jeweiligen PWM-Kanal die dementsprechende PWM-Auflösung und PWM-Frequenz zu. Da wir drei einzelne PWM-Kanäle benötigen, die alle mit derselben Frequenz und derselben Auflösung arbeiten, müssen beide der eben vorgestellten Methoden dreimal angewendet werden. Beide dieser Methoden sind standardmäßig in der Arduino IDE verfügbar, gehören als zu keiner der hinzugefügten Bibliotheken.
Damit ist der Initialisierungsvorgang beendet und das Programm geht in den Loop über.
Abschließend hier nochmal der Vollständige Code des Initialisierungsvorgangs:
/*
Dieses Programm dient der Steuerung der Unterbodenbeleuchtung eines T1-xplorers über einen ESP32 mittels eines Smartphones.
Der ESP32 und das Smartphone kommunizieren dabei über Bluetooth, was nur möglich ist, wenn der ESP32 vorher mit dem Smartphone
über dessen Bluetooth-Einstellungen gekoppelt wurde. Die Kommunikation erfolgt über das Versenden von Strings als Codewörter
beim Betätigen bestimmter Tasten auf dem Smartphone. Diese Strings werden vom ESP32 eingelesen und entsprechend verarbeitet,
sodass eine RGB-LED entsprechend angesteuert wird. Zur Funktion des Programmcodes auf einem ESP32 muss dieser erst ordnungsgemäß
in der Arduino IDE eingerichtet werden. Außerdem werden die Bibliotheken "OneWire", "DallasTemperature" und "BluetoothSerial"
benötigt.
Autor: Edgar Baal
Datum: 04.07.2021
Version V1.0
*/
/* Einbinden der Bibliotheken und Erzeugen von Instanzen */
#include <OneWire.h> //Einbinden der OneWire-Bibliothek
#include <DallasTemperture.h> //Einbinden der DallasTemperature-Bibliothek
#include <BluetoothSerial.h> //Einbinden der Bibliothek zur seriellen Kommunikation über Bluetooth
BluetoothSerial SerialBT; //Erzeugen einer Instanz der BluetoothSerial-Bibliothek
OneWire oneWire(32); //Festlegen von Pin 32 als OneWire-Bus-Instanz
DallasTemperature dallasTemp(&oneWire); //OneWire-Referenz wird der DallasTemoerature-Bibliothek übergeben
/* Speichervariablen und Pinzuweisungen */
const int LED_R = 0; //Zuweisen von Pin 0 zur Ansteuerung der roten LED in der RGB-LED
const int LED_G = 2; //Zuweisen von Pin 2 zur Ansteuerung der grünen LED in der RGB-LED
const int LED_B = 15; //Zuweisen von Pin 15 zur Ansteuerung der blauen LED in der RGB-LED
const int R_channel = 0; //Setzen des Pulsweitenmodulations(PWM)-Channels der roten LED der RGB-LED auf Channel 0
const int G_channel = 1; //Setzen des PWM-Channels der grünen LED der RGB-LED auf Channel 1
const int B_channel = 2; //Setzen des PWM-Channels der blauen LED der RGB-LED auf Channel 2
const int pwm_frequency = 5000; //Setzen der PWM-Frequenz in Hz
const int pwm_resolution = 8; //Setzen der PWM-Auflösung in Bit(8 Bit entspricht 0 bis 255)
String order; //Erzeugen eines Strings zum zwischenspeichern der vom Smartphone gesendeten Befehle
char incomingChar; //Erzeugen einer Char-Variablen zum Zwischenspeichern der einzelnen Zeichen des order-Strings
int temp; //Erzeugen einer integer-Variablen zum Zwischenspeichern der gemessenen Temperaturwerte
/* Pininitialisierung, parametrieren der PWM-Kanäle und starten der Bluetooth-Verbindung */
void setup() //Diese Funktion wird vor dem Schleifenbetrieb der loop()-Funktion einmalig durchlaufen
{
Serial.begin(115200); //Initialisieren der seriellen Kommunikation mit einer Baud-Rate von 115200 (notwendig für Bluetooth)
SerialBT.begin("T1-RGB Tuning"); //Initialisieren eines BluetoothSerial-Gerätes mit dem Namen T1-RGB Tuning
dallasTemp.begin(); //Kommunikation mit der Temperatur-Elektrode über den Datenpin 32 wird hochgefahren
ledcAttachPin(LED_R, R_channel); //Festlegen von Pin und Channel des PWM-Signals der roten LED der RGB-LED
ledcAttachPin(LED_G, G_channel); //Festlegen von Pin und Channel des PWM-Signals der grünen LED der RGB-LED
ledcAttachPin(LED_B, B_channel); //Festlegen von Pin und Channel des PWM-Signals der blauen LED der RGB-LED
ledcSetup(R_channel, pwm_frequency, pwm_resolution); //Setzen von PWM-Frequenz und PWM-Auflösung der roten LED der RGB-LED
ledcSetup(G_channel, pwm_frequency, pwm_resolution); //Setzen von PWM-Frequenz und PWM-Auflösung der grünen LED der RGB-LED
ledcSetup(B_channel, pwm_frequency, pwm_resolution); //Setzen von PWM-Frequenz und PWM-Auflösung der blauen LED der RGB-LED
}