2019-03-07

Esp8266 Zeitschaltuhr Dual als Arduino Tab.

Zeitschaltuhr.ino

// ****************************************************************
// Sketch Esp8266 Zeitschaltuhr Dual Modular(Tab)
// created: Jens Fleischer, 2019-02-24
// last mod: Jens Fleischer, 2019-04-06
// 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
// IN2 an D6 = GPIO12
// 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
// Mosfet2 Gate an D6 = GPIO12
//
// für 3V Solid State Relais
// GND an GND
// SSR1 Input + an D5 = GPIO14
// SSR2 Input + an D6 = GPIO12
//
// Software: Esp8266 Arduino Core 2.4.2
// Getestet auf: Nodemcu, Wemos D1 Mini Pro
/******************************************************************
  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 <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 "setupSchaltUhr();" muss im Setup aufgerufen werden.
// Zum schalten muss die Funktion "dualSchaltuhr();" im loop(); aufgerufen werden.
/**************************************************************************************/

const auto active = LOW;                   // LOW für LOW aktive Relais oder HIGH für HIGH aktive (zB. SSR, Mosfet) einstellen
const uint8_t devicePin[] = {D5, D6};     // Pin für Relais einstellen
const auto item = 12;                     // Anzahl Schaltzeiten (analog Html Dokument) einstellen 2 bis 16
char switchTime[item * 2][6];
uint8_t switchActive[item];
bool relState[] = {!active, !active};

void setupSchaltUhr() {
  for (auto pin : devicePin) digitalWrite(pin, !active), pinMode(pin, OUTPUT);
  File file = SPIFFS.open("/szeit.txt", "r");
  if (file) {
    for (auto i = 0; i < item * 2; i++) {
      file.readBytesUntil('\n', switchTime[i], sizeof(switchTime[i]));
    }
    for (auto i = 0; i < item; i++) {
      switchActive[i] = file.parseInt();
    }
    file.close();
  }
  server.on("/timer", HTTP_POST, []() {
    if (server.args() == 1) {
      switchActive[server.argName(0).toInt()] = server.arg(0).toInt();
      printer();
    }
    if (server.hasArg("sz0")) {
      for (auto i = 0; i < server.args(); i++) {
        strcpy (switchTime[i], server.arg(i).c_str());
      }
      printer();
    }
    String temp = "[";
    for (auto i = 0; i < item * 2; i++) {
      if (temp != "[") temp += ',';
      temp += (String)"\"" + switchTime[i] + "\"";
    }
    for (auto i = 0; i < item; i++) {
      temp += (String)",\"" + switchActive[i] + "\"";
    }
    temp += "]";
    server.send(200, "application/json", temp);
  });
  server.on("/timer", HTTP_GET, []() {
    char buf[9];
    strftime (buf, sizeof(buf), "%T ", &tm);
    if (server.hasArg("tog1")) relState[0] = !relState[0];    // Relais1 manuell schalten
    if (server.hasArg("tog2")) relState[1] = !relState[1];    // Relais2 manuell schalten
    server.send(200, "application/json", (String)"[\"" + buf + "\",\"" + (relState[0] == active) + "\",\"" + (relState[1] == active) + "\"]");
  });
}
void printer() {
  File file = SPIFFS.open("/szeit.txt", "w");
  if (file) {
    for (auto i = 0; i < item * 2; i++) {
      file.printf("%s\n", switchTime[i]);
    }
    for (auto i = 0; i < item; i++) {
      file.printf("%d\n", switchActive[i]);
    }
    file.close();
  }
}

void dualSchaltuhr() {
  static uint8_t lastmin = 60;
  static uint8_t lastState[] = {active, active};
  localTime();
  if (tm.tm_min != lastmin) {
    lastmin = tm.tm_min;
    char buf[6];
    snprintf(buf, sizeof(buf), "%.2d:%.2d", tm.tm_hour, tm.tm_min);
    for (auto i = 0; i < item * 2; i++) {
      if (i < (item % 2 ? item + 1 : item)) {
        if (switchActive[i / 2] && !strcmp(switchTime[i], buf)) i % 2 ? relState[0] = !active : relState[0] = active; // Relais1 nach Zeit schalten
      }
      else {
        if (switchActive[i / 2] && !strcmp(switchTime[i], buf)) i % 2 ? relState[1] = !active : relState[1] = active; // Relais2 nach Zeit schalten
      }
    }
  }
  if (relState[0] != lastState[0] || relState[1] != lastState[1]) {
    for (auto i = 0; i < 2; i++) {
      lastState[i] = relState[i];
      digitalWrite(devicePin[i], relState[i]);
      Serial.println((String)"Relais" + (1 + i) + (digitalRead(devicePin[i]) == active ? " an" : " aus"));
    }
  }
}

Die Anzahl der Schaltprogramme muss im Sketch analog der Anzahl im Html Dokument eingestellt sein!

Der Lokalzeit Tab ist zum ausführen der Zeitschaltuhr einzubinden.

Zurück