/********************************************************************
* Temperatur-Sensor
*
* MQTT-Client mit DS18x20 Sensor
*
* Messwert wird als MQTT-Nachricht an einen MQTT-Broker verschickt
*
* Beispiel: {"Temperatur":"17.50"}
*
* 01.03.2018 Jürgen Mayer, DL8MA - Weinstadt
*
*/
#include <SPI.h> // Serial Peripheral Interface
#include <Ethernet.h> // Ethernet Bibliothek
#include <PubSubClient.h> // MQTT Bibliothek
#include <OneWire.h> // OneWire
#include <DallasTemperature.h> // Dallas Temperatursensor
#define ONE_WIRE_BUS 2
IPAddress server(192, 168, 178, 122); // MQTT-Broker
char inTopic[] = "DL8MA"; // Topic
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
char msg[100]; // Buffer
OneWire oneWire(ONE_WIRE_BUS); // TEmperatursensor einbinden
DallasTemperature sensors(&oneWire);
EthernetClient ethClient; // Ethernet-Client aktivieren
PubSubClient client(ethClient); // MQTT-Klasse
void reconnect() { // automatischer Reconnect
while (!client.connected()) {
Serial.print("Versuch des MQTT Verbindungsaufbaus...");
if (client.connect("arduinoClient")) {
Serial.println("Erfolgreich verbunden!");
client.publish( inTopic,"Temperatursensor");
client.subscribe(inTopic);
} else {
Serial.print("Fehler, rc=");
Serial.print(client.state());
Serial.println(" Nächster Versuch in 5 Sekunden");
delay(5000);
}
}
}
void setup()
{
Serial.begin(9600);
sensors.begin(); // Sensor initialisieren
client.setServer(server, 1883); // Adresse des MQTT-Brokers setzen
Ethernet.begin(mac ); // Ethernet-Vebindung aufbauen
delay(1000);
}
void loop()
{
static char floatStr[15];
String payLoad;
String tempWertString;
float tempWertFloat;
if (!client.connected()) {
reconnect();
}
client.loop();
sensors.requestTemperatures(); // Temperatur messen
tempWertFloat = sensors.getTempCByIndex(0); // Messwert holen
dtostrf( tempWertFloat,7, 2, floatStr); // Zahlenwert in String wandeln
tempWertString = floatStr;
tempWertString.trim();
payLoad = "{\"Temperatur\":\""; // Nachricht zusammenbauen
payLoad = payLoad + tempWertString + "\"}"; // Messwert dazufügen
payLoad.toCharArray(msg, 100 ); // für publish-Funktion umwandeln
client.publish( inTopic, msg ); // MQTT-Nachricht an Brocker senden
Serial.println( msg );
delay( 1000 );
}