ESP2MQTT 01

/*****************************************************************************************************
Das Programm sendet einen Temperaturwerte in regelmäßigen Abständen an einen MQTT-Broker. 
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>

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

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

WiFiClient wifiClient;
PubSubClient mqttClient( wifiClient );

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 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." );
    } 
    else 
    {
      Serial.print( "fehlgeschlagen, Status=" );
      Serial.print( mqttClient.state() );
      Serial.println( " - erneuter Versuch in 5 Sekunden." );
      delay( 5000 );
    }
  }
}

void setup() 
{
  Serial.begin( 115200 );
  while( !Serial );
  // Mit dem WLAN-Netzwerk verbinden
  setup_wifi();
  // Mit MQTT-Broker verbinden - Standard Port: 1883
  mqttClient.setServer( mqtt_server, 1883 ); 
}

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

    // Temperatur auslesen und in Celsius umrechnen
    int reading = analogRead(A0);
    float voltage = reading * 3.3;
    voltage /= 1024;
    float _tempc = (voltage - 0.5) * 100 - 4.0;
    
    // Temperatur ausgeben ...
    Serial.print( "Temp C: " );
    Serial.println( String( _tempc ) );
    
    // ... und in einen String umwandeln ...
    char curTemp[5];
    String(_tempc).toCharArray( curTemp, sizeof( curTemp ) );
    
    // ... danach die Temperatur an das Topic senden.
    mqttClient.publish( mqtt_topic, curTemp );

    delay( 15000 );
}