...in Kürze...
#include <ESP8266WebServer.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <WiFiUdp.h>
// #include <ESP8266WiFi.h>
#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 = "<!DOCTYPE html> <html>\n";
ptr += "<meta http-equiv=\"refresh\" content=\"30\">\n";
ptr += "<head><title>ESP8266 BME280 webserver</title>\n";
ptr += "<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: left;}\n";
ptr += "body{margin-top: 50px;} h1 {color: #000000;margin: 50px auto 30px;}\n";
ptr += "p {color: #000000;margin-bottom: 10px;}\n";
ptr += "</style>\n";
ptr += "</head>\n";
ptr += "<body>\n";
ptr += "<div id=\"webpage\">\n";
ptr += "<h1>ESP8266 BME280 Werte</h1>\n";
ptr += "<p>Client IP: ";
ptr += clientIP;
ptr += "<br>Serveraufrufe: ";
ptr += countServerConnects;
ptr += "</p>";
ptr += "<p>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 += "<br>NTP Server: ";
ptr += NTPServerName;
ptr += "<br>IP: ";
ptr += NTPServerStr;
ptr += "</p>";
ptr += "<p>Temperatur: ";
ptr += temperature;
ptr += "°C</p>";
ptr += "<p>rel. Luftfeutigkeit: ";
ptr += humidity;
ptr += "%</p>";
ptr += "<p>Luftdruck: ";
ptr += pressure;
ptr += "hPa</p>";
ptr += "<p>Höhe: ";
ptr += altitude;
ptr += "m</p>";
ptr += "</div>\n";
ptr += "</body>\n";
ptr += "</html>\n";
return ptr;
}