#include #include #include #include #include // #include #define SEALEVELPRESSURE_HPA (1013.25) /* BME280 Sensor Objekt definieren */ Adafruit_BME280 bme; float temperature, humidity, pressure, altitude; // BME280 Werte /*Put your SSID & Password*/ const char* ssid = "**********"; // Enter SSID here const char* password = "****************"; // Enter Password here ESP8266WebServer server(80); // ESP Webserver Objekt definieren String clientIP; // Remote / ClientIP unsigned long countServerConnects = 0; // Server Aufrufe zählen /* ################################### */ /* NTP Libraries, constans and globals */ /* ################################### */ WiFiUDP UDP; // WiFi UDP Objekt definieren IPAddress NTPServerIP; // IP Adresse für den Zeitserver String NTPServerStr; // String für NTPServerIP const char* NTPServerName = "time.nist.gov"; // time.nist.gov als Zeitserver verwenden const int NTP_PACKET_SIZE = 48; // Zeitcode befindet sich in den ersten 48 Bytes byte NTPBuffer[NTP_PACKET_SIZE]; // Puffer für NTP Packete unsigned long intervalNTP = 60000; // request NTP time every minute unsigned long prevNTP = 0; // Zeit vorheriger NTP Abfrage unsigned long lastNTPResponse = millis(); // letzte NTP Zeitabfrage unsigned long prevActualTime = 0; // unsigned long timeCET; uint32_t timeUNIX = 0; /* ################################### */ /* ########## */ /* VOID SETUP */ /* ########## */ void setup() { Serial.begin(115200); delay(100); bme.begin(0x76); // Sensor Adress (Jumper / Lötbrücken) Serial.println("Connecting to "); Serial.println(ssid); //connect to your local wi-fi network WiFi.begin(ssid, password); // WiFi.printDiag(Serial); //check wi-fi is connected to wi-fi network while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected..!"); Serial.print("Got IP: "); Serial.println(WiFi.localIP()); server.on("/", handle_OnConnect); server.onNotFound(handle_NotFound); server.begin(); Serial.println("HTTP server started"); /* NTP */ startUDP(); if (!WiFi.hostByName(NTPServerName, NTPServerIP)) { Serial.println("DNS lookup failed!"); Serial.flush(); ESP.reset(); } Serial.print("Time server IP:\t"); Serial.println(NTPServerIP); NTPServerStr = NTPServerIP.toString(); //IP Adresse als String speichern Serial.println("\r\nSending NTP request ..."); sendNTPpacket(NTPServerIP); } /* ######### */ /* VOID LOOP */ /* ######### */ void loop() { server.handleClient(); // auf Client Anfragen warten /* NTP Loop */ unsigned long currentMillis = millis(); if (currentMillis - prevNTP > intervalNTP) { prevNTP = currentMillis; Serial.println("\r\nSending NTP request ..."); sendNTPpacket(NTPServerIP); } uint32_t time = getTime(); // Check if an NTP response has arrived and get the (UNIX) time if (time) { // If a new timestamp has been received timeUNIX = time; Serial.print("NTP response:\t"); Serial.println(timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse) > 3600000) { Serial.println("More than 1 hour since last NTP response. Rebooting."); Serial.flush(); ESP.reset(); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; if (actualTime != prevActualTime && timeUNIX != 0) { // If a second has passed since last print prevActualTime = actualTime; timeCET = actualTime + 7200; Serial.printf("\rUTC time:\t%02d:%02d:%02d ", getHours(actualTime), getMinutes(actualTime), getSeconds(actualTime),"\t"); // Serial.println(); Serial.printf("\rCET time:\t%02d:%02d:%02d ", getHours(timeCET), getMinutes(timeCET), getSeconds(timeCET)); Serial.println(); } /* ######## */ /* END LOOP */ /* ######## */ } void startUDP() { Serial.println("Starting UDP"); UDP.begin(123); Serial.print("Local port:\t"); Serial.println(UDP.localPort()); Serial.println(); } uint32_t getTime() { if (UDP.parsePacket() == 0) { // If there's no response (yet) return 0; } UDP.read(NTPBuffer, NTP_PACKET_SIZE); // read the packet into the buffer // Combine the 4 timestamp bytes into one 32-bit number uint32_t NTPTime = (NTPBuffer[40] << 24) | (NTPBuffer[41] << 16) | (NTPBuffer[42] << 8) | NTPBuffer[43]; // Convert NTP time to a UNIX timestamp: // Unix time starts on Jan 1 1970. That's 2208988800 seconds in NTP time: const uint32_t seventyYears = 2208988800UL; // subtract seventy years: uint32_t UNIXTime = NTPTime - seventyYears; return UNIXTime; } void sendNTPpacket(IPAddress& address) { memset(NTPBuffer, 0, NTP_PACKET_SIZE); NTPBuffer[0] = 0b11100011; //LI, Version, Mode UDP.beginPacket(address, 123); UDP.write(NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket(); } inline int getSeconds(uint32_t UNIXTime) { return UNIXTime % 60; } inline int getMinutes(uint32_t UNIXTime) { return UNIXTime / 60 % 60; } inline int getHours(uint32_t UNIXTime) { return UNIXTime / 3600 % 24; } void handle_OnConnect() { countServerConnects++; temperature = bme.readTemperature(); humidity = bme.readHumidity(); pressure = bme.readPressure() / 100.0F; altitude = bme.readAltitude(SEALEVELPRESSURE_HPA); clientIP = server.client().remoteIP().toString(); server.send(200, "text/html", SendHTML(temperature, humidity, pressure, altitude)); Serial.print("Temperatur ="); Serial.println(temperature); Serial.print("Feuchte ="); Serial.println(humidity); Serial.print("Druck ="); Serial.println(pressure); Serial.print("Serveraufrufe = ");Serial.println(countServerConnects); } void handle_NotFound() { server.send(404, "text/plain", "Not found"); } String SendHTML(float temperature, float humidity, float pressure, float altitude) { String ptr = " \n"; ptr += "\n"; ptr += "ESP8266 BME280 webserver\n"; ptr += "\n"; ptr += "\n"; ptr += "\n"; ptr += "
\n"; ptr += "

ESP8266 BME280 Werte

\n"; ptr += "

Client IP: "; ptr += clientIP; ptr += "
Serveraufrufe: "; ptr += countServerConnects; ptr += "

"; ptr += "

CET time: "; if (getHours(timeCET) >= 10) { ptr += getHours(timeCET); } else { ptr +="0"; ptr += getHours(timeCET); } ptr += ":"; if (getMinutes(timeCET) >= 10) { ptr += getMinutes(timeCET); } else { ptr +="0"; ptr += getMinutes(timeCET); } ptr += ":"; if (getSeconds(timeCET) >= 10) { ptr += getSeconds(timeCET); } else { ptr +="0"; ptr += getSeconds(timeCET); } ptr += "
NTP Server: "; ptr += NTPServerName; ptr += "
IP: "; ptr += NTPServerStr; ptr += "

"; ptr += "

Temperatur: "; ptr += temperature; ptr += "°C

"; ptr += "

rel. Luftfeutigkeit: "; ptr += humidity; ptr += "%

"; ptr += "

Luftdruck: "; ptr += pressure; ptr += "hPa

"; ptr += "

Höhe: "; ptr += altitude; ptr += "m

"; ptr += "
\n"; ptr += "\n"; ptr += "\n"; return ptr; }