2018-12-24

Esp32 Zeitschaltuhr Dual als Arduino Tab.

Zeitschaltuhr.ino

// ****************************************************************
// Sketch Esp32 Zeitschaltuhr Dual Modular(Tab)
// created: Jens Fleischer, 2018-12-23
// last mod: Jens Fleischer, 2018-12-24
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Esp32, Relais Modul o. Mosfet IRF3708 o. Fotek SSR-40 DA
// für Relais Modul
// GND an GND
// IN1 an T4 = GPIO13
// IN2 an T5 = 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
// Gate an T4 = GPIO13
// Gate an T5 = GPIO12
//
// für 3V Solid State Relais
// GND an GND
// SSR1 Input + an T4 = GPIO13
// SSR2 Input + an T5 = GPIO12
//
// Getestet auf: ESP32 NodeMCU-32s
/******************************************************************
  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 Dual sollte als Tab eingebunden werden.
// #include <WebServer.h> muss im Haupttab aufgerufen werden
// Die Funktionalität des ESP32 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.
/**************************************************************************************/

#include <Preferences.h>

Preferences preferences;

const auto aktiv = LOW;                    // LOW für LOW aktive Relais oder HIGH für HIGH aktive (zB. SSR, Mosfet) einstellen
const uint8_t relPin[] = {T4, T5};         // Pin für Relais einstellen
const auto item = 10;
char switchTime[item * 2][6];
uint8_t switchActive[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
bool relState[] = {!aktiv, !aktiv};

void setupSchaltUhr() {
  preferences.begin("switchTime", false);
//  preferences.clear();   preferences.end();                  // einkommentieren um alle Daten zu löschen
  for (auto pin : relPin) digitalWrite(pin, !aktiv), pinMode(pin, OUTPUT);
  relState[0] = !aktiv;
  relState[1] = !aktiv;
  DEBUG((String)"Relais Aktiv Status: " + (relState[0] ? "LOW" : "HIGH"));
  char buffer[3];
  for (auto i = 0; i < item * 2; i++) {
    itoa (i, buffer, 10);
    preferences.getString(buffer, switchTime[i], sizeof(switchTime[i]));
  }
  preferences.getBytes("switchActive", switchActive, sizeof switchActive);
  server.on("/timer", HTTP_POST, []() {
    if (server.args() == 1) {
      switchActive[server.argName(0).toInt() / 2] = server.arg(0).toInt();
    }
    if (server.hasArg("sz0")) {
      for (auto i = 0; i < server.args(); i++) {
        strcpy (switchTime[i], server.arg(i).c_str());
      }
    }
    char buffer[3];
    for (auto i = 0; i < item * 2; i++) {
      itoa (i, buffer, 10);
      preferences.putString(buffer, switchTime[i]);
    }
    preferences.putBytes("switchActive", switchActive, sizeof switchActive);
    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] + "\"";
    }
    server.send(200, "application/json", temp + "]");
  });
  server.on("/timer", HTTP_GET, []() {
    static 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] ? aktiv : !aktiv) + "\",\"" + (relState[1] ? aktiv : !aktiv) + "\"]");
  });
}

void dualSchaltuhr() {
  static uint8_t oldmin = 60, oldState[] = {aktiv, aktiv};
  localTime();
  if (tm.tm_min != oldmin) {
    oldmin = 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) {
        if (switchActive[i / 2] && !strcmp(switchTime[i], buf)) i % 2 ? relState[0] = !aktiv : relState[0] = aktiv; // Relais1 nach Zeit schalten
      }
      else {
        if (switchActive[i / 2] && !strcmp(switchTime[i], buf)) i % 2 ? relState[1] = !aktiv : relState[1] = aktiv; // Relais2 nach Zeit schalten
      }
    }
  }
  if (relState[0] != oldState[0] || relState[1] != oldState[1]) {
    for (auto i = 0; i < 2; i++) {
      oldState[i] = relState[i];
      digitalWrite(relPin[i], relState[i]);
      DEBUG(digitalRead(relPin[i]) == aktiv ? (String)"Relais" + (1 + i) + " an" : (String)"Relais" + (1 + i) + " aus");
    }
  }
}

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

Zurück