Das Programm auf den ESP32 hochladen
/*
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
}
/* Abfragen und Einlesen eines Befehls und umsetzen dieses */
void loop() //Diese Funktion wird nach der setup()-Funktion immer wieder durchlaufen, so lange der ESP32 eingeschaltet ist
{
if (SerialBT.available()) //Abfrage, ob an der seriellen Bluetooth-Schnittstelle Daten zum Einlesen anliegen
{
order = ""; //String order wird zurückgesetzt
while (SerialBT.available()) //So lange Daten an der seriellen Bluetooth-Schnittstelle anliegen, werden diese eingelesen
{
incomingChar = SerialBT.read(); //Einlesen eines Char aus dem übersendeten String
order += incomingChar; //Der String order wird um den eingelesenen Char erweitert
}
if (order == "flush") //Abfrage, ob der übersendete Befehl flush lautet
{
RGB_Color(0, 0, 0); //RGB-LED mit eigens definierter Funktion RGB_Color ausschalten
}
else if (order != "flush" && order != "a_on" && order != "") //Abfrage, ob der übersendete Befehl eine Farbcodierung beinhaltet
{
String red; //Erzeugen eines Strings zum Zwischenspeichern der Zahl für die Farbe Rot
String green; //Erzeugen eines Strings zum Zwischenspeichern der Zahl für die Farbe Grün
String blue; //Erzeugen eines Strings zum Zwischenspeichern der Zahl für die Farbe Blau
int count = 0; //Variable zum Zählen der Trennkommata
String part; //String zum Zwischenspeichern einzelner Chars
for (int string_pos = 0; string_pos < order.length(); string_pos++) //for-Schleife, die die per Bluetooth übertragene RGB-Farbe mit der Sytax "Rot,Grün,Blau" auftrennt
{
part = order.charAt(string_pos); //Dem String "part" wird der dem Index entsprechende Teil des Strings "order" zugewiesen
if (count == 0 && part != ",") //Wurde noch kein Komma detektiert und ist der momentane Char kein Komma, wird dieser Fall bearbeitet
{
red += order.charAt(string_pos); //Die Zahl für die rote LED wird iterativ eingelesen
}
else if (count == 1 && part != ",") //Wurde ein Komma detektiert und ist der momentane Char kein Komma, wird dieser Fall bearbeitet
{
green += order.charAt(string_pos); //Die Zahl für die grüne LED wird iterativ eingelesen
}
else if (count == 2) //Wurden zwei Kommata detektiert, wird dieser Fall bearbeitet
{
blue += order.charAt(string_pos); //Die Zahl für die blaue LED wird iterativ eingelesen
}
else //Entspricht der Char mit dem momentanen Index einem Komma, wird dieser Fall bearbeitet
{
count ++; //Es wurde ein Komma mehr detektiert
}
}
RGB_Color(red.toInt(), green.toInt(), blue.toInt()); //Die aufgenommenen Zahlenwerte für die einzelnen LEDs werden in einen int umgewandelt und der LED als Farbe zugewiesen
}
}
if (order == "a_on") //Abfrgae, ob der übersendete Befehl a_on lautet
{
dallasTemp.requestTemperatures(); //Diese Methode ermöglicht das Anfordern von Temperaturwerten
temp = dallasTemp.getTempCByIndex(0); //Diese Methode fordert den momentanen Temperaturwert in °C an
if (temp >= 35) //Prüfung, ob die Temperatur größer oder gleich 35 °C ist
{
RGB_Color(255, 0, 0); //RGB-LED leuchtet rot.
}
else if (temp < 35 && temp >= 25) //Prüfung, ob die Temperatur kleiner als 35 °C und größer oder gleich 25 °C ist
{
RGB_Color(255, 50, 0); //RGB-LED leuchtet orange
}
else if (temp < 25 && temp >= 10) //Prüfung, ob die Temperatur kleiner als 25 °C oder größer oder gleich 10 °C ist
{
RGB_Color(238, 100, 0); //RGB-LED leuchtet gelb
}
else if (temp < 10 && temp >= -10) //Prüfung, ob die Temperatur kleiner als 10 °C oder größer oder gleich -10 °C ist
{
RGB_Color(0, 0, 255); //RGB-LED leuchtet blau
}
else //Die Temperatur unter -10 °C liegt
{
RGB_Color(148, 0, 211); //RGB-LED leuchtet lila
}
}
}
/* Globale Methode zur Programmoptimierung */
void RGB_Color(int red, int green, int blue) //Methode zur Farbwahl der RGB-LED mit Zahlen von 0 bis 255
{
ledcWrite(R_channel, red); //Zuweisen eines Wertes zwischen 0 und 255 für den PWM-Channel der roten LED der RGB-LED
ledcWrite(G_channel, green); //Zuweisen eines Wertes zwischen 0 und 255 für den PWM-Channel der grünen LED der RGB-LED
ledcWrite(B_channel, blue); //Zuweisen eines Wertes zwischen 0 und 255 für den PWM-Channel der blauen LED der RGB-LED
}
Eine kurze Anleitung zum Hochladen
Der ESP32 muss mit deinem Computer verbunden sein. Dein geschriebenes Programm musst du ebenfalls vorher abgespeichert haben. Mit einem Klick auf den Hochladen-Button sollten erst der Kompilierprozess und anschließend das Hochladen starten. Sollte die Arduino IDE trotz angeschlossenem ESP32 Probleme bei der Verbindung haben helfen die folgenden zwei Tricks:
- Entweder du versuchst die Boot-Taste auf dem ESP32 zu drücken, welche bereits im ersten Abschnitt dieses Kapitels erklärt wurde
- Du trennst für die Dauer des Hochladeprozesses die Verbindung zwischen dem 5 V Anschluss und dem DS18B20. Dieser bereitet hin und wieder Schwierigkeiten beim Hochladen des Programmes
Ist das Programm anschließend hochgeladen, kannst Du dich an der App-Entwicklung probieren.
Anhand dieses Codebeispiels kannst du sehen, dass Programmieren sehr komplex werden kann, auch wenn die Programmfunktion noch so simpel ist. Vor allem das Behandeln jeder Kleinigkeit und das Ausmerzen jeder möglichen Fehlerquelle, wie beispielsweise der Eingabe zu großer oder zu kleiner Werte in der App, kann zu großen Codekonstrukten führen. Umso wichtiger ist es dabei sauber und ordentlich zu programmieren, sodass du dich nicht irgendwann in deinem eigenen Programmcode verirrst.