//Wetterdaten mit MQTTT und LCD(I2C) ausgeben //ESP8266 //18.08.19 #include #include #include #include #include // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden #include //MQTT-Unterstützung LiquidCrystal_I2C lcd(0x27, 20, 4); //20x4-LCD an I2C-Adresse 27 hex #define SEALEVELPRESSURE_HPA (1013.25) ///////////////////////////////////////////////////////////////////// const char* ssid = "WLANROUTER"; const char* password = "ganzgeheim"; const char* MQTT_BROKER = "192.168.2.99"; //der MQTT-Broker const char* mqttClient ="umweltdaten190818a"; //Eindeutiger Schlüssel ///////////////////////////////////////////////////////////////////// WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; // unsigned long delayTime; float h, t, p; char temperatureCString[6]; char humidityString[6]; char pressureString[7]; int i = 0,j = 0,k = 0,m =2; //universelle Zähler Adafruit_BME280 bme; //WiFiServer server(80); //############################## void setup() { lcd.init(); //Im Setup wird das LCD gestartet lcd.backlight(); //Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus). Serial.begin(9600); delay(10); Serial.println(("BME280-Sensor")); bool status; status = bme.begin(0x76);//Sensor I2C-Adresse // Connect to WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Print the IP address Serial.println(WiFi.localIP()); //mit MQTT-Server verbinden checkMqtt(); } //############################## void callback(char* topic, byte* payload, unsigned int length){ Serial.print("MQTT-Nachricht für "); Serial.print(topic); Serial.print(": "); char msg[length+1]; for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); msg[i] = (char)payload[i]; } Serial.println(" "); } //############################## void checkWifi(){ //mit WLAN verbinden Serial.print(" Mit WLAN verbinden."); WiFi.persistent(false);//Flash-Zugriffe minimieren WiFi.begin(ssid,password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); i++; if (i>19){// Abbruch nach 10 Sekunden i=0; Serial.println(" fehlgeschlagen!"); break; } Serial.print(" mit WLAN verbunden, IP Ardesse: "); Serial.println(WiFi.localIP()); } } //############################## void checkMqtt(){ // MQTT-Verbindung prüfen und ggf. aufbauen client.setServer(MQTT_BROKER, 1883); client.setCallback(callback); while (!client.connected()){ Serial.print("verbinde mit MQTT-Server"); if (client.connect(mqttClient)){ Serial.println("..verbunden!"); } else{ Serial.print("..fehlgeschlagen. Fehler: "); Serial.println(client.state()); } } } //############################## void reconnectMqtt() { while (!client.connected()) { Serial.println("wiederverbinden MQTT"); if (!client.connect(mqttClient)) { Serial.print("...fehlgeschlagen, rc="); Serial.print(client.state()); Serial.println(" neuer Versuch in 5s"); delay(5000); } } Serial.println("MQTT wieder verbunden."); //wie bei Neustart } //############################## void getWeather() { //Umweltdaten vom Sensor holen h = bme.readHumidity(); t = bme.readTemperature(); p = bme.readPressure()/ 100.0+35; //295m *0,12 hPa/m lt. Datenblatt dtostrf(t, 5, 1, temperatureCString); dtostrf(h, 5, 1, humidityString); dtostrf(p, 6, 1, pressureString); delay(1000); sendToLCD(); } //############################## void sendToLCD(){ lcd.setCursor(0,0); lcd.print("Umweltdaten:"); lcd.setCursor(0, 1); lcd.print(temperatureCString); lcd.print(" *C"); lcd.setCursor(0, 2); lcd.print(humidityString); lcd.print(" % Luftfeuchte"); lcd.setCursor(0, 3); lcd.print(pressureString); lcd.print(" mbar"); Serial.print(temperatureCString); Serial.println(" °C"); Serial.print(humidityString); Serial.println(" % Luftfeuchte"); Serial.print(pressureString); Serial.println(" mbar"); } //############################## MQTT-Nachrichten void mqttTemperatur(){ client.publish("wetter/temperatur",temperatureCString); } //############################## void mqttLuftfeuchtigkeit(){ client.publish("wetter/luftfeuchtigkeit",humidityString); } //############################## void mqttLuftdruck(){ client.publish("wetter/luftdruck",pressureString); } void loop() { // alle 3 Minuten prüfen, ob Wifi-Verbindung.. // ..noch besteht, dann erneut anmelden j++;//Schleifenzähler if ((j>120) and (WiFi.status() != WL_CONNECTED)){ j=0; checkWifi();//WLAN verbinden //ESP.restart();//Neu booten } // ist der MQTT-Server noch verbunden? if (!client.connected()){ reconnectMqtt(); } //MQTT-Server auf eingehende Nachrichten checken: client.loop //client.loop(); getWeather(); //braucht 1 Sekunde m--; //countdown auf 0 //alle etwa 15 Minuten (900 Schleifendurchläufe á 1s) //..Messwerte an MQTT-Server senden if(m==0){ //m=110; //Countdown auf 2 Minuten mit Korrektur m=820; //Countdown auf 15 Minuten mit Korrektur mqttTemperatur(); delay(100); mqttLuftfeuchtigkeit(); delay(100); mqttLuftdruck(); Serial.println("Messwerte an MQTT gesendet."); } }