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