keypatch/src/KeyPatch.ino

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);
}