Als erstes werden die beiden Bibliotheken mit "#include <Bibliotheksname>" in das Programm eingebunden.

#include <WiFi.h>
#include <HTTPClient.h>

Anschließend werden die Pinbelegungen festgelegt. Damit es einfacher ist diese Später zu verändern wird mit "#define" einem Konstanten Wert (in unserem Fall die Nummer des Pins) ein alternativer Name gegeben. Dieser Name kann im ganzen Programm verwendet werden und wird von Compiler beim Hochladen durch den festgelegten konstanten Wert ersetzt.

#define BUTTON_MODUS 26
#define BUTTON_TOGGLE 25
#define LDR_PIN 34
#define LED_FEEDBACK 32

Selbiges gilt für den Wert des Lichtempfindlichen Widerstandes (LDR), bei welchem der ESP zwischen Hell und Dunkel unterscheiden soll.

#define LDR_GRENZE 1000

Als nächstes werden die SSID (der Name) und das Passwort des WLANs, mit dem der ESP sich verbinden soll eingegeben.

const char* ssid = "Netzwerk SSID" ; 
const char* password = "WLAN-PASSWORT";

Um die Events von IFTTT auszulösen werden die drei Links für die Events benötigt (s. IFTTT - API Zugangscode)

const char* link_an = "https://maker.ifttt.com/trigger/Steckdose%AN/with/key/cz9J7dsRjakvxg9cMcoi4h";
const char* link_aus = "https://maker.ifttt.com/trigger/Steckdose%AUS/with/key/cz9J7dsRjakvxg9cMcoi4h";
const char* link_toggle = "https://maker.ifttt.com/trigger/TOGGLE/with/key/cz9J7dsRjakvxg9cMcoi4h";

Diese globalen bool Variablen sind für den Programmablauf nötig und können lediglich "true" oder "false" beinhalten. "vorher" gibt an, ob die Steckdose zuletzt ein- oder ausgeschaltet wurde, wobei true für ein- und false für ausschalten steht.

"automatik" gibt an, ob sich das Programm im automatischen oder im Manuellen Modus befindet. 

"manuellvorher" ist lediglich dazu da, damit z.b. die Feedback LED beim Wechsel vom manuellen auf den automatischen Modus ausgeschaltet wird.

bool vorher = false;
bool automatik = true;
bool manuellvorher = false;


Im setup() werden zuallererst die Pin-Modes der verwendeten GPIO Pins deklariert.

void setup()
{
  pinMode(BUTTON_TOGGLE, INPUT);
  pinMode(BUTTON_MODUS, INPUT);
  pinMode(LDR_PIN, INPUT);
  pinMode(LED_FEEDBACK, OUTPUT);

Danach werden die Serielle Schnittstelle auf 9600 Baud, sowie die WiFi-Verbindung initialisiert.

  Serial.begin(9600);
  WiFi.begin(ssid, password);

Solange die WLAN Verbindung nicht hergestellt ist wird durch die while-Schleife abgewartet. 

Hinweis: Sollte es einmal vorkommen, dass sich der ESP auch nach ca 60 Sekunden nicht mit dem WLAN verbunden hat, so kann es helfen den ESP kurz einmal neuzustarten.

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(5000);
    Serial.print(".");
  }

  //Nachricht im Seriellen Monitor, dass die WLAN Verbindung hergestellt wurde
  Serial.println("");
  Serial.print("Verbindung zu WLAN-Netzwerk Hergestellt mit IP-Adresse: ");
  Serial.println(WiFi.localIP());
  delay(5000);
}


Im loop() wird zuerst ein delay von 0,1 Sekunden benutzt, der den ESP etwas entlastet, indem er verhindert, dass das Programm sofort nachdem es fertig ist wieder von vorne beginnt. 

Nahezu der gesamte Inhalt des loops ist in eine if-Schleife gepackt, welche dafür sorgt, dass keine Web-Requests versandt werden, wenn die WLAN Verbindung nicht mehr besteht.

void loop()
{
  delay(100);

  if (WiFi.status() == WL_CONNECTED)
  {

An dieser Stelle wird geschaut, ob der Button für den Moduswechsel gedrückt wurde und, welcher Modus momentan aktiviert ist. Je nachdem, welcher Modus vorher aktiviert war, wird auf den jeweils anderen gewechselt.

    if ((digitalRead(BUTTON_MODUS) == HIGH) && automatik)
    {
      digitalWrite(LED_FEEDBACK, HIGH);
      automatik = false;
      Serial.println("Manueller Modus wurde aktiviert");
      delay(1000);
    }
    else if ((digitalRead(BUTTON_MODUS) == HIGH) && ( !automatik)) 
    {
      digitalWrite(LED_FEEDBACK, LOW);
      automatik = true;
      Serial.println("Automatischer Modus wurde aktiviert");
      delay(1000);
    }

Da die für die automatische bzw. manuelle Steuerung notwendigen Code-Bausteine in eigene Funktionen ausgelagert wurden, wird hier nur unterschieden, welche dieser beiden Funktionen aufgerufen werden muss.

Anschließend kommt die else-Anweisung zur if-Abfrage zu Beginn des loop's.

    if (automatik)
    {
      autom();
    }
    else
    {
      man();
    }
  }
  else
  {
    Serial.println("WLAN NICHT VERBUNDEN!");
  }
}


Hier beginnt die Funktion "autom()", welche immer aufgerufen wird, wenn das Programm im automatischen Modus ist.

void autom()
{
  //Wird nach Wechsel des Modus ausgeführt
  if (manuellvorher)
  {
    manuellvorher = false;
    vorher = false;
    digitalWrite(LED_FEEDBACK, LOW);
  }

An dieser Stelle, wird geschaut, ob der Wert des LDR's unter oder über der Grenze liegt und in der bool Variable "ldr" festgehalten. True steht hierbei für "dunkel" und false für "hell".

  bool ldr = false;
  if (analogRead(LDR_PIN) < LDR_GRENZE)
  {
    ldr = true;
  }
  else
  {
    ldr = false;
  }

Dieser Teil wird aufgerufen, wenn das Programm die Steckdose einschalten soll. Zuerst wird ein Objekt "http" vom Datentyp "HTTPClient" erstellt. Anschließend werden eine Nachricht im Seriellen Monitor ausgegeben, sowie der IFTTT-Link zum einschalten der Steckdose zum Objekt "http" hinzugefügt.

  if (ldr && !vorher) //anschalten
  {
    HTTPClient http;
    Serial.println("Helligkeit liegt unter Grenzwert");
    http.begin(link_an);

Nun wird eine get-Request an den in "link_an" festgelegten Webserver geschickt, welche einen HTTP-Code zurückgibt. 

Weitere Informationen zu den verschiedenen möglichen HTTP-Statuscodes sind auf Wikipedia zu finden.

    int httpCode = http.GET();

Danach werden dieser Code ebenfalls im Seriellen Monitor ausgegeben und die globale Variable "vorher" erhält den wert true.

    Serial.println("HTTP-Code: "); 
    Serial.print(httpCode);
    Serial.print("\n");
    vorher = true;
  }

Hier wird dasselbe wie beim Einschalten gemacht, mit dem einzigen Unterschied, dass der Link für das "aus" Event genutzt wird und, dass "vorher" auf false gesetzt wird.

  else if (!ldr && vorher) //ausschalten
  {
    HTTPClient http;
    Serial.println("Helligkeit liegt über Grenzwert");
    http.begin(link_aus);
    int httpCode = http.GET();
    Serial.println("HTTP-Code: ");
    Serial.print(httpCode);
    Serial.print("\n");
    vorher = false;
  }
}


Diese Funktion man() beinhaltet den Teil des Programms, welcher ausgeführt wird, wenn der manuelle Modus aktiviert ist.

void man()
{
  digitalWrite(LED_FEEDBACK, HIGH);
  manuellvorher = true;

  if (digitalRead(BUTTON_TOGGLE) == HIGH)
  {
    HTTPClient http;
    http.begin(link_toggle);
    int httpCode = http.GET();
    Serial.println("HTTP-Code: ");
    Serial.print(httpCode);
    Serial.print("\n");
  }
}
Zuletzt geändert: Mittwoch, 30. September 2020, 22:28