Time Alarms Lib

Guten Abend,

ich bin gerade dabei mit Zeiten etwas rum zu experimentieren. Was ich schon geschafft habe ist mit der TimeLib.h die aktuelle Zeit aus dem Internet abzurufen und die aktuelle Zeit als Variable in die TimeAlarms.h Lib einzubauen.

Ich einem anderen Sketch habe ich es geschafft mit der TimeLib.h die Aktuelle Zeit aus dem Internet abzurufen und mit der Timezone.h die Zeit in die richtige Zeitzone zu bringen mit Sommer und Winterzeit.

So weit so gut. Jetzt fangen die Probleme an....

Ich schaffe es einfach nicht:

  • Die Zeit die ich mit der Timezone.h bekomme mit Variablen in die TimeAlarms.h zu bekommen.

habe es einfach so versucht:

setTime(h,m,s,mo,d,ye);

Da ich über die Variablen h m s mo d ye ja auch die korrekte Zeit mit Serial.print ausgeben kann, dachte ich es klappt auch mit der Übergabe in die TimeAlarms.h. Leider zeigt er mir dann eine Uhrzeit und ein Datum von 1970 an.

  • In der TimeAlarms.h schaffe ich es nicht (ohne Timezone.h läuft sie ja) Timer mit einer ID zu deaktivieren und wieder zu aktivieren. Würde das gerne über einen schalter realisieren. Stellung 1 Timer ist aktiv, Stellung 2 Timer ist inaktiv.
if(digitalRead(schalter) == LOW){
Alarm.disable(id2);
Alarm.delay(10);
}
else if(digitalRead(schalter) == HIGH) {
Alarm.enable(id2);
Alarm.delay(10);
}

Hab das ganze in der loop.

Kann mir da vielleicht einer Helfen der sich mit der TimeAlarms.h auskennt. Hab die ganze Doku schon 2 mal durchgearbeitet, ohne Erfolg. Was noch sehr komisch läuft, nach exakt 5 Minuten werden einmalig alle Timer ausgeführt. Warum???

#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <TimeAlarms.h>

AlarmId id2;

int schalter = D2;
int led = D6;

const char ssid[] = "-";  //  your network SSID (name)
const char pass[] = "-";       // your network password

// NTP Servers:
static const char ntpServerName[] = "de.pool.ntp.org";
int timeZone = 2;     // Central European Time1

WiFiUDP Udp;
unsigned int localPort = 8888;  // local port to listen for UDP packets

time_t getNtpTime();
void digitalClockDisplay();
void printDigits(int digits);
void sendNTPpacket(IPAddress &address);

void setup()
{

  pinMode(led, OUTPUT);
  pinMode(schalter, INPUT_PULLUP);

  
  Serial.begin(115200);
  while (!Serial) ; // Needed for Leonardo only
  delay(250);
  Serial.println("TimeNTP Example");
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.print("IP number assigned by DHCP is ");
  Serial.println(WiFi.localIP());
  Serial.println("Starting UDP");
  Udp.begin(localPort);
  Serial.print("Local port: ");
  Serial.println(Udp.localPort());
  Serial.println("waiting for sync");
  setSyncProvider(getNtpTime);
  setSyncInterval(300);


 setTime(hour(),minute(),second(),month(),day(),year()); 

  
  id2 = Alarm.timerRepeat(20, AnAus);   


}

time_t prevDisplay = 0; // when the digital clock was displayed

void loop()
{
  
  
  if (timeStatus() != timeNotSet) {
    if (now() != prevDisplay) { //update the display only if time has changed
      prevDisplay = now();
      digitalClockDisplay();
    }
  }


if(digitalRead(schalter) == LOW){
Alarm.disable(id2);
Alarm.delay(10);
}
else if(digitalRead(schalter) == HIGH) {
Alarm.enable(id2);
Alarm.delay(10);
}  

 Alarm.delay(10); 

  
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(".");
  Serial.print(month());
  Serial.print(".");
  Serial.print(year());
  Serial.println();
}

void printDigits(int digits)
{
  // utility for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

/*-------- NTP code ----------*/

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime()
{
  IPAddress ntpServerIP; // NTP server's ip address

  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  Serial.println("Transmit NTP Request");
  // get a random server from the pool
  WiFi.hostByName(ntpServerName, ntpServerIP);
  Serial.print(ntpServerName);
  Serial.print(": ");
  Serial.println(ntpServerIP);
  sendNTPpacket(ntpServerIP);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Serial.println("Receive NTP Response");
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}

// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}


void AnAus() {
  Serial.println("start intervall 20 Sek");
  if(digitalRead(led) == HIGH){
    digitalWrite(led, LOW);
    Serial.println("-------------------> LED aus!");
  }
  else {
    digitalWrite(led, HIGH);
    Serial.println("-------------------> LED an!");
  }
}

/
}

Mein Timer ist jetzt erst mal ein Intervall der alle 20 Sekunden eine LED ein und aus schaltet, dass habe ich nur gemacht da es etwas umständlich ist einen täglichen Timer auf 14 Uhr zu stellen und immer 24 Stunden zu waren ob mein Code funktioniert. Nur um eine LED alle 20 Sekunden ein und aus zu schalten bräuchte ich ja keine Bibliothek.

Vielen lieben Dank für jede Unterstützung und allen einen schönen Abend
Frank

frankwg:
Nur um eine LED alle 20 Sekunden ein und aus zu schalten bräuchte ich ja keine Bibliothek.

Das ist schön.

frankwg:
einen täglichen Timer auf 14 Uhr zu stellen

Warum machst du das dann nicht ohne Bibliothek?

TimeLib.h, Timezone.h kannst du beim Esp... weg lassen.

Im Esp Core ist die time.h enthalten!

Uhrzeit vom NTP Server holen und Sommer und Normalzeit einstellen macht der Esp auch ohne zusätsliche Library.
Lediglich Zeitzone und NTP Server ( configTime("CET-1CEST,M3.5.0/02,M10.5.0/03", "de.pool.ntp.org"); ) musst du ihm mitteilen.

Und dann ist es ein Klacks auf 14 Uhr abzufragen.

Gruß Fips

Guten Morgen Fips,

erst mal vielen dank für deine Antwort!

Ich will die Bibliothek TimeAlarms gerne verwenden weil ich beim Code schreiben noch nicht weiß wann hinterher ein Timer ausgelöst werden soll und auch nicht wie viel Timer ich brauche. Da haben mir die Funktionen "täglich", "alle x sekunden" und die ID mit der man einen Timer komplett deaktivieren kann sehr gut gefallen.

Deine Möglichkeit der Zeitabfrage kannte ich noch nicht. Verstehe sie aber auch leider nicht. Das Beispiel funktioniert zwar aber schaffe es nicht Stunden Minuten Sekunden und Datum in Variablen zu packen.

#include <ESP8266WiFi.h>
#include <time.h>

const char* ssid = "";
const char* password = "";
int timezone = 3;
int dst = 0;

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("\nConnecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  configTime(timezone * 3600, dst * 0, "pool.ntp.org", "time.nist.gov");
  Serial.println("\nWaiting for time");
  while (!time(nullptr)) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
}

void loop() {
  time_t now = time(nullptr);
  Serial.println(ctime(&now));
  delay(1000);
}

Uhrzeit und Datum wird über Serial.println(ctime(&now)); ausgegeben, aber wie geht es mit Stunden Minuten Sekunden?

Viele Grüße
Frank

frankwg:
Uhrzeit und Datum wird über Serial.println(ctime(&now)); ausgegeben, aber wie geht es mit Stunden Minuten Sekunden?

strftime

oder

struct tm

Als Funktion zum einbinden in bestehende Projekte.

Kompletter Sketch mit Abfrage ob die Zeit vom Server geholt werden konnte.

Gruß Fips