#include #include #include #include #include #include #include "Config.ino" #include // Globale Deklarationen für alle Tabs ESP8266WebServer server(80); const byte DNS_PORT = 53; DNSServer dnsServer; String sketchName() { // Dateiname für den Admin Tab ab EspCoreVersion 2.6.0 char file[sizeof(__FILE__)] = __FILE__; char * pos = strrchr(file, '.'); *pos = '\0'; return file; } #define AMOUNTOFPORTS 16 // currently max 16 ports are supported #define EXPANDER1ADDRESS 0x21 // address of expander 1 PCF8575 expander1(EXPANDER1ADDRESS); uint8_t portStates[AMOUNTOFPORTS]; uint8_t lastStates[AMOUNTOFPORTS] = {0}; byte number=0; extern Adafruit_NeoPixel* pixels; void setup() { Serial.begin(SERIAL_SPEED); delay(100); Serial.printf("\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()); Serial.printf("\nKeyPatch ESP8266 WebServer\n"); //Set UP 12C Communication Wire.begin(); for (byte adress=8; adress<120; adress++) { Wire.beginTransmission(adress); if (Wire.endTransmission()==0) { Serial.print(number+1); Serial.print(". Device: 0x"); Serial.println(adress, HEX); number++; } } Serial.print (number, DEC); Serial.println (" device(s) found."); //Setup CPF Expander Serial.print("Expander 1 at "); Serial.print(EXPANDER1ADDRESS,HEX); if (!expander1.begin()) { Serial.println(" could not initialize..."); } if (!expander1.isConnected()) { Serial.println(" => not connected"); } else { Serial.println(" => connected!!"); } //Setup NeoPixel NeoPixel_init(AMOUNTOFPORTS); // Initialisierung der NeoPixel for (uint8_t i = 0; i < AMOUNTOFPORTS; i++) { portStates[i] = 0; lastStates[i] = 0; pixels->setPixelColor(i, pixels->Color(0, 0, 0)); // aus }; pixels->show(); // SetUp WebServer setupFS(); // setupFS(); oder spiffs(); je nach Dateisystem connectWifi(); admin(); ArduinoOTA.onStart([]() { //save(); // Wenn Werte vor dem Neustart gespeichert werden sollen }); ArduinoOTA.begin(); server.begin(); Serial.println("Setup End..."); } void loop() { ArduinoOTA.handle(); server.handleClient(); if (millis() < 0x2FFF || millis() > 0xFFFFF0FF) { // Die Funktion "runtime()" wird nur für den Admin Tab gebraucht. runtime(); // Auskommentieren falls du den Admin Tab nicht nutzen möchtest. } dnsServer.processNextRequest(); reStation(); // Erst 16 Ports aus PCF8575 einlesen for (uint8_t i = 0; i < AMOUNTOFPORTS; i++) { portStates[i] = expander1.read(i); } for (uint8_t i = 0; i < AMOUNTOFPORTS; i++) { if (portStates[i] != lastStates[i]) { // Ausgabe: geänderte Ports melden Serial.print("Pin "); Serial.print(i); Serial.print(" hat sich geändert -> "); Serial.println(portStates[i]); lastStates[i] = portStates[i]; } // LED aktualisieren if (portStates[i] == 0) { pixels->setPixelColor(i, pixels->Color(0, 150, 0)); // grün } else { bool globalBlinkState = (millis() / BLINK_INTERVAL) % 2; if (globalBlinkState) { pixels->setPixelColor(i, pixels->Color(150, 0, 0)); // rot } else { pixels->setPixelColor(i, pixels->Color(0, 0, 0)); // aus } } } pixels->show(); delay(50); }