Statusmeldungen mit einem ESP8266

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 :slight_smile:

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

Da dürfte es sich finden.

Da geht es schon los: Die Antwort habe ich nicht verstanden. Das D4 die interne ist, weiß ich. Aber warum bleibt sie bei allen anderen Aktionen aus und NUR bei wopen2 blinkt sie und bleibt dann an?

Weil sie mit 3.3V über einen Widerstand und mit dem anderen Anschluss am Pin hängt?
Also bei LOW leuchtet?

Ok, habe ich zwar immer noch nicht ganz verstanden aber wichtiger ist: wie kann ich das abstellen oder umgehen?

Schalte den Pin auf LOW, wenn die LED an sein soll, und auf HIGH, wenn sie aus sein soll.

Das habe ich doch hier gemacht.

Nochmal: Der esp bekommt Strom, die interne LED geht ganz kurz an und sofort wieder aus. Und sie bleibt auch aus, egal ob ein Fenster im EG, (wopen1) scharf gelbe LED oder voll scharf rote LED
an geht. NUR und ausschließlich NUR bei dem Öffnen eines Fensters im OG (wopen2) blinkt erst die interne sehr schnell, bleibt dann an und die grüne LED für Status Fenster OG offen geht an.
Ab jetzt bleibt die blaue Interne an, bis der USB-Stecker gezogen wird, oder resett betätigt wird.
Ich hoffe, jetzt ist es klarer...

redPin ist doch auch D4. Wenn sich also den Zustand von redPin ändert, änderst du auch den Zustand von der eingebauten LED.

Darauf wollte auch my_xy_projekt stoßen.

Das zum Beispiel sollte die eingebaute LED blinken lassen (wenn sie an D4 ist):

  server.on("/wopen1", []() {
    digitalWrite(led_green1, HIGH);
    blinken(redPin, 15);
    ok();

ok, dann werde ich damit mal ein wenig experimentieren.
Dann ist dss mit dem redpin schon falsch...

Warum verwendest du in dieser Funktion greenPin als Bezeichnung für eine beliebige LED?

Das habe ich aus einem anderen Code einfach übernommen ohne die Bezeichnung zu ändern. Sollte man da einen anderen Namen wählen?

Sollten Namen nicht Speicher mit sinnvollen Bezeichnungen verbinden?

Ist greenPin eine gute Bezeichnung für einen beliebigen Pin?

Meine Pins sind übrigens zumeist eher silbern oder Messing-farbig,
insofern ist greenPin nicht einmal eine gute Bezeichnung für einen Pin,
der eine grüne LED steuert.

Grün oder Weiß?

oh mann, ich sehe schon: da muss ich erstmal gründlich aufräumen und die Bezeichnungen anpassen um Verwirrungen zu vermeiden.

So, habe jetzt mal die greenPin Bezeichnung geändert und die Zeilen mit redPin und led_white rausgenommen. Wurde beides nicht benötigt. Das blaue blinken der internen LED ist auch verschwunden.
Vielen Dank für eure Hilfe!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.