//Wetterdaten mit MQTTT ausgeben //ESP8266 //2021-01-20 #include #include #include #include #include //ADC-1115-services //#include // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden #include //MQTT-Unterstützung //LiquidCrystal_I2C lcd(0x27, 20, 4); //Hier wird festgelegt um was für einen Display es sich handelt. In diesem Fall eines mit 16 Zeichen in 2 Zeilen und der HEX-Adresse 0x27. Für ein vierzeiliges I2C-LCD verwendet man den Code "LiquidCrystal_I2C lcd(0x27, 20, 4)" Adafruit_ADS1115 ads(0x48);//ADS1115-I2C-Adress #define SEALEVELPRESSURE_HPA (1013.25) ///////////////////////////////////////////////////////////////////// const char* ssid = "MEINWLAN"; const char* password = "Geheim"; const char* MQTT_BROKER = "192.168.123.45"; //Raspberry Pi Mosquitto const char* mqttClient ="eindeutig"; const char* topic_batt = "batterie/spannung";//vgl. BattToMQTT() const short int onoffsensor = 14; //Ausgangspin = D5 ///////////////////////////////////////////////////////////////////// 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 float Batteriespannung; Adafruit_BME280 bme; //WiFiServer server(80); //############################## void setup() { pinMode(onoffsensor, OUTPUT); //Initialize D5 as switch for sensor, ADC and LED Serial.begin(115200); delay(10); // Connect to WiFi network Serial.println(" "); Serial.println("Wetter BMP280 MQTT LiFePo4"); Serial.println("Version 26.01.2021"); 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() { h = bme.readHumidity(); t = bme.readTemperature(); p = bme.readPressure()/ 100.0+35; //+Hochdorf 295m *0,12 hPa/m lt. Datenblatt dtostrf(t, 5, 1, temperatureCString); dtostrf(h, 5, 1, humidityString); dtostrf(p, 6, 1, pressureString); delay(1000); } //############################## void mqttTemperatur(){ Serial.print("Temperature = "); Serial.println(temperatureCString); client.publish("wetter/temperatur",temperatureCString); } //############################## void mqttLuftfeuchtigkeit(){ Serial.print("Humidity = "); Serial.println(humidityString); client.publish("wetter/luftfeuchtigkeit",humidityString); } //############################## void mqttLuftdruck(){ Serial.print("Pressure = "); Serial.println(pressureString); client.publish("wetter/luftdruck",pressureString); } //############################## void mqttBatterie(){ char Batterie[16]; //String Batterie; Batteriespannung = Batteriespannung*0.000125; char result[8]; // Buffer big enough for 7-character float dtostrf(Batteriespannung, 4, 2, Batterie); //Batterie = String(Batteriespannung); //itoa(Batteriespannung,Batterie,10); Serial.print("Battery = "); Serial.println(Batterie); client.publish("wetter/batterie",Batterie); } //######## Get battery-voltage using I2C-ADC and detect BattLow int get_ad_batt(){ int16_t adc1;// eq Batteryvoltage ads.setGain(GAIN_ONE); //set to +4096 mV/15 bit adc1 = ads.readADC_SingleEnded(1); yield(); return adc1; } void loop() { Serial.println("schalte Sensor ein"); digitalWrite(onoffsensor, HIGH); //switch sensor, ADC, LED on delay(1000); Serial.println(F("AD-Wandler init.")); ads.setGain(GAIN_ONE); //set to +- 4096 mV ads.begin(); Serial.println(F("BME280-Sensor-init")); bool status; status = bme.begin(0x76); getWeather(); //braucht 1 Sekunde delay(1000); mqttTemperatur(); delay(300); mqttLuftfeuchtigkeit(); delay(300); mqttLuftdruck(); delay(300); Batteriespannung = get_ad_batt(); mqttBatterie(); delay(300); Serial.println("Messwerte an MQTT gesendet."); //Batteriespannung = get_ad_batt(); //BattToMqtt(Batteriespannung,sensorid.toInt()); Serial.println("schalte Sensor aus. Gute Nacht."); digitalWrite(onoffsensor, LOW); //switch sensor, ADC, LED off yield(); //delay(1000) is IMPORTANT to transmitt MQTT-Publish before falling asleep!!!! delay(100); ESP.deepSleep(900e6);//15 minutes sleep delay(500); yield(); }