#include #include #include #include #include #include #include #include #define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT #define ETH_PHY_POWER 12 const char* wifi_ssid = "ssid"; const char* wifi_password = "passord"; static bool eth_connected = false; volatile float temperature = 0; volatile float pressure = 0; volatile float humidity = 0; boolean BME280_Sensor_State = false; String website = ""; Ticker Ticker_ReadSensors; Ticker Ticker_Service; WebServer WebServer_Server(80); Adafruit_BME280 BME280_Sensor; void setup() { Serial.begin(115200); // RS232 Wire.begin (13, 16); // I²C Init pinMode (34, INPUT); // User Button Ticker_ReadSensors.attach(15, ReadSensors); Ticker_Service.attach(1, Service); Serial.println("Starting..."); /* WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); */ WiFi.onEvent(EthEvent); ETH.begin(); WebServer_Server.on("/", handleRoot); WebServer_Server.on("/metrics", handleMetrics); WebServer_Server.onNotFound(handleNotFound); WebServer_Server.begin(); Serial.println("HTTP server started"); if (! BME280_Sensor.begin(0x76)) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } BME280_Sensor.setSampling(Adafruit_BME280::MODE_FORCED, Adafruit_BME280::SAMPLING_X1, // temperature Adafruit_BME280::SAMPLING_X1, // pressure Adafruit_BME280::SAMPLING_X1, // humidity Adafruit_BME280::FILTER_OFF); } /* Main Loop */ void loop() { WebServer_Server.handleClient(); } /* Timer Events */ void Service() { Serial.print("."); } void ReadSensors() { BME280_Sensor.takeForcedMeasurement(); temperature = BME280_Sensor.readTemperature(); pressure = (BME280_Sensor.readPressure() / 100.0F); humidity = BME280_Sensor.readHumidity(); Serial.print("\nTemperature: "); Serial.print(temperature); Serial.print(", Pressure: "); Serial.print(pressure); Serial.print(", Humidity: "); Serial.println(humidity); } /* Eth Interface */ void EthEvent(WiFiEvent_t event) { switch (event) { case SYSTEM_EVENT_ETH_START: Serial.println("ETH Started"); //set eth hostname here ETH.setHostname("esp32-poe-sensor"); break; case SYSTEM_EVENT_ETH_CONNECTED: Serial.println("ETH Connected"); break; case SYSTEM_EVENT_ETH_GOT_IP: Serial.print("ETH MAC: "); Serial.print(ETH.macAddress()); Serial.print(", IPv4: "); Serial.print(ETH.localIP()); if (ETH.fullDuplex()) { Serial.print(", FULL_DUPLEX"); } Serial.print(", "); Serial.print(ETH.linkSpeed()); Serial.println("Mbps"); eth_connected = true; break; case SYSTEM_EVENT_ETH_DISCONNECTED: Serial.println("ETH Disconnected"); eth_connected = false; break; case SYSTEM_EVENT_ETH_STOP: Serial.println("ETH Stopped"); eth_connected = false; break; default: break; } } /* Webserver */ void handleRoot() { website = ""; website += "

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

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

rel. Luftfeuchte: "; website += humidity; website += " %

"; WebServer_Server.send(200, "text/html", website); } void handleNotFound() { WebServer_Server.send(404, "text/plain", "Not found!"); } void handleMetrics() { website = ""; website += "# HELP temperature The temperature measured in degree Celcius by the specified sensor.\n# TYPE temperature gauge\ntemperature{sensor=\"BME280\",address=\"0x76\"} "; website += temperature; website += "\n\n# HELP humidity The relative humidity measured in percent by the specified sensor.\n# TYPE humidity gauge\nhumidity{sensor=\"BME280\",address=\"0x76\"} "; website += humidity; website += "\n\n# HELP pressure The air pressure measured in hPa by the specified sensor.\n# TYPE pressure gauge\npressure{sensor=\"BME280\",address=\"0x76\"} "; website += pressure; website += "\n"; WebServer_Server.send(200, "text/plain", website); }