2019-07-20

Esp8266 Zeitschaltuhr Arduino Tab.

Zeitschaltuhr.ino

// ****************************************************************
// Sketch Esp8266 Zeitschaltuhr Modular(Tab)
// created: Jens Fleischer, 2019-07-20
// last mod: Jens Fleischer, 2019-07-20
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp8266, Relais Modul o. Mosfet IRF3708 o. Fotek SSR-40 DA
// für Relais Modul
// GND an GND
// IN1 an D5 = GPIO14
// VCC an VIN -> je nach verwendeten Esp.. möglich
// Jumper JD-VCC VCC
// alternativ ext. 5V Netzteil verwenden
//
// für Mosfet IRF3708
// Source an GND
// Mosfet1 Gate an D5 = GPIO14
//
// für 3V Solid State Relais
// GND an GND
// SSR1 Input + an D5 = GPIO14
//
// Software: Esp8266 Arduino Core 2.4.2 / 2.5.0 / 2.5.2
// Getestet auf: Nodemcu, Wemos D1 Mini Pro
/******************************************************************
  Copyright (c) 2019 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 <FS.h> #include <ESP8266WebServer.h> müssen im Haupttab aufgerufen werden
// Die Funktionalität des ESP8266 Webservers ist erforderlich.
// Der Lokalzeit Tab ist zum ausführen der Zeitschaltuhr einzubinden.
// Die Funktion "setupTimeSwitch();" muss im Setup aufgerufen werden.
// Zum schalten muss die Funktion "timeSwitch();" im loop(); aufgerufen werden.
/**************************************************************************************/

const auto aktiv = LOW;                       // LOW für LOW aktive Relais oder HIGH für HIGH aktive (zB. SSR, Mosfet) einstellen
const uint8_t relPin = {D5};                  // Pin für Relais einstellen
const auto count = 30;                        // Anzahl Schaltzeiten (analog Html Dokument) einstellen 1 bis 60
char switchTime[count * 2][6];
byte switchActive[count], wday[count];
bool fixed, relState{!aktiv};

void setupTimeSwitch() {
  digitalWrite(relPin, !aktiv);
  pinMode(relPin, OUTPUT);
  File file = SPIFFS.open("/swtime.dat", "r");
  if (file) {                                                        // Einlesen aller Daten falls die Datei im Spiffs vorhanden ist.
    file.read(switchActive, sizeof(switchActive));
    file.read(wday, sizeof(wday));
    while (file.read() != '\n');
    for (auto& elem : switchTime) file.readBytesUntil('\n', elem, sizeof(elem));
    file.close();
  } else {                                                           // Sollte die Datei nicht existieren
    for (auto i = 0; i < count; i++) {
      switchActive[i] = 1;                                           // werden alle Schaltzeiten
      wday[i] = ~wday[i];                                            // und alle Wochentage aktiviert.
    }
  }
  server.on("/timer", HTTP_POST, []() {
    if (server.args() == 1) {
      switchActive[server.argName(0).toInt()] = server.arg(0).toInt();
      printer();
      String temp = "\"";
      for (auto& elem : switchActive) temp += elem;
      temp += "\"";
      server.send(200, "application/json", temp);
    }
    if (server.hasArg("sTime")) {
      byte i {0};
      char str[count * 14];
      strcpy (str, server.arg("sTime").c_str());
      char* ptr = strtok(str, ",");
      while (ptr != NULL) {
        strcpy (switchTime[i++], ptr);
        ptr = strtok(NULL, ",");
      }
      if (server.arg("sDay")) {
        i = 0;
        strcpy (str, server.arg("sDay").c_str());
        char* ptr = strtok(str, ",");
        while (ptr != NULL) {
          wday[i++] = atoi(ptr);
          ptr = strtok(NULL, ",");
        }
        printer();
      }
    }
    String temp = "[";
    for (auto& elem : switchTime) {
      if (temp != "[") temp += ',';
      temp += (String)"\"" + elem + "\"";
    }
    temp += ",\"";
    for (auto& elem : switchActive) {
      temp += elem;
    }
    for (auto& elem : wday) {
      temp += "\",\"";
      temp += elem;
    }
    temp += "\"]";
    server.send(200, "application/json", temp);
  });
  server.on("/timer", HTTP_GET, []() {
    if (server.hasArg("tog") && server.arg(0) == "tog") relState = !relState;                 // Relais1 Status manuell ändern
    if (server.hasArg("tog") && server.arg(0) == "fix") fixed = !fixed;                       // alle Schalzeiten deaktivieren/aktivieren
    server.send(200, "application/json", (String)"[\"" + (relState == aktiv) + "\",\"" + localTime() + "\",\"" + fixed + "\"]");
  });
}

void printer() {
  File file = SPIFFS.open("/swtime.dat", "w");
  if (file) {
    file.write(switchActive, sizeof(switchActive));
    file.write(wday, sizeof(wday));
    for (auto& elem : switchTime) file.printf("\n%s", elem);
    file.close();
  }
}

void timeSwitch() {
  static auto lastmin = -1;
  static uint8_t lastState = {aktiv};
  localTime();                                        // Uhrzeit aktualisieren
  if (tm.tm_min != lastmin && !fixed) {
    lastmin = tm.tm_min;
    char buf[6];
    sprintf(buf, "%.2d:%.2d", tm.tm_hour, tm.tm_min);
    for (auto i = 0; i < count * 2; i++) {
      if (switchActive[i / 2] && !strcmp(switchTime[i], buf)) {
        if (wday[i / 2] & (1 << (tm.tm_wday ? tm.tm_wday - 1 : 6))) relState = i & 1 ? !aktiv : aktiv; // Relais Status nach Zeit ändern
      }
    }
  }
  if (relState != lastState) {                       // Relais schalten wenn sich der Status geändert hat
    lastState = relState;
    digitalWrite(relPin, relState);
    Serial.println((String)"Relais" + (digitalRead(relPin) == aktiv ? " an" : " aus"));
  }
}

Vorgänger Version Zeitschaltuhr Tab

Zurück