Loop ab bestimmter uhrzeit ausführen

hey,
ich scheibe momentan ein Programm mit dem ESP32 welches als Türalarmanlage funktioniert jetzt wollte ich dass der Loop erst dann ausgeführt wird wenn es zwischen 23 uhr und 6 uhr ist.
hat jemand eine idee wie das funktioniert oder kann mit tipps geben?
liebe Grüße Treecher

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Du möchtest eine Funktion ausführen.

if (hour > 22 || hour < 6)
doFunction()
1 Like

Wenn Ihr ESP32 Zugang zum Internet hat, können Sie die Uhrzeit über NTP abrufen und sie anschließend verwenden, um zu entscheiden, ob der Alarm aktiviert werden soll oder nicht.

1 Like

hey erstmal danke für die schnelle antwort
muss ich dann noch was runterladen damit der ESP 32 die Zeit abfragen kann und weiß wie viel uhr es ist?

Wie @J-M-L schon schrieb: Hat der Zugang zum Internet?
Dann kann man die Zeit dauerhaft aus dem Internet beziehen.
Wenn nicht, kannst Du mit einer DS3231 eine lokale genaue Uhr betreiben.

1 Like

danke schonmal der ESP hat dauerhaft zugang zum internet,
mein code sieht bis jetzt so aus und ich frage mich wie ich jetzt am besten die zeit abfrage einbaue
vielleicht können sie mir da kurz auf die sprünge helfen

void loop(){
  buttonState = digitalRead(5);
    if (buttonState != LOW)
   {
      digitalWrite(LED,HIGH);
      bot.sendMessage(Chat, "Hier spricht dein ESP32. Die Tür wurde aufgemacht!");
      delay(20000);

    }
      else{
        digitalWrite(LED,LOW);
      }
  
}

Datei->Beispiele->ESP8266Wifi->NTPClient
Da hast Du schon mal ein Beispiel zur Zeitabfrage
Wenn das läuft gehts weiter bei #3

2 Likes

bei mir gibt es das Beispiel leider nicht ich habe es jetzt mit

if ( hour > 22 || hour < 6) 

programmiert dennoch gibt er mir da auch eine fehlermeldung aus weil ich hour nicht definieren kann habt ihr noch eine idee wie der code funktionieren könnte ?

hier nochmal der loop der nur von 23 uhr bis 6 uhr ausgeführt werden soll

void loop(){
  buttonState = digitalRead(5);
    if (buttonState != LOW)
   {
      digitalWrite(LED,HIGH);
      bot.sendMessage(Chat, "Hier spricht dein ESP32. Die Tür wurde aufgemacht!");
      delay(20000);

    }
      else{
        digitalWrite(LED,LOW);
      }
}

Wie sieht Dein sketch aus, wo fragst Du die Uhrzeit ab?

Hast Du den ESP32 Core installiert?
Dann sollten die Beispiele da sein

Ein Code wie dieser wird jede Sekunde die Uhrzeit ausdrucken

#include <WiFi.h>

void aktualisiereZeit() {
  const uint32_t ntpIntervall =  1000; // 1s
  static uint32_t ntpChrono = -ntpIntervall;

  if (millis() - ntpChrono >= ntpIntervall) {
    ntpChrono = millis();

    time_t zeitstempel = time( NULL );
    struct tm *pZeit = localtime(&zeitstempel );

    if (pZeit->tm_year > 70) {
      Serial.print("NTP Zeit : ");
      Serial.print(pZeit->tm_mday);
      Serial.print('/');
      Serial.print(pZeit->tm_mon + 1);
      Serial.print('/');
      Serial.print(pZeit->tm_year + 1900);
      Serial.print(" ");
      Serial.print(pZeit->tm_hour);
      Serial.print(':');
      Serial.print(pZeit->tm_min);
      Serial.print(':');
      Serial.println(pZeit->tm_sec);
    }
  }
}

void setup() {
  Serial.begin(115200);

  WiFi.begin("Wokwi-GUEST", "", 6); // Wokwi simulation
  Serial.println("Verbinde mit WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.write('.');
    delay(500);
  }
  Serial.println("\nMit WiFi verbunden");

  // Zeitzoneinformation für Mitteleuropäische Zeit (CET)
  // mit Sommerzeit (CEST) Anpassungen
  configTzTime("CET-1CEST,M3.5.0/02:00:00,M10.5.0/03:00:00", "pool.ntp.org");
}

void loop() {
  aktualisiereZeit();
}

1 Like

Schau die die Beispiele bei Fips an.
@noiasca auf seiner Seite hat auch was über Zeit Server NTP.

2 Likes

Die Uhrzeit habe ich nicht abgefragt. Da bin ich ratlos wie ich das umsetzen soll.
Wie würde ich das denn machen?
Den ESP32 Core habe ich noch nicht installiert, das werde ich jetzt versuchen.
Vielen Dank

erst brauchst du mal den ESP32 Core.
Den installierst und probierst mal eine LED zum Blinken zu bekommen um sicherzustellen, dass das hochladen klappt.

Die Zeitabfrage mit NTP ist Teil des ESP32 Core. Es sind nur ein paar Zeilen.
Hier eine kurze Variante auf meiner Homepage:

https://werner.rothschopf.net/microcontroller/202103_arduino_esp32_ntp_en.htm

Ist das eine Bibliothek oder wo istaliere ich das, ich finde das leider nicht.

Das hochladen klappt. Ich habe schon das fertige Programm, welches auch funktioniert.
Mir wird vom ESP32 eine nachricht geschickt, sobald meine Tür geöffnet wird.
Nun will ich noch zusätzlich einbauen, dass dies nur passiert wenn die Tür zwischen 32 Uhr abends und 6 Uhr morgens geöffnet wird.

void loop(){
  buttonState = digitalRead(5);
    if (buttonState != LOW)
   {
      digitalWrite(LED,HIGH);
      bot.sendMessage(Chat, "Hier spricht dein ESP32. Die Tür wurde aufgemacht!");
      delay(20000);

    }
      else{
        digitalWrite(LED,LOW);
      }

Das ist der Teil meines Programms, welcher nur zwischen 23 und 6 Uhr ausgeführt werden soll.

Ich schaue mir mal deine Homepage an.

Vielen Dank für die Hilfe

Hallo @treecher
und hertzlich willkommen im Arduino-Forum.

zuerst einmal: Es ist vollkommen in Ordnung als Anfänger all das zu fragen was man an Fragen hat.

Aus deinen Antworten und Fragen kann man schlussfolgern, dass du Anfänger bist.

Wenn du dein Programm auf den ESP32 hochladen kannst dann
muss absolut zwangläufig der ESP32-core installiert sein . Sonst würde das hochladen nämlich gar nicht erst funktionieren.

Wie ist die exakte Typenbezeichnung deines Microcontrollers?

Etwas Haarspalterei, aber manchmal ist es wichtig die Sachen genau zu verstehen.

Meine offizielle Antwort: Das ist nicht möglich.

Die loop Funktion ist die Funktion die dauernd in einer Schleife ausgeführt wird und praktisch das Hauptprogramm ist. Das muß weiterhin ausgeführt werden.

Du kannst im loop() die Zeit herholen, kontrollieren ob Du im gewollten Zeitfenster bist und dann eine gewissen Sketchteil bzw Funktion ausführen.

Die Zeit kann über verschiedene Quellen bezogen werden:
Wenn der ESP im Wlan hängt dann über NTP oder bestimmte Rooter können die Zeit geben.
Verschiedene Hardware haben eine Zeit:
Ein RTC Modul, am genauesten DS3231
GPS Empfänger
DCF77 Funkuhrmodul am besten in Zusammenhang mit einer RTC
RDS in analogen UKW Sendern ( ist aber nicht zukunftsicher).

Grüße Uwe

Gucke:
https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/installing.html

Dann musst Du Dir um den ESP32 Core keine Sorgen mehr machen - Du hast ihn schon. Anderenfalls könntest Du gar nicht kompilieren und erfolgreich hochladen.

// Forensketch
// https://forum.arduino.cc/


#include <WiFi.h>

constexpr byte inputPin {5};
constexpr byte LED {6};
constexpr byte startHour {23};
constexpr byte endHour {6};
byte actualHour;

void setup()
{
  Serial.begin(115200);
  WiFi.begin("Wokwi-GUEST", "", 6); // Wokwi simulation
  Serial.println("Verbinde mit WiFi...");
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.write('.');
    delay(500);
  }
  Serial.println("\nMit WiFi verbunden");
  // Zeitzoneinformation für Mitteleuropäische Zeit (CET)
  // mit Sommerzeit (CEST) Anpassungen
  configTzTime("CET-1CEST,M3.5.0/02:00:00,M10.5.0/03:00:00", "pool.ntp.org");
  pinMode(inputPin, INPUT);
}

void  loop()

{
  aktualisiereZeit();
  if (actualHour >= startHour ||
      actualHour <= endHour)
  { checkPin(); }
}


void aktualisiereZeit()
{
  const uint32_t ntpIntervall =  1000; // 1s
  static uint32_t ntpChrono = -ntpIntervall;
  if (millis() - ntpChrono >= ntpIntervall)
  {
    ntpChrono = millis();
    time_t zeitstempel = time( NULL );
    struct tm *pZeit = localtime(&zeitstempel );
    if (pZeit->tm_year > 70)
    {
      Serial.print("NTP Zeit : ");
      Serial.print(pZeit->tm_mday);
      Serial.print('/');
      Serial.print(pZeit->tm_mon + 1);
      Serial.print('/');
      Serial.print(pZeit->tm_year + 1900);
      Serial.print(" ");
      Serial.print(pZeit->tm_hour);
      Serial.print(':');
      Serial.print(pZeit->tm_min);
      Serial.print(':');
      Serial.println(pZeit->tm_sec);
      actualHour = pZeit->tm_hour;
    }
  }
}


void checkPin()
{
  if (digitalRead(inputPin))
  {
    if (!digitalRead(LED))
    {
      digitalWrite(LED, HIGH);
      bot.sendMessage(Chat, "Hier spricht dein ESP32. Die Tür wurde aufgemacht!");
    }
  }
  else
  {
    digitalWrite(LED, LOW);
  }
}

Weil heut der Letzte Tag im Jahr ist