Denkfehler? IF falsch? Zeitsynchronisation

Ich habe ein recht langes Programm was alles mögliche macht und auch Sounds.
Jetzt will ich Ruhezeiten einprogrammieren und habe dafür ein Sync mit einem Timeserver eingebaut.

Wenn die Variable auf 0 steht kommt kein Sound. Steht sie auf 1 kommt Sound.

So weit so gut. Irgendwas scheint aber mit meinem Vergleich in der IF Abfrage nicht zu stimmen, denn wenn ich die Ruhezeiten (bei define) auf einen üblichen Wert stelle 22-7 Uhr zum Beispiel und wir haben gerade nach 13 funktioniert es gut und Ton kommt.
Stelle ich die Defines auf einen Wert der 13 Uhr (also jetzt) mit als Nacht einschließt, ist er auch still wie er soll.

Allerdings wenn ich die Ruhezeit so einstelle, dass sie bis oder ab 13 Uhr losgeht, scheint was falsch zu sein, denn wenn Ruhezeit zum Beispiel bis 13 Uhr eingestellt ist macht es trotzdem keinen Mucks.

Leider kann ich das nicht mit SerialPrint testen, da die Platine nicht am PC hängt und nur über WLAN verbunden ist.

Fällt irgendjemandem auf was ich falsch gemacht hab?

Ich hab schon gedacht das könnte mit Sommerzeit etc. zusammen hängen, aber das scheint richtig eingestellt zu sein soweit ich das überblicke.

#include <time.h>

// Variablen für Uhrzeit-Messung und Synchronisation
#define Ruhezeitvon 22
#define Ruhezeitbis 13
bool Ruhezeit = 0;    // Speicher - Ist gerade Ruhezeit?
time_t AktuelleZeit;  // Speicher für aktuelle Zeit
tm Zeit;              // Zeit ist Struktur für formatierte Zeit nach Umwandlung (tm_hour -> Stunde: 0 bis 23)




SETUP:
 // Zeitzone und Zeitserver einstellen
  configTzTime("CET-1CEST,M3.5.0,M10.5.0/3", "de.pool.ntp.org");  // Liste der Zeitzonen https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv


LOOP:
  // Zeit synchronisieren
  time(&AktuelleZeit);                // Zeit aus dem Netz lesen (passiert alle 3h ansonten wird vom internen Timer gelesen)
  localtime_r(&AktuelleZeit, &Zeit);  // localtime_r -> Zeit in die lokale Zeitzone setzen und in Zeit speichern
  // Zeit innerhalb der Ruhezeit? Dann Variable setzen
  if (Zeit.tm_hour >= Ruhezeitvon || Zeit.tm_hour <= Ruhezeitbis) {  // Ggf. Wenn Zeit + 10 Minuten (falls kurz vorher gelesen wird 10 Minuten Karenz) ausserhalf der Ruhezeiten dann Ruhezeit setzen sonst ausschalten
    Ruhezeit = 1;
  } else {
    Ruhezeit = 0;
  }

...

(Ich hab jetzt nur die relevanten Teile fü die Zeit hier zusamengefasst)

gib dir deine Zeiten (.tm_hour, Ruhezeitvon, Ruhezeitbis) auf der Seriellen Schnittstelle aus, dann kannst du kontrollieren was da wirklich drinnen steht und siehst deine Fehler.

Ansonsten - immer einen Vollständigen Code posten - den können dann andere in ihrer IDE hochladen und dir besser helfen.

Auch musst du schreiben auf welchem Microcontroller du programmierst.

Hihi:
13:59 Uhr ist auch 13
Du musst die bis-Zeit auf 12 stellen (oder das = raus bei der Endzeit)

Wenn du auf 22-13 testen willst hast du 2 Bereiche:

  • 22-24
  • 0-13

Also größer Start oder kleiner Ende.

Wenn du auf 13-22 testen willst musst du auf größer Start und kleiner Ende testen.

Und?

(wobei deine Aussage auch nicht stimmt, denn dann startet er eine Stunde zu spät)

Also mein Code ist für den ESP32.

Serial Print kann ich wie gesagt nicht testen, daher dachte ich mir ich frage mal ob einer in dem Part wo er sein muss nem Fehler sieht.

Auf die Idee dass 13:22 natürlich auch 13 ist bin ich nachher auch gekommen, daher das kleiner gleich.

Vielleicht mache ich auch tatsächlich nen Denkfehler, aber meiner Logik nach sollte es eigentlich so gehen.

Ich dachte halt mir kann jemand sagen, was ich vielleicht falsch denke,

Ansonsten muss ich nachher, wenn ich wieder zurück bin das mal auf einem Teatboard hochladen und mit SerialPrint analysieren.

Ich dachte nur ich mache sicher nen ganz simplen Denkfehler, den andere wohl sofort erkennen und mir sagen könnten.

Ea gin um Nachtruhe, daher soll logischerweise auch nachts die Variable auf 1 gestellt werden.

Also zwischen 22 und meinetwegen 7 Uhr.

Ich habs nur auf 13 Uhr gestellt um die Funktion zu testen.

Und meiner Logik nach muss es ODER nicht UND heißen, denn es kann ja nicht gleichzeitig 23 Uhr UND 04 Uhr sein.

Du könntest recht haben, ich hatte nämlich erst das mit großer gleich auf beiden Seitendes ODER anders und habs dann nochmal ungemodelt, weil ich dachte es genau falsch rum gemacht zu haben.

Werd es gleich wenn ich wieder zuhause bin nochmal durchdenken und testen.

Umd wenn du nun die Logik umdrehst:

Es ist nicht Nacht, wenn Stunde > Ruheende und Stunde <= Ruheanfang gilt.

Das geht natürlich nur, wenn du nicht erst um ein Uhr nachts deine Ruhe haben willst.

hier habe ich eine Funktion die auch über Mitternacht funktioniert:

der übergibst du die "Uhrzeit", Start-Zeit und Endzeit:

P.S.: wo auch immer du deinen ESP hast, entwickeln ohne Serial Output wäre mir zu mühsam. Bring deinen ESP zum PC damit du debuggen kannst.

Nur mal aus Neugierde: warum nicht ?
Du könntest auch testweise Infos auf das Display schreiben .

Ja, dann hab ich es wohl erst richtig gehabt und dann vermodelt weil ich falsch gedacht hab.

ich werds gleich mal umstellen. Mir war klar, dass das was ganz simples ist wo ich falsch gedacht hab vorhin als ich es "mal kurz" umprogrammieren wollte.

Mir wäre/ist es auch zu mühsam, geht aber nicht anders, weil ich es nicht mal kurz aus der Elektronik ausbauen will, das geht nämlich nicht "mal kurz", sondern ist riesiger Aufwand.

Wurde das nicht mit If machen nur mit Switch, Case

//void tag() {
  byte zeit = Zeit.tm_hour;
  switch (zeit)
  {
    case 0 ... 6:
      nacht = 1;
      Serial.println("Nacht ");
      break;

    case 7 ... 21:
      nacht = 0;
      Serial.println("Tag ");
      break;


    case 22 ... 24:
      nacht = 1;
      Serial.println("Nacht ");
      break;
  }
//}

Funktioniert sofort, zum testen anstatt Zeit.tm_hour; zufällige Zahlen eintragen

Dann einen anderen Tipp:
Einen zweiten Controller anschaffen und darauf die Entwicklung machen.
Wenn fertig, auf den eigentlichen übertragen.

Welches Display genau meinst Du? Nicht jede Schaltung mit ESP32 hat ein Display, meine zumindest nicht.

Und warum ich SerialPrint nicht nutzen kann hat nicht nur damit zu tun, dass es ein riesiger Aufwand wäre es auszubauen, sondern auch damit, dass man für SerialPrint ne freie serielle Schnittstelle braucht und mein Programm BEIDE seriellen Schnittstellen des ESP32 für andere Aufgaben braucht.
Das oben war ja nur ein kurzer Auszug aus meinem Programm, das nahezu den gesamten Speicher des ESP32 auslastet.

Mir war ja klar dass der Fehler ziemlich sicher im IF ist und ich nur zu blind bin es gerade zu sehen.

Ich habe auch noch Prozessoren in meiner Elektronikkiste liegen und habe es auch vorher am PC entwickelt, aber kleine Änderungen lade ich per WLAN hoch.
Hätte ich keine Lösung gefunden hätte ich jetzt auch an nem anderen Board angefangen den Ausschnitt zu testen um den Fehler zu finden.
Aber mir war klar, dass ich einfach nur zu blind bin den Wald vor lauter Bäumen nicht zu sehen und daher ist es deutlich besser kurz andere zu fragen, die es wohl gleich sehen, statt erst ne neue Schaltung zum Testen aufzubauen etc.

Ok, war mir nicht bewusst, dass da keins dran ist.
Aber auch das lässt sich lösen.
Ich habe bei fast allen Projekten dafür eine Schnittstelle parat, um immer bei Bedarf ein Oled anzustecken.
Da kann man schnell ein Debuggen durchführen.

Damit hab ich bisher nicht gearbeitet, erscheint mir zumindest vom Aufwand her deutlich aufwändiger als ein kurzes IF.
Bringt es spezielle Vorteile, die ich vielleicht nicht kenne/erkenne?

Hasi..... Ich habe auch irgendwo ein Display liegen, aber sämtliche seriellen Schnittstellen werden schon benutzt. Klar könnte ich jetzt vielleicht ne andere Schnittstelle wie I2C etc nutzen, wenn ich erstmal gucke wie ich das verbinde, dann die Bibliotheken einbinde etc. aber einfach mal Leute fragen die unbefangen sind und es daher sofort sehen schadet doch nicht, gab ja auch direkt Leute die meinen Denkfehler erkannt haben.

Wie gesagt ich ändere es gleich nach ner Pause mal und teste und ich gehe davon aus, dann hat sich das Problem erledigt, war vorhin wohl einfach zu stark im Stress, weil ich es vor der Runde mit dem Wolf "kurz" noch "schnell" programmieren wollte.