Falls du Schwierigkeiten beim Erstellen des Programmcodes für den ESP32 hattest ist hier nochmal der vollständige Code:

/*
  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:

  1. Entweder du versuchst die Boot-Taste auf dem ESP32 zu drücken, welche bereits im ersten Abschnitt dieses Kapitels erklärt wurde
  2. 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.

Zuletzt geändert: Dienstag, 23. Januar 2024, 15:18