Kurz zur Erklärung:
Auf den Dachboden kommt eine Steuerzentrale welche per Funk Magnetventile für die Gartenbewässerung ansteuert.
Die Steuerzentrale (ESP 8266 nodeMCU) holt sich seine Zeit selber aus dem Internet über WiFi.
Die Startzeiten sende ich der Zentrale per WiFi vom PC od. Smartphone: http://192.168.100.54/18:00/00:15/4 an ESP Zeiten senden: Anfangszeit 18:00 / Dauer 00:15 / Wiederholung 4
Ziel ist es die 4 Magnetventile nacheinander zu schalten, weil alle zusammen die Pumpe nicht schafft.
Damit auch meine Familie die Bewässerung bedienen kann, schaltet die Zentrale einfach in einer Zeitspanne z.B. von 18-22°° die Sprenger nacheinander auf-zu.
Also z.B. 18°° Sprenger1 an, 18:15 Sprenger2 an...... 19°° Sprenger1 an... in der Zeit 18-22°° 4x jeder Sprenger für 15min an.
Meine Sippe braucht dann nur in dieser Zeitspanne die Pumpe einzuschalten (das schaffen die noch... )
Ich hoffe: Es kommt einigermaßen verständlich rüber was ich will?!
Nun möchte ich die Anfangszeit, Sprengdauer und Wiederholungen per:
http://192.168.100.54/17:00/00:05/8 an ESP Zeiten senden: Anfangszeit 17:00 / Dauer 00:05 / Wiederholung 8
durchaus ändern.
Das wird eine mächtige Verschachtelung mit "if then".
Gibt es Möglichkeiten dies besser zu gestalten?
Basis meines Codes ist der Sketch TimeAlarm. Ich bin noch voll beim "Anpassen"...
/*
* TimeAlarmExample.pde
*
* This example calls alarm functions at 8:30 am and at 5:45 pm (17:45)
* and simulates turning lights on at night and off in the morning
* A weekly timer is set for Saturdays at 8:30:30
*
* A timer is called every 15 seconds
* Another timer is called once only after 10 seconds
*
* At startup the time is set to Jan 1 2011 8:29 am
*
* http://192.168.100.54/18:00/00:15/4 an ESP Zeiten senden: Anfangszeit 18:00 / Dauer 00:15 / Wiederholung 4
*/
#include <Time.h>
#include <TimeAlarms.h>
#include <ESP8266WiFi.h>
const char* ssid = "SSID";
const char* password = "passwort";
int Ausgangsnummer = 2; //Ausgangspin für Impuls
bool triggered;
unsigned long previousMillis;
void setup()
{
initWifi();
//Serial.println(getTime().substring(17, 19)); //Stunden
//Serial.println(getTime().substring(20, 22)); //Minuten
int Stunde = (getTime().substring(17, 19)).toInt();
int Minute = (getTime().substring(20, 22)).toInt();
// prepare GPIO2
pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
// prepare GPIO0
pinMode(0, OUTPUT);
digitalWrite(0, HIGH);
Serial.begin(115200);
setTime(Stunde+1,Minute,45,1,1,11); // set time to Saturday 8:29:45am Jan 1 2011
}
//Programmschleife
void loop(){
// create the alarms
Alarm.alarmRepeat(20,19,0, MorningAlarm); // 8:30am every day (SytaxNachm: 17,45,0)
Alarm.alarmRepeat(8,30,30,EveningAlarm); // 8:30:30pm every day
Alarm.alarmOnce(8,30,35,EinmalAlarm); // 8:30:35pm einmalig
Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm); // 8:30:30 every Saturday
Alarm.timerRepeat(15, Repeats); // timer for every 15 seconds
Alarm.timerOnce(59, OnceOnly); // called once after 59 seconds
digitalClockDisplay();
Alarm.delay(1000); // wait one second between clock display
//Prozess um Tastenimpuls auszugeben - Aufruf mit trigger();
if (triggered && (millis() - previousMillis > 100))
{
digitalWrite(Ausgangsnummer, HIGH);
triggered = false;
}
}
// functions to be called when an alarm triggers:
void MorningAlarm(){
Serial.println("SprengerOst an");
trigger();
}
void EveningAlarm(){
Serial.println("SprengerOst aus");
Ausgangsnummer = 0;
trigger();
}
void EinmalAlarm(){
Serial.println("Einmal-Alarm");
Ausgangsnummer = 0;
trigger();
}
void WeeklyAlarm(){
Serial.println("Alarm: - its Monday Morning");
}
void ExplicitAlarm(){
Serial.println("Alarm: - this triggers only at the given date and time");
}
void Repeats(){
Serial.println("15 second timer");
}
void OnceOnly(){
Serial.println("This timer only triggers once");
}
void digitalClockDisplay()
{
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}
void printDigits(int digits)
{
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
void trigger()
{
digitalWrite(Ausgangsnummer, LOW);
triggered = true;
previousMillis = millis();
}
String getTime() {
WiFiClient client;
while (!!!client.connect("heizungsreparatur.de", 80)) {
Serial.println("connection failed, retrying...");
}
client.print("HEAD / HTTP/1.1\r\n\r\n");
while(!!!client.available()) {
yield();
}
while(client.available()){
if (client.read() == '\n') {
if (client.read() == 'D') {
if (client.read() == 'a') {
if (client.read() == 't') {
if (client.read() == 'e') {
if (client.read() == ':') {
client.read();
String theDate = client.readStringUntil('\r');
client.stop();
return theDate;
}
}
}
}
}
}
}
}
void initWifi() {
Serial.print("Connecting to ");
Serial.print(ssid);
if (strcmp (WiFi.SSID(),ssid) != 0) {
WiFi.begin(ssid, password);
}
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("\nWiFi connected, IP address: ");
Serial.println(WiFi.localIP());
}