130 lines
3.6 KiB
C++
130 lines
3.6 KiB
C++
#include <Wire.h>
|
|
#include <PCF8575.h>
|
|
#include <Adafruit_NeoPixel.h>
|
|
#include <ESP8266WebServer.h>
|
|
#include <ArduinoOTA.h>
|
|
#include <LittleFS.h>
|
|
#include "Config.ino"
|
|
#include <DNSServer.h>
|
|
|
|
// 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);
|
|
} |