2018-10-16

Esp8266 Zeitschaltuhr Arduino Tab.

Zeitschaltuhr.ino

// ****************************************************************
// Sketch Esp8266 Zeitschaltuhr Modular(Tab)
// created: Jens Fleischer, 2018-10-16
// last mod: Jens Fleischer, 2018-10-16
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266, Nodemcu,  Relais Modul
// GND an GND
// IN an D4 = GPIO2
// VCC an VIN -> je nach verwendeten Esp.. möglich
// Jumper JD-VCC VCC
// alternativ ext. 5V Netzteil verwenden
// Getestet auf: Nodemcu
/******************************************************************
  Copyright (c) 2018 Jens Fleischer. All rights reserved.

  This file is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  This file is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
*******************************************************************/
// Diese Version von Zeitschaltuhr sollte als Tab eingebunden werden.
// #include <ESP8266WebServer.h> muss im Haupttab aufgerufen werden
// Die Funktionalität des ESP8266 Webservers ist erforderlich.
// Der Zeitstempel Tab ist zum ausführen der Zeitschaltuhr einzubinden.
// Die Funktion "schaltuhr();" muss im Setup aufgerufen werden.
// Zum schalten muss die Funktion "zeitschaltuhr();" im loop(); aufgerufen werden.
/**************************************************************************************/

const byte RelPin = D4;     // Pin für Relais einstellen
const uint8_t item = 0x0A;
struct schaltzeit {
  char schaltZeit[6];
} sz[item];

void schaltuhr() {
  pinMode(RelPin, OUTPUT);
  digitalWrite(RelPin, HIGH);
  File file = SPIFFS.open("/szeit.txt", "r");
  if (file) {
    for (uint8_t i = 0; i < item; i++) {
      file.readBytesUntil('\n', sz[i].schaltZeit, sizeof(sz[i].schaltZeit));
    }
    file.close();
  }
  server.on("/schaltuhr", HTTP_POST, []() {
    if (server.hasArg("sz0")) {
      File file = SPIFFS.open("/szeit.txt", "w");
      if (file) {
        for (uint8_t i = 0; i < server.args(); i++) {
          strcpy (sz[i].schaltZeit, server.arg(i).c_str());
          file.printf("%s\n", server.arg(i).c_str());
        }
        file.close();
      }
      server.send(204, "");
    }
    String temp = "[";
    for (uint8_t i = 0; i < item; i++) {
      if (temp != "[") temp += ',';
      temp += (String)"\"" + sz[i].schaltZeit + "\"";
    }
    temp += "]";
    server.send(200, "application/json", temp);
  });
  server.on("/status", []() {
    bool relStatus = digitalRead(RelPin);
    if (server.hasArg("tog")) {
      digitalWrite(RelPin, !relStatus);    // Relais manuell schalten
    }
    server.send(200, "application/json", "[\"" + (String)Zeitstempel() + "\",\"" + (relStatus ? "OFF" : "ON") + "\"]");
  });
}

void zeitschaltuhr() {
  char buf[6];
  static unsigned long letzteMillis = 0;
  unsigned long aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 1000) {
    letzteMillis = aktuelleMillis;
    snprintf(buf, sizeof(buf), "%0.2d:%0.2d", tm.tm_hour, tm.tm_min);
    for (uint8_t i = 0; i < item; i++) {
      if (strcmp(sz[i].schaltZeit, buf) == 0 && tm.tm_sec < 2) i % 2 == 0 ? digitalWrite(RelPin, LOW) : digitalWrite(RelPin, HIGH);    // Relais nach Zeit schalten
    }
  }
}

Zurück