Update: 2020-05-20

Download Projekt

Der Sketch für den Bme280 Aussensensor Deep Sleep übersichtlich aufgeteilt in Tabs.

Eine Verbindung von D0 zu RST ist nach dem Sketch upload für das aufwachen aus dem Deep Sleep erforderlich.

Aussensensor.ino


// ****************************************************************
// Sketch Esp8266 Aussen Klimasensor Deep Sleep Modular(Tab)
// created: Jens Fleischer, 2019-09-14
// last mod: Jens Fleischer, 2020-04-19
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266
// Software: Esp8266 Arduino Core 2.4.2 / 2.5.2 / 2.6.3 / 2.7.1
// Getestet auf: Nodemcu, Wemos D1 Mini Pro
/******************************************************************
  Copyright (c) 2019 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Der Aussensensor Tab ist der Haupt Tab mit "setup" und "loop".
// #include <ESP8266WiFi.h> oder #include <ESP8266WebServer.h> muss im Haupttab aufgerufen werden
/**************************************************************************************/

#include <ESP8266WebServer.h>

//#define DEBUGGING             // Einkommentieren für die Serielle Ausgabe

#ifdef DEBUGGING
#define DEBUG_B(...) Serial.begin(__VA_ARGS__)
#define DEBUG_P(...) Serial.println(__VA_ARGS__)
#define DEBUG_F(...) Serial.printf(__VA_ARGS__)
#else
#define DEBUG_B(...)
#define DEBUG_P(...)
#define DEBUG_F(...)
#endif

void setup() {
  DEBUG_B(115200);
  delay(100);
  DEBUG_F("\n\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n%s\n\n",
          (__FILE__), (__TIMESTAMP__), ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10, ESP.getFullVersion().c_str());
  bme280();
  Connect();
}

void loop() {
  httpPostClient();
}

Bme280.ino


// ****************************************************************
// Sketch Esp8266 Bme280 Modular(Tab)
// created: Jens Fleischer, 2018-06-03
// last mod: Jens Fleischer, 2018-09-29
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266, Bme280, 2 x 4k7 Ohm Widerstand
// SCL an D1 = GPIO5
// SDA an D2 = GPIO4
// 4k7 Ohm Widerstand von VCC auf D1
// 4k7 Ohm Widerstand von VCC auf D2
// Software: Esp8266 Arduino Core 2.4.2 / 2.5.2 / 2.6.3
// Getestet auf: Nodemcu, Wemos D1 Mini Pro
/******************************************************************
  Copyright (c) 2018 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Diese Version von Bme280 sollte als Tab eingebunden werden.
// #include <ESP8266WebServer.h> muss im Haupttab aufgerufen werden
// Die Funktion "bme280();" muss im Setup aufgerufen werden.
// Gib die Höhe in Meter über Meeresspiegel an deinem Standort an
/**************************************************************************************/

#include <Wire.h>
#include <BME280I2C.h>        // Version 2.3 https://www.github.com/finitespace/BME280

const auto setHight = 163;    // virtuelle Höhe in Meter über Meeresspiegel an deinem Standort anpassen

BME280I2C bme;                // Standard : Zwangsmodus, Standby-Zeit = 1000 ms

void bme280() {               // Funktionsaufruf "bme280();" muss im Setup eingebunden werden
  Wire.begin();
  if (!bme.begin()) {
    DEBUG_P("Keinen BME280 Sensor gefunden!");
  }
}

String handleBme() {
  float temp(NAN), hum(NAN), pres(NAN), sealevel;
  bme.read(pres, temp, hum, BME280::TempUnit_Celsius, BME280::PresUnit_hPa);
  sealevel = (pres / pow(1 - ((0.0065 * setHight) / (temp + (0.0065 * setHight) + 273.15)), 5.257));    // Berechnung relativer Luftdruck
  char buf[25];
  snprintf(buf, sizeof(buf), "%.1f\",\"%.f\",\"%.f", temp, hum, sealevel);    // Nachkommastellen zwichen "Punkt" und "f" angeben
  return buf;
}

Connect.ino


// ****************************************************************
// Sketch Esp8266 Connect Modular(Tab) mit optischer Anzeige
// created: Jens Fleischer, 2018-04-08
// last mod: Jens Fleischer, 2020-04-19
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266
// Software: Esp8266 Arduino Core 2.4.2 / 2.5.2 / 2.6.3 / 2.7.1
// Getestet auf: Nodemcu, Wemos D1 Mini Pro, Sonoff Dual
/******************************************************************
  Copyright (c) 2018 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Diese Version von Connect sollte als Tab eingebunden werden.
// #include <ESP8266WebServer.h> oder #include <ESP8266WiFi.h> muss im Haupttab aufgerufen werden
// Die Funktion "Connect();" muss im Setup eingebunden werden.
/**************************************************************************************/

//#define CONFIG           // Einkommentieren wenn der ESP dem Router die IP mitteilen soll.
//#define NO_SLEEP         // Auskommentieren wenn der Nodemcu den deep sleep Modus nutzt.

const char* ssid = "Netzwerkname";             // << kann bis zu 32 Zeichen haben
const char* password = "PasswortvomNetzwerk";  // << mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

#ifdef CONFIG
IPAddress staticIP(192, 168, 178, 99);      // statische IP des NodeMCU ESP8266
IPAddress gateway(192, 168, 178, 1);        // IP-Adresse des Router
IPAddress subnet(255, 255, 255, 0);         // Subnetzmaske des Netzwerkes
IPAddress dns(192, 168, 178, 1);            // DNS Server
#endif

void Connect() {                            // Funktionsaufruf "Connect();" muss im Setup eingebunden werden
  byte i = 0;
  //WiFi.disconnect();                      // nur erforderlich wenn Esp den AP Modus nicht verlassen will
  WiFi.persistent(false);                   // auskommentieren wenn Netzwerkname oder Passwort in den Flash geschrieben werden sollen
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
#ifdef CONFIG
  WiFi.config(staticIP, gateway, subnet, dns);
#endif
  while (WiFi.status() != WL_CONNECTED) {
#ifdef NO_SLEEP
    pinMode(LED_BUILTIN, OUTPUT);           // OnBoardLed Nodemcu, Wemos D1 Mini Pro
    digitalWrite(LED_BUILTIN, 0);
#endif
    delay(500);
    digitalWrite(LED_BUILTIN, 1);
    delay(500);
    DEBUG_F(" %d sek\n", i);
    if (i++ > 9) {
      DEBUG_F("\n %s meldet, Verbindung zum AP fehlgeschlagen!\n\t\t Der Esp geht in den Energiesparmodus.\n\n", __PRETTY_FUNCTION__);
      ESP.deepSleep(300e6);                 // 5 Minuten Tiefschlaf falls der Router nicht erreichbar ist
    }
  }
  DEBUG_P("\nVerbunden mit: " + WiFi.SSID());
  DEBUG_P("Esp8266 IP: " + WiFi.localIP().toString());
}

Die URL des Innensensor muss im HttpPostClient Tab eingetragen werden.

HttpPostClient.ino


// ****************************************************************
// Sketch Esp8266 Http Post Client Modular(Tab)
// created: Jens Fleischer, 2019-09-14
// last mod: Jens Fleischer, 2020-05-20
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266
// Software: Esp8266 Arduino Core 2.4.2 / 2.5.2 / 2.6.3 / 2.7.1
// Getestet auf: Nodemcu, Wemos D1 Mini Pro
/******************************************************************
  Copyright (c) 2019 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Diese Version von HttppostClient sollte als Tab eingebunden werden.
// #include <ESP8266WebServer.h> oder #include <ESP8266WiFi.h> muss im Haupttab aufgerufen werden
// Die Funktion "Connect();" muss im Setup eingebunden sein.
// Die Funktion "httpPostClient();" kann nach dem Verbindungsaufbau aufgerufen werden.
/**************************************************************************************/

#include <ESP8266HTTPClient.h>

//#define CORE_2_4_2                                         // Einkommentieren für EspCoreVersion 2.4.2

const char* URL = "http://192.168.178.26/aussenklima";       // trage hier die URL deines ESP... mit Bme280 Sketch ein
bool error;

void httpPostClient() {
  WiFiClient client;
  HTTPClient http;
  DEBUG_F("\n %s meldet, in Zeile: %d -> HttpClient Begin\n", __PRETTY_FUNCTION__, __LINE__);

#ifndef CORE_2_4_2
  http.begin(client, URL);
#else
  http.begin(URL);
#endif

  http.addHeader("Content-Type", "application/json");
  int httpCode = http.POST(handleBme());
  if (httpCode > 0 && httpCode == HTTP_CODE_OK) {
    DEBUG_P("\nHTTP/1.1 " + (String)httpCode);
    DEBUG_P("Antwort: " + http.getString());
    DEBUG_P("Esp Tiefschlafmodus\n");
    ESP.deepSleep(300e6);                                  // 5 Minuten Tiefschlaf
  }
  else {
    DEBUG_F("\n %s meldet, Fehler: %s \n", __PRETTY_FUNCTION__, http.errorToString(httpCode).c_str());
    if (error) {                                             // Falls auch beim zweiten senden keine Antwort kommt wird geschlafen
      DEBUG_F("\n %s meldet, keine Verbindung mit: %s\n\t\t    Der Esp geht in den Energiesparmodus.\n\n", __PRETTY_FUNCTION__, URL);
      ESP.deepSleep(120e6);                                  // 120 Sekunden Tiefschlaf
    }
    error = true;
  }
  http.end();
}

Kommentar eintragen

*