MQTT2ESP 01

/*****************************************************************************************************
Das Programm abonniert das Topic 'Poti' von einem MQTT-Broker. Wenn ein Payload auf
diesem Topic eingeht, wird er zunächst im Seriellen Monitor angezeigt. Ist der Wert des 
Payloads größer als 50, wird eingeschaltet, andernfalls ausgeschaltet.
Es wird regelmäßig überprüft, ob die Verbindung zum Broker noch besteht und diese ggf. wieder 
hergestellt. 

Quelle: Datei - Beispiele - PubSubClient - mqtt_esp8266
*****************************************************************************************************/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define LED 2 
// LED ist LOW-aktiv
#define LED_on 0
#define LED_off 1

// Netzwerk Zugangsdaten
char* WiFissid = "...";
char* WiFipassword = "...";

// MQTT Broker IP
const char* mqtt_server = "...";

WiFiClient wifiClient;
PubSubClient mqttClient( wifiClient );

long lastMsg = 0;
char msg[50];

void setup_wifi() 
{ 
  delay( 10 );
  Serial.println();
  Serial.print( "Verbinden mit " );
  Serial.println( WiFissid );
  WiFi.begin( WiFissid, WiFipassword );

  while( WiFi.status() != WL_CONNECTED )  
  {
    delay( 500 );
    Serial.print( "." );
  }
  Serial.println( "" );
  Serial.println( "WiFi verbunden" );
  Serial.print( "IP Adresse: " );
  Serial.println( WiFi.localIP() );
}

void callback( char* topic, byte* payload, unsigned int length ) 
{
  Serial.print( "Message arrived [" );
  Serial.print( topic );
  Serial.print( "] = " );
  String message;
  
  // payload vom Byte-Array in String zeichenweise umkopieren und ausgeben
  for( int i = 0; i < length; i++ ) 
  {
    Serial.print( (char)payload[i] );
    message += (char)payload[i];
  }
  Serial.print( " \t " );
  
  // wenn das Topic 'Poti' gesendet wurde und Schwellwert erreicht, LED schalten
  if( String( topic ) == "Poti" )
  { 
    Serial.print( "LED " );
    if( message.toInt() < 50 )
    { 
      digitalWrite( LED, LED_off );
      Serial.println( "ausschalten" );
    }
    else
    {
      digitalWrite( LED, LED_on );
      Serial.println( "einschalten" );
    }
  }
}

void reconnect() 
{ 
  while( !mqttClient.connected() )  
  { // solange keine Verbindung besteht wiederholen
    Serial.print( "MQTT-Verbindung... " );
    // zufällige Client-ID erzeugen (wird im Broker angezeigt)
    String clientId = "ESPClient-";
    clientId += String( random(0xffff), HEX );
    // mit dem Broker verbinden
    if( mqttClient.connect( clientId.c_str() ) ) 
    {
      Serial.println( "verbunden." );
       // resubscribe Topic
      mqttClient.subscribe( "Poti" );
    } 
    else 
    {
      Serial.print( "fehlgeschlagen, Status=" );
      Serial.print( mqttClient.state() );
      Serial.println( " - erneuter Versuch in 5 Sekunden." );
      delay( 5000 );
    }
  }
}

void setup() 
{
  pinMode( LED, OUTPUT );
  Serial.begin( 115200 );
  while( !Serial );
  setup_wifi();
  mqttClient.setServer( mqtt_server, 1883 );
  mqttClient.setCallback( callback );
}

void loop() 
{
  if( !mqttClient.connected() ) 
  {
    reconnect();
  }
  mqttClient.loop();
}