Esp8266 Sonoff Dual mit Betriebsstundenzähler als Arduino Tab.
// ****************************************************************
// 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();
}