Advertisement
Guest User

Untitled

a guest
Apr 1st, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.95 KB | None | 0 0
  1. #include <PubSubClient.h>     //Library PubSubClient einbinden
  2. #include <ESP8266WiFi.h>      //Library Wifi einbinden
  3. #include <Wire.h>             //Library i2c-Bus einbinden
  4. #include <OneWire.h>
  5. #include <BME280I2C.h>
  6. #include <DallasTemperature.h>
  7.  
  8. // Change this before you flash
  9. #define ssid "SSID"                      //SSID Wifi
  10. #define pass "PASSWORD"                   //Passwort Wifi
  11. #define MQTTServer "test.mosquitto.org"             //MQTT-Server-Adresse
  12. //#define MQTTUser "Benutzer-Login"                 //MQTT-User
  13. //#define MQTTPW "Benutzer-Passwort"                //MQTT-Passwort
  14. #define MQTTPort 1883                             //MQTT-Port des Servers
  15.  
  16. //Funktionen vordefinieren
  17. void mqttconnect();
  18.  
  19. //Clients definieren
  20. WiFiClient client;              //Wifi-Client
  21. PubSubClient mclient(client);   //MQTT-Client
  22.  
  23. //Sensoren definieren
  24. #define ONE_WIRE_BUS D1
  25. OneWire oneWire(ONE_WIRE_BUS);
  26. DallasTemperature sensors(&oneWire);
  27. float WTemp = 0;
  28. /* DS18B20 ENDE */
  29. /* Temperaturalarm */
  30. #define ledRd D7
  31. #define ledYe D8
  32. const float alarmtempHigh = 28;
  33. const float alarmtempLow = 6;
  34. boolean error = false;
  35. /* Temperaturalarm ENDE */
  36. /* BME280 */
  37. BME280I2C bme;
  38. float temp(NAN), hum(NAN), pres(NAN);
  39. BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
  40. BME280::PresUnit presUnit(BME280::PresUnit_hPa);
  41. /* BME280 ENDE */
  42.  
  43. //Variablen definieren
  44. boolean wifiConnected = false;    //Wifi verbunden (richtig/falsch)
  45. char buffers[10];                 //Zwischenspeicher für Daten in Variable/Array "buffers" puffern
  46. const long interval = 10000;      //Interval für das Senden der Daten in Millisekunden = 10 Sekunden
  47. unsigned long previousMillis = 0; //vorherige Millisekunden (für Timerfunktion)
  48.  
  49. void setup() {
  50.   // hier steht der Setup-Code drin
  51.   Wire.begin(D5, D6);           //i2c-Bus starten (Pin D5 = SDA, Pin D6 = SCL)
  52.   Serial.begin(115200);         //Serielle Schnittstelle starten mit 115200 Baud
  53.   if (!bme.begin()) {           //BME280 starten, wenn nicht startet, dann Fehlermeldung
  54.     Serial.println("Kann BME280 nicht initialisieren!");
  55.   }
  56.  
  57.   wifiConnected = connectWifi();              //W-Lan verbinden
  58.   Serial.println();                           //Leerzeile im seriellen Monitor ausgeben
  59.   Serial.print("Verbunden? ");                //"Verbunden?" im seriellen Monitor ausgeben
  60.   Serial.println(wifiConnected);              //true oder false aus der Variable wifiConnected ausgeben und nächste Zeile
  61.   mclient.setServer(MQTTServer, MQTTPort);    //MQTT-Server und -Port setzen
  62.   mclient.setCallback(m_callback);            //Antwort-Funktion definieren, welche die Antworten des MQTT-Servers auswertet
  63.   mqttconnect();                              //mit MQTT-Server verbinden
  64. }
  65.  
  66. void loop() {
  67.   // hier steht der Code, der ständig durchlaufen werden soll drin
  68.   unsigned long currentMillis = millis();                                         //Variable currentMillis speichert die aktuellen Millisekunden seit dem Start des ESP
  69.   if (currentMillis - previousMillis >= interval || currentMillis < 8000) {       //wenn Millisekunden seit dem Start - vorherige Millisekunden größer/gleich der Intervallzeit sind oder Millisekunden seit dem Start kleiner als 8000 sind, dann Code ausführen (Timer)
  70.     previousMillis = currentMillis;                                               //vorherige Millisekunden = Millisekunden seit Start, um den Timer auf Null zu setzen
  71.     Serial.println();                                                             //Leerzeile im seriellen Monitor ausgeben
  72.  
  73.     sensors.requestTemperatures();
  74.     WTemp = 1 + sensors.getTempCByIndex(0);
  75.     if (WTemp == 85 || WTemp == -126) { //85°C = max. Temperatur oder Fehler / Lesefehler
  76.       Serial.println("DS18B20 nicht gefunden");
  77.     }
  78.     bme.read(pres, temp, hum, tempUnit, presUnit);
  79.     Serial.println(pres);
  80.     if (pres != pres || pres == NAN) {
  81.       Serial.println("BME nicht gefunden!");
  82.     }
  83.  
  84.     //MQTT übertragen
  85.     dtostrf(temp, 5, 1, buffers);                         //Variable "temp" in Char-Array umwandeln und im Puffer speichern (5 Stellen vor dem Komma, eine Stelle nach dem Komma)
  86.     mclient.publish("teich/sensoren/temp", buffers, true);   //Puffer-Inhalt (Temperatur) an den MQTT-Broker senden, Kanal = "haus/sensor/temp", true bedeutet, dass die Daten vom Broker gespeichert werden, bis neue Daten kommen
  87.     dtostrf(pres, 5, 0, buffers);                         //Variable "pres" in Char-Array umwandeln und im Puffer speichern (5 Stellen vor dem Komma, keine Stelle nach dem Komma)
  88.     mclient.publish("teich/sensoren/pres", buffers, true);   //Pufferinhalt senden
  89.     dtostrf(hum, 5, 1, buffers);                          //...
  90.     mclient.publish("teich/sensoren/hum", buffers, true);    //...
  91.     dtostrf(WTemp, 5, 1, buffers);                          //...
  92.     mclient.publish("teich/sensoren/WTemp", buffers, true);    //...
  93.   }
  94.  
  95.   //wenn Verbindung zum MQTT-Broker verloren, dann neu verbinden ansonsten Verbindung halten
  96.   if (!mclient.connected()) {
  97.     mqttconnect();
  98.   } else {
  99.     mclient.loop();
  100.   }
  101. }
  102.  
  103. //Funktion W-Lan verbinden
  104. boolean connectWifi() {
  105.   boolean state = true;         //Variable status definieren
  106.   int i = 0;                    //Zähler-Variable für Timeout definieren
  107.   WiFi.disconnect();            //falls noch mit W-Lan verbunden, dann trennen (Vermeidung von Fhelermeldungen)
  108.   WiFi.mode(WIFI_STA);          //Wifi-Modus festlegen
  109.   WiFi.begin(ssid, pass);       //W-Lan verbinden
  110.   Serial.println();             //Leerzeile einfügen und Infotext ausgeben
  111.   Serial.println("Connecting to WiFi");
  112.   Serial.print("Connecting ...");
  113.   //auf Verbindung warten
  114.   while (WiFi.status() != WL_CONNECTED) {
  115.     delay(500);                 //500 Millisekunden warten
  116.     Serial.print(".");
  117.     if (i > 10) {               //nach 10 Versuchen Verbindungsversuch abbrechen und While-Schleife verlassen, status = falsch bedeuten hier keine Verbindung
  118.       state = false;
  119.       break;
  120.     }
  121.     i++;                        //Timeoutzähler nach jedem durchlauf um 1 höher zählen
  122.   }
  123.  
  124.   if (state) {                  //wenn status == true (hier abgekürzt), Verbindungsdaten im Seriellen Monitor ausgeben
  125.     Serial.println("");
  126.     Serial.print("Connected to ");
  127.     Serial.println(ssid);
  128.     Serial.print("IP address: ");
  129.     Serial.println(WiFi.localIP());
  130.   } else {                      //andernfalls Verbindung fehlgeschlagen auf dem seriellen Monitor ausgeben
  131.     Serial.println("");
  132.     Serial.println("Connection failed.");
  133.   }
  134.  
  135.   return state;                 //übergebe status-Variable an die aufrufende Instanz (z.B. Zeile 39)
  136. }
  137.  
  138. //Funktion zum Verbinden des MQTT-Servers
  139. void mqttconnect() {
  140.   Serial.println("Verbinde mit dem MQTT-Service!");     //Ausgabe serieller Monitor
  141.   int i = 0;                                            //Zähler-Variable für Timeout
  142.   mclient.setServer(MQTTServer, MQTTPort);              //Serverdaten setzen
  143.   char clientID[9];                                     //Client-Variable definieren als char-Arry mit 9 Zeichen
  144.  
  145.   static const char alphanum[] = "0123456789"
  146.                                  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  147.                                  "abcdefghijklmnopqrstuvwxyz";  // Variable Zum Generieren einer zufälligen Zeichernfolge (alphanumerisch)
  148.   for (int i = 0; i < 8; i++) {                                 // Schleife 8x durchlaufen und bei jedem Durchlauf eines der 51 Zeichen zufällig in das Array ablegen
  149.     clientID[i] = alphanum[random(51)];
  150.   }
  151.   clientID[8] = '\0';                                           // an letzetr Stelle des Arrays einen Abschluss setzen
  152.   if (!mclient.connect(clientID)) {           //Verbindung herstellen und Verbindungsdaten ausgeben
  153.     Serial.print("Connected with Client ID:  ");
  154.     Serial.print(String(clientID));
  155.     /*Serial.print(", Username: ");
  156.     Serial.print(MQTTUser);
  157.     Serial.print(" , Password: ");
  158.     Serial.println("********"); */
  159.   }
  160.   Serial.println("Mit dem MQTT-Service Verbunden");
  161.   mclient.subscribe("haus/aktoren/#");                          //den Kanal "haus/aktoren/#" abonieren... # ist ein Platzhalter für alle untergeordnetetn Kanäle
  162. }
  163.  
  164. //Funktion für MQTT-Broker-Antworten vom abonnierten Kanal
  165. void m_callback(char* topic, byte* payload, unsigned int length) {  //Topic = Kanal / Payload = Nachricht, Length = Nachrichtenlänge
  166.  
  167.   std::string plr( reinterpret_cast<char const*>(payload), length ) ; //Nachricht in String (Text) konvertieren und im Seriellen Monitor Kanal und nachricht ausgeben
  168.   int pl = atoi( plr.c_str() );
  169.   String top = (String)topic;
  170.   String pay = (String)pl;
  171.   Serial.println("Topic: " + top);
  172.   Serial.println("Payload: " + pl);
  173.  
  174.   if ( top == "haus/aktoren/relais1" ) {    //wenn der Kanal "haus/aktoren/relais1" ist, dann eine näher zu definierende Aktion durchführen, z.B. Relais1 schalten
  175.     if (pl > 0) {
  176.       //Code für Relais1 auschalten
  177.     } else {
  178.       //Code für Relais1 einschalten
  179.     }
  180.   }
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement