2018-06-24

Esp8266 Sonoff Dual mit Betriebsstundenzähler als Arduino Tab.

Achtung dieser Sketch funktioniert ausschlieslich mit dem Sonoff Dual.

SonoffDual.ino

// ****************************************************************
// Sketch Esp8266 Sonoff Dual Modular(Tab)
// created: Jens Fleischer, 2018-06-15
// last mod: Jens Fleischer, 2018-06-24
// For more information visit: https://fipsok.de
// ****************************************************************
// Hardware: Sonoff Dual
// Getestet auf: Sonoff Dual
/******************************************************************
  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 sonoffDuo sollte als Tab eingebunden werden.
// #include <ESP8266WebServer.h> muss im Haupttab aufgerufen werden
// Die Funktionalität des ESP8266 Webservers ist erforderlich.
// Die Funktion "sonoffDuo();" muss im Setup aufgerufen werden.
// Die Funktion "betrieb();" muss im loop() aufgerufen werden
/**************************************************************************************/

uint32_t minuten[2], minold[2];
bool relState1 = LOW, relState2 = LOW;

void sonoffDuo() {
  Serial.begin(19200);                      // Sonoff Dual braucht diese Baudrate für die Relais
  File betrieb = SPIFFS.open("/betrieb.txt", "r");
  for (int i = 0; i <= 1; i++) {                            // Betriebsstunden beim Starten lesen
    String str = betrieb.readStringUntil('\n');
    minuten[i] = str.toInt();
    minold[i] = minuten[i];
  }
  server.on("/start", []() {
    senden();
  });
  server.on("/led1", []() {
    relState1 = !relState1;
    schalter1();
    senden();
  });
  server.on("/led2", []() {
    relState2 = !relState2;
    schalter2();
    senden();
  });
  ArduinoOTA.onStart([]() {
    druck();
    Serial.write(0xA0);
    Serial.write(0x04);
    Serial.write(0x00);             // beide Relais ausschalten
    Serial.write(0xA1);
    Serial.write("\n");
    Serial.flush();
  });
}

void betrieb() {
  static uint32_t previousMillis, previousMillis1;
  uint32_t currentMillis = millis();
  if (currentMillis - previousMillis >= 60000) {
    previousMillis = currentMillis;
    if (relState1) minuten[0]++;                     // Betriebstundenzähler Led 1 wird um eine Minute erhöht
    if (relState2) minuten[1]++;                     // Betriebstundenzähler Led 2 wird um eine Minute erhöht
  }
  if (currentMillis - previousMillis1 >= 48 * 60 * 60 * 1000UL && (minuten[0] != minold[0] || minuten[1] != minold[1])) {       // aller 2 Tage Betriebsstunden in Datei schreiben
    previousMillis1 = currentMillis;
    minold[0] = minuten[0];
    minold[1] = minuten[1];
    druck();
  }
}

void senden() {
  server.send(200, "application/json", "[\"" + Betriebstunden(minuten[0]) + "\",\"" + Betriebstunden(minuten[1]) + "\",\"" + relState1 + "\",\"" + relState2 + "\"]");
}

String Betriebstunden(uint32_t &zeit) {
  char buf[9];
  snprintf(buf, sizeof(buf), "%06ld,%d", zeit / 60, zeit / 6 % 10);
  return buf;
}

void druck() {
  File f = SPIFFS.open("/betrieb.txt", "w");                    // Betriebstunden(minuten) speichern
  f.printf("%ld\n%ld\n", minuten[0], minuten[1]);
}

void schalter1() {
  Serial.write(0xA0);
  Serial.write(0x04);
  if (relState1) {
    relState2 ? Serial.write(0x03) : Serial.write(0x01);
  }
  else {
    relState2 ? Serial.write(0x06) : Serial.write(0x00);
  }
  Serial.write(0xA1);
  Serial.write("\n");
  Serial.flush();
}

void schalter2() {
  Serial.write(0xA0);
  Serial.write(0x04);
  if (relState2) {
    relState1 ? Serial.write(0x03) : Serial.write(0x02);
  }
  else {
    relState1 ? Serial.write(0x05) : Serial.write(0x00);
  }
  Serial.write(0xA1);
  Serial.write("\n");
  Serial.flush();
}
  

Zurück