TimeAlarm mit "If then" verschachteln oder geht es besser?

combie:
[Seltsames Zeug]

Aha :slight_smile: Das mit dem „auf dem Teppich bleiben“ hast Du wohl falsch verstanden. Entschuldigung.

Gruß

Gregor

Ich gebe nicht auf und frage nochmal:

Wie berechne ich Zeit? z.B. 18:00 + 90min?

stoni99:
Ich gebe nicht auf und frage nochmal:
Wie berechne ich Zeit? z.B. 18:00 + 90min?

Indem Du beispielsweise addierst :stuck_out_tongue:

90 Minuten sind 1,5 Stunden. 18 Uhr plus 1,5 Stunden ergibt 19.30 Uhr (Komma fünf-drei-sechs, würde Jean-Luc sagen).

Wenn Du unterschiedliche „Einheiten“ rechnen möchtest, musst Du sie durch passende Umrechnungsfaktoren auf die gleiche „Einheit“ bringen. Bis Weihnachten sind es noch ungefähr 720 Stunden oder 43.200 Minuten oder knapp 2,6 Mio. Sekunden.

Gruß

Gregor

Das war jetzt wohl nicht die Antwort, die du hören wolltest.

Pseudocode:

                   Uhrzeit                      Zeitspanne    
uint32_t minuten = (Stunden x 60 + Minuten) + (Stunden x 60 + Minuten)
stundenneu = minuten/60
minutenneu = minuten - stundenneu*60

So in der Art hätte ich es gemacht, wobei ggf auf einen überlauf zu achten ist. Die Funktionen um aus einem char array die passenden Werte rauszuziehen, musst du dir noch raussuchen

Ahhh...clever...

Also erst mal auf Minutenbasis bringen um zu rechnen, dann wieder zurück auf Stunde...

Muß ich mal schauen wie ich das unterbringe:

Pseudocode

StartStunde=18
StartMinute=50
Dauer=15 //min
Durchläufe=4

for (int z=1; z<=Durchläufe; z++) {
alarmRepeat(StartStunde,StartMinute,0, ErsterSprenger);
alarmRepeat(Startzeit+Dauer,StartMinute,0, ZweiterSprenger);
alarmRepeat(Startzeit+(2Dauer),StartMinute,0, DritterSprenger);
alarmRepeat(Startzeit+(3
Dauer),StartMinute,0, VierterSprenger);
Startzeit=Startzeit+(Durchläufe*Dauer);
}

alarmRepeat(StartStunde,StartMinute,0, ErsterSprenger);

Sieht so aus, als bräuchte dein alarmRepeat sowas wie 18 und 30 als die ersten zwei Paramter, wenn er um 18:30 loslegen soll.

Viel wichtiger als Code ist eine ordentliche Variablendefinition, denn mir ist unklar, was Startzeit für eine Variable ist.

Wenn du nie bis nach Mitternacht beregnen willst, wäre Startzeit z.B. StartStunde*60+StartMinute,
also die Anzahl Minuten seit Mitternacht. Da addierst du in deiner Schleife den Abstand ( == Dauer ? ) drauf und wandelst das für den nächsten alarmRepeat wieder in Stunden und Minuten

Startzeit/60 sind die Stunden
Startzeit%60 ist der Rest, also die Minuten.

StartStunde und Startminute ist die Zeit die ich dem ESP per WiFi übergebe und damit die Einschaltzeit des ersten Sprengers. Da ich weiterhin dem ESP die Dauer & Durchläufe übergebe kann ich damit alle anderen Ein- und Ausschaltzeiten berechnen.

So der Plan... ;D

Bräuchte einen Gedanken-Anschubser:

Wie übergebe ich den Stunden-"Überlauf" an StartStunde wenn die StartMinuten+Dauer z.B.65 beträgt (50+15)?

Achtung - gefährlicher Anfänger-Pseudocode: ;D

StartStunde=18
StartMinute=50
Dauer=15 //min
Durchläufe=4

for (int z=1; z<=Durchläufe; z++) {
alarmRepeat(StartStunde,StartMinute,0, ErsterSprenger);
alarmRepeat(((StartStunde60)+Dauer)/60,(StartMinute+Dauer),0, ZweiterSprenger);
alarmRepeat(StartStunde+(2
Dauer),StartMinute,0, DritterSprenger);
alarmRepeat(StartStunde+(3Dauer),StartMinute,0, VierterSprenger);
StartStunde=StartStunde+(Durchläufe
Dauer);
}

Eventueller Lösungsansatz:

Da ich mit Integerwerten rechne sind:

65/60=1 die 1 kann ich also zu StartStunde addieren

wären es Beispielsweise statt 65min nur 50min:

50/60=0 also StartStunde bleibt

Könnte doch klappen..... 8)

Indem Du beispielsweise addierst :stuck_out_tongue:

90 Minuten sind 1,5 Stunden. 18 Uhr plus 1,5 Stunden ergibt 19.30 Uhr (Komma fünf-drei-sechs, würde Jean-Luc sagen).

Wenn Du unterschiedliche „Einheiten" rechnen möchtest, musst Du sie durch passende Umrechnungsfaktoren auf die gleiche „Einheit" bringen. Bis Weihnachten sind es noch ungefähr 720 Stunden oder 43.200 Minuten oder knapp 2,6 Mio. Sekunden.

Gruß

Gregor

DAS nenne ich Klugscheißerei!

Gruß eMeS

eMeS:
DAS nenne ich Klugscheißerei!

[ ] Du weißt, was Ironie ist

Gruß

Gregor

Die Stunden-Überhang-Berechnung funktioniert so gut.

Weiß aber noch nicht so recht wie ich die StartMinuten mit & ohne Überhang berechnen soll...

Bei StartMinuten 50 und Dauer 15 sind ((StartMinute+Dauer)-60)=5min (passt)
Stimmt dann aber nicht mehr bei StartMinuten 30

Hab grad Denkblockade, kann mich bitte jemand anschubsen...

void setup() {
// put your setup code here, to run once:

int Zahl1 = 65;
int Zahl2 = 60;
int Zahl3 = 50;

int StartStunde = 18;
int StartMinute = 50;
int Dauer = 15;

Serial.begin(9600);

Serial.print("65/60=");
Serial.println(Zahl1/Zahl2);
Serial.println();
Serial.print("50/60=");
Serial.println(Zahl3/Zahl2);
Serial.println();

Serial.println("Berechnung Startzeit Sprenger2=");
Serial.println(StartMinute+Dauer);
Serial.println((StartMinute+Dauer)/60);
Serial.println((StartStunde)+((StartMinute+Dauer)/60));
Serial.println((StartMinute+Dauer)-60);

}

void loop() {
// put your main code here, to run repeatedly:

}

Ahhhh, so geht das:

Serial.println((StartMinute+Dauer)%60);

Ich weiß zwar nicht genau was da mit dem % passiert aber es funktioniert. :grin:
Bei 65%60 kommt 5 raus, bei 45%60 =45!

Perfekt.

Danke für den Tip michael_x!!!!!

Passieren tut im Prinzip das, nur eleganter und am Anfang etwas unverständlicher:

stundenneu = minuten/60
minutenneu = minuten - stundenneu*60

Eventueller Lösungsansatz:

Da ich mit Integerwerten rechne sind:

65/60=1 die 1 kann ich also zu StartStunde addieren

wären es Beispielsweise statt 65min nur 50min:

50/60=0 also StartStunde bleibt

Die Problematik mit Überhang ( 65 Minuten = 1:05 ) kommt daher, dass du zu kompliziert denkst. :wink:

Am einfachsten rechnest du erstmal die gelieferte StartStunde und StartMinute in Minuten ( Startzeit ) um, addierst da jeweils deine Dauer drauf, und holst dir aus dieser einen Zahl dann die zwei Parameter für alarmRepeat raus.

Mit dem "kompliziert" hast du wohl recht. :grin:
Evtl. werde ich den Code nochmal anpassen.

Aber erst mal funktioniert er!
Für alle die auch mal sowas programmieren wollen hier mein Beispiel-Test-Sketch:

void setup() {
  // put your setup code here, to run once:

int Zahl1 = 65;
int Zahl2 = 60;
int Zahl3 = 50;

int StartStunde = 18;
int StartMinute = 50;
int Dauer = 15;
int Umlauf = 4;

Serial.begin(9600);

Serial.print("65/60=");
Serial.println(Zahl1/Zahl2);
Serial.println();
Serial.print("50/60=");
Serial.println(Zahl3/Zahl2);
Serial.println();

Serial.println("Zeitvorgaben:");
Serial.print("Startzeit:");
Serial.print(StartStunde);
Serial.print(":");
Serial.print(StartMinute);
Serial.print("/Dauer:");
Serial.print(Dauer);
Serial.print("/Umlauf:");
Serial.print(Umlauf);
Serial.println();
Serial.println();

Serial.print("Berechnung Startzeit Sprenger1= ");
Serial.print(StartStunde);
Serial.print(":");
Serial.println(StartMinute);

Serial.print("Berechnung Startzeit Sprenger2= ");
Serial.print((StartStunde)+((StartMinute+Dauer)/60));
Serial.print(":");
Serial.println((StartMinute+Dauer)%60);

Serial.print("Berechnung Startzeit Sprenger3= ");
Serial.print((StartStunde)+((StartMinute+(2*Dauer))/60));
Serial.print(":");
Serial.println((StartMinute+(2*Dauer))%60);

Serial.print("Berechnung Startzeit Sprenger4= ");
Serial.print((StartStunde)+((StartMinute+(3*Dauer))/60));
Serial.print(":");
Serial.println((StartMinute+(3*Dauer))%60);

}

void loop() {
  // put your main code here, to run repeatedly:

}

Das Ganze muß ich jetzt noch in einer Schleife für die Anzahl der Umläufe verpacken.
Das werd ich doch schaffen... :slight_smile:

[ironie]Mach aber kein delay in die Schleife, sonst wird es eine böse Schleife[/ironie] :grin:

Stoni auf dem Weg zum Super-Programmierer... :grin:

So`ne Schei..., jetzt klappt das auch noch! ;D

Und das ganz ohne delay. Also: Liebe Schleife. (denke ich jedenfalls...)

void setup() {
  // put your setup code here, to run once:


int StartStunde = 18;
int StartMinute = 55;
int Dauer = 10;
int Umlauf = 6;

Serial.begin(9600);


Serial.println("Zeitvorgaben:");
Serial.print("Startzeit:");
Serial.print(StartStunde);
Serial.print(":");
Serial.print(StartMinute);
Serial.print("/Dauer:");
Serial.print(Dauer);
Serial.print("/Umlauf:");
Serial.print(Umlauf);
Serial.println();
Serial.println();





Serial.println();
  int x=0;
  for (int z=0; z<Umlauf; z++) {
    Serial.println();
    for (int i=1; i<=4; i++) {
      Serial.print("Berechnung Startzeit Sprenger");
      Serial.print(i);
      Serial.print(" Einschaltzeit= ");
      Serial.print((StartStunde)+((StartMinute+((x)*Dauer))/60));
      Serial.print(":");
      Serial.println((StartMinute+((x)*Dauer))%60);
      x++;
    }
  }


}

void loop() {
  // put your main code here, to run repeatedly:

}

Wenn du jetzt noch die Zeitausgaben korrekt formattierst, bist du wieder einen Schritt weiter.

Hat zwar nichts mit der Funktion zu tun, sieht aber schöner aus

Stoni auf dem Weg zum Super-Programmierer

Na dann Glückwunsch soweit!

Was kommt nun als erstes: Regner schalten oder Startparameter-Zeiten auswerten ohne den Arduino jedesmal neu programmieren zu müssen?

Und wie kriegt dein Sketch mit, wann es in echt 18:50 in Mitteleuropa ist?

Viel Erfolg weiterhin!