Hallo zusammen,
ich habe seit einiger Zeit unten stehendes Listing in Gebrauch. Es funktioniert auch soweit sehr gut und zuverlässig. Zwei Sachen würde ich jedoch sehr gerne ändern, weiß allerdings nicht wie.
Das Ganze ist eine Statusanzeige für eine Alarmanlage. Wenn ein Fenster im Erdgeschoss geöffnet ist dann geht eine grüne LED an (wopen1). Das gleiche im Og. (wopen2).
Und auch die beiden Alarmzustände werden richtig angezeigt.
Die eingebaute LED ist ausgeschaltet. (Eigentlich...) Denn jetzt kommen wir zum ersten Punkt:
wen der ESP den wopen2 Befehl bekommt, blinkt zuerst die interne LED ganz hektisch für ca. 1-2 Sekunden, bleibt dann an und erst dann geht die grüne LED für das OG an. Warum macht die interne das und wie stelle ich das ab?
Der zweite Punkt: Ich würde gerne die interne oder eine weitere externe LED als weitere optische Anzeige für eine Alarmverzögerung bei Zutritt nutzen. D.h. wenn ich zur Haustür reinkomme, soll sie für eine einstellbare Zeit in einer einstellbaren Frequenz blinken.
Wie man vielleicht an diesem Text hier sehen kann, ist der Code nicht von mir (bis auf einige klitzekleine Änderungen) und ich sehe mich auch nicht in der Lage das oben gewünschte dort einzubringen.
Ich hoffe hier Hilfe für einen blutigen Anfänger zu bekommen.
Falls noch etwas unklar ist bitte ich um Nachsicht. Ich versuche mich dann verständlicher auszudrücken
LG Rudi
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#define MY_SSID "XXXXX"
#define MY_KEY "xxxxxxxxx"
#define GET_STATUS 0
#define GET_WINDOW1 1
#define GET_WINDOW2 2
#define STATUS_DISARMED 0
#define STATUS_ARMED 1
#define STATUS_HOME 2
#define BLINK_PERIOD 500 // ms
unsigned long last_blink = 0;
const char *ssid = MY_SSID;
const char *password = MY_KEY;
ESP8266WebServer server(80);
int greenPin = D6;
int redPin = D4;
const int led_red = D1; // arm
const int led_green1 = D2; // 1.Og.
const int led_green2 = D3; // Eg.
const int LED_Builtin = D4; //D4 is the internal LED on NodeMCU
const int led_yellow = D5; // home
const int led_white = D6; // Für Disarm
int lupus_status = STATUS_DISARMED;
const char* getLEDStatus(int n) {
switch (n) {
case GET_STATUS:
if (lupus_status == STATUS_ARMED)
return "armed";
else if (lupus_status == STATUS_HOME)
return "home";
else
return "disarmed";
break;
case GET_WINDOW1:
if (digitalRead(led_green1) == HIGH)
return "open";
else
return "closed";
break;
case GET_WINDOW2:
if (digitalRead(led_green2) == HIGH)
return "open";
else
return "closed";
break;
}
return "";
}
void blinken(int greenPin, int wiederholungen) {
for (int i = 0; i < wiederholungen; i = i + 1) {
digitalWrite(greenPin, HIGH);
delay(50);
digitalWrite(greenPin, LOW);
delay(50);
}
}
void handleRoot() {
char http[1000];
// be careful, max. stack size for ESP8266 is 4kB. If you need bigger pages, then consider
// to use flash (PROGMEM or SPIFF) or send to client in parts. This one here is quick and dirty ;-)
int sec = millis() / 1000;
int min = sec / 60;
int hr = min / 60;
snprintf(http, 1000,
"<!DOCTYPE html>\
<html>\
<meta http-equiv='refresh' content='5'/>\
<title>ESP8266 Lupus Status</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000000 }\
</style>\
</head>\
<body>\
<h1>Lupus Status</h1>\
<table>\
<tr><td>Status:</td><td>%s</td></tr>\
<tr><td>Fenster OG:</td><td>%s</td></tr>\
<tr><td>Fenster EG:</td><td>%s</td></tr>\
</table>\
<p>Uptime: %02d:%02d:%02d</p>\
</body>\
</html>\
",
getLEDStatus(GET_STATUS), getLEDStatus(GET_WINDOW1), getLEDStatus(GET_WINDOW2), hr, min % 60, sec % 60
);
server.send(200, "text/html", http);
}
void redirect() {
server.sendHeader("Location", String("/"), true);
server.send ( 302, "text/plain", "");
}
void ok() {
server.send (200);
}
void setup(void) {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(led_red, OUTPUT);
pinMode(led_green1, OUTPUT);
pinMode(led_green2, OUTPUT);
pinMode(led_yellow, OUTPUT);
pinMode(led_white, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH); //Interne LED aus
digitalWrite(led_red, LOW);
digitalWrite(led_green1, LOW);
digitalWrite(led_green2, LOW);
digitalWrite(led_yellow, LOW);
digitalWrite(led_white, LOW);
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esplupus")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot);
server.on("/arm", []() {
lupus_status = STATUS_ARMED;
ok();
});
server.on("/home", []() {
lupus_status = STATUS_HOME;
ok();
});
server.on("/wopen1", []() {
digitalWrite(led_green1, HIGH);
blinken(redPin, 15);
ok();
});
server.on("/wopen2", []() {
digitalWrite(led_green2, HIGH);
ok();
});
server.on("/disarm", []() {
lupus_status = 0;
digitalWrite(led_white, HIGH);
ok();
});
server.on("/wclosed", []() {
digitalWrite(led_green1, LOW);
digitalWrite(led_green2, LOW);
digitalWrite(redPin, LOW);
ok();
});
server.on("/wclosed1", []() {
digitalWrite(led_green1, LOW);
ok();
});
server.on("/wclosed2", []() {
digitalWrite(led_green2, LOW);
ok();
});
server.onNotFound([]() {
ok();
});
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
server.handleClient();
MDNS.update();
if ((millis() - last_blink) > BLINK_PERIOD) {
switch (lupus_status) {
case 1: // blink red led
digitalWrite(led_red, !digitalRead(led_red));
digitalWrite(led_yellow, LOW);
digitalWrite(led_white, LOW);
break;
case 2:
digitalWrite(led_yellow, !digitalRead(led_yellow));
digitalWrite(led_red, LOW);
digitalWrite(led_white, LOW);
break;
default:
digitalWrite(led_red, LOW);
digitalWrite(led_yellow, LOW);
digitalWrite(led_white, HIGH);
}
last_blink = millis();
}
delay(10);
}