INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
NTP- tägliche Aktion
18.12.2018, 09:13
Beitrag #17
RE: NTP- tägliche Aktion
Hallo,

(18.12.2018 08:50)Fips schrieb:  Du hast doch die 2.4.2 drauf, da ist alles schon mit drin was du brauchst.
time.h
Die verwende ich auch in der Zeitschaltuhr.
Kannst du dir auch einzeln anschauen.

passt jetzt nur bedingt hier rein, Du hast in Deinem * Zeitstempel Seriell * eine Abfrage mit millis(), warum nicht die time direkt?

Code:
void loop()
{
  static int old_sec = 60;
  time_t now = time(nullptr);
  struct tm * timeinfo;
  timeinfo = localtime(&now);  
  if (timeinfo->tm_sec != old_sec)
  {
    old_sec = timeinfo->tm_sec;
    ShowTime();      
  }
}

Seine Abfrage könnte z.B. so aussehen:

Code:
void loop()
{
  static bool status = false; // ist aus
  
  time_t now = time(nullptr);
  struct tm * timeinfo;
  timeinfo = localtime(&now);  
  
  if (statis ==  false)
  {
    if (timeinfo->tm_hour == 22) and   (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 0)
    {
      status == true; // ein
      // hier einschalten      
    }
  }
  else
  {
    if (timeinfo->tm_hour == 22) and   (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 20)
    {
      status == false; // aus
      // hier ausschalten      
    }
  }
}

Er könnte seine Schaltzeit natürlich auch als Unix-Timestamp hinterlegen, dann wird der Vergleich kürzer.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2018, 09:30
Beitrag #18
RE: NTP- tägliche Aktion
(18.12.2018 09:13)amithlon schrieb:  passt jetzt nur bedingt hier rein, Du hast in Deinem * Zeitstempel Seriell * eine Abfrage mit millis(), warum nicht die time direkt?

Was du meinst, ist sicher nur das Beispiel wie mann den Zeitstempel als Funktion verwenden kann.
Das muss man ja nicht verwenden.
Es steht ja trozdem alles in der "struct tm tm;" zur Verfügung, oder auch mittels "strftime (Uhrzeit, sizeof(Uhrzeit), "%T", &tm);"
http://www.cplusplus.com/reference/ctime/strftime/


Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2018, 18:49
Beitrag #19
RE: NTP- tägliche Aktion
(18.12.2018 09:13)amithlon schrieb:  Seine Abfrage könnte z.B. so aussehen:

Code:
void loop()
{
  static bool status = false; // ist aus
  
  time_t now = time(nullptr);
  struct tm * timeinfo;
  timeinfo = localtime(&now);  
  
  if (statis ==  false)
  {
    if (timeinfo->tm_hour == 22) and   (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 0)
    {
      status == true; // ein
      // hier einschalten      
    }
  }
  else
  {
    if (timeinfo->tm_hour == 22) and   (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 20)
    {
      status == false; // aus
      // hier ausschalten      
    }
  }
}

Er könnte seine Schaltzeit natürlich auch als Unix-Timestamp hinterlegen, dann wird der Vergleich kürzer.

Gruß aus Berlin
Michael

Hallo,

Klappt nicht so wie du das vorgeschlagen hast.
Code:
imev3:46:38: error: expected identifier before '(' token
     if (timeinfo->tm_hour == 22) and (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 0)
                                      ^
timev3:46:38: error: expected ';' before '(' token
timev3:54:38: error: expected identifier before '(' token
     if (timeinfo->tm_hour == 22) and (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 20)
                                      ^
timev3:54:38: error: expected ';' before '(' token
exit status 1
expected identifier before '(' token

Mein Code:
Code:
#include "time.h"
#include <ESP8266WiFi.h>

char *ssid      = "XXXXXXXXXXXXXXX";              
char *password  = "XXXXXXXXXXXXXXX";
int pinRelais = D1;

struct tm tm;
const char* const PROGMEM ntpServer[] = {"fritz.box", "de.pool.ntp.org", "at.pool.ntp.org", "ch.pool.ntp.org", "ptbtime1.ptb.de", "europe.pool.ntp.org"};

void setup(){
  Serial.begin(115200);
  Serial.println();
  Serial.println("Booted");
  Serial.println("Connecting to Wi-Fi");

  WiFi.mode(WIFI_STA);
  WiFi.begin (ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("WiFi connected");
  setupTime();
  pinMode(pinRelais, OUTPUT);
}
void setupTime() {
  configTime(0, 0, ntpServer[0]);                      
  setenv("TZ", "CET-1CEST,M3.5.0/02,M10.5.0/03", 1);
  delay(300);
}

void loop()
{
  static bool status = false; // ist aus
  
  time_t now = time(nullptr);
  struct tm * timeinfo;
  timeinfo = localtime(&now);
  Serial.println("Stunde: " + timeinfo->tm_hour);
  Serial.println("Minuten: " + timeinfo->tm_min);
  Serial.println("Sekunden: " + timeinfo->tm_sec);
  
  if (status ==  false)
  {
    if (timeinfo->tm_hour == 22) and (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 0)
    {
      status == true; // ein
      DigitalWrite(pinRelais, HIGH);
    }
  }
  else
  {
    if (timeinfo->tm_hour == 22) and (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 20)
    {
      status == false; // aus
       DigitalWrite(pinRelais, LOW);    
    }
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2018, 19:04
Beitrag #20
RE: NTP- tägliche Aktion
Da fehlt jeweils ein Klammerpaar außen rum:
Code:
if ((timeinfo->tm_hour == 22) and   (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 0))
// ...
if ((timeinfo->tm_hour == 22) and   (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 20))

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2018, 19:07 (Dieser Beitrag wurde zuletzt bearbeitet: 18.12.2018 19:07 von amithlon.)
Beitrag #21
RE: NTP- tägliche Aktion
Hallo,

kommt davon, wenn man das mal schnell hintippt...
if ((timeinfo->tm_hour == 22) and (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 0))

Der ganz Ausdruck muß natürlich für if in Klammern stehen, hinter else natütlich auch.
if ((timeinfo->tm_hour == 22) and (timeinfo->tm_min == 22) and (timeinfo->tm_sec == 20))

Man kann den Klammersalat natürlich auch aufräumen oder && statt and nehmen.
if (timeinfo->tm_hour == 22 && timeinfo->tm_min == 22 && timeinfo->tm_sec == 0)
sollte es auch richtig erledigen, ist mehr die Frage, was man lesbarer findet.

PS: war ja fast klar, Tommy56 war wieder schneller...
Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2018, 19:08 (Dieser Beitrag wurde zuletzt bearbeitet: 18.12.2018 22:23 von maxm18.)
Beitrag #22
RE: NTP- tägliche Aktion
Mist, hätte mir auch auffallen sollen.
Danke euch beiden!

Fehler meinerseits auch vorhanden: digitalWrite in der Eile mit großem D geschrieben.

Jedoch spamt er jetzt willkürlich in die Konsole, auch ein 1000er Delay hat hier nicht geholfen.

Ausschnitt:
Code:
nde:
kunden:

...

Nein, das hab ich nicht ausversehen abgeschnitten sondern es handelt sich hierbei um die Ausgabe.

(18.12.2018 19:08)maxm18 schrieb:  Mist, hätte mir auch auffallen sollen.
Danke euch beiden!

Fehler meinerseits auch vorhanden: digitalWrite in der Eile mit großem D geschrieben.

Jedoch spamt er jetzt willkürlich in die Konsole, auch ein 1000er Delay hat hier nicht geholfen.

Ausschnitt:
Code:
nde:
kunden:


nde:
kunden:


nde:
kunden:


nde:
kunden:

nde:
kunden:
nan
nde:
kunden:
an
nde:
kunden:
n
nde:
kunden:

nde:
kunden:
inf
nde:
kunden:
nf
nde:
kunden:
f
nde:
kunden:

nde:
unden:
Sekunden:
nde:
unden:
ekunden:
nde:
unden:
kunden:
nde:
unden:
unden:

Nein, das hab ich nicht ausersehen abgeschnitten sondern es handelt sich hierbei um die Ausgabe.

Aktuell:
Code:
:
:
Sekunden:
:
:
ekunden:
:
:
kunden:
:
:
unden:
:
:
nden:
:
:
den:
:
:
en:
:

Teilweise war auch der WLAN Name bzw. das Passwort so abgehackt dazwischen.
Meinen Code habe ich ja bereits oben gepostet, inzwischen nur noch mit einem delay von 1000ms (1s) nach der if/else Abfrage getestet.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2018, 22:35 (Dieser Beitrag wurde zuletzt bearbeitet: 18.12.2018 22:37 von amithlon.)
Beitrag #23
RE: NTP- tägliche Aktion
Hallo,

dann mach es doch einfach ordentlich:
Code:
void loop()
{
  static bool status = false; // ist aus
  static byte sec_old = 60;
...
  if ( timeinfo->tm_sec != sec_old)    // nur alle Sekunde ausgeben
  {
    sec_old = timeinfo->tm_sec;
    Serial.println("Stunde: " + timeinfo->tm_hour);
    Serial.println("Minuten: " + timeinfo->tm_min);
    Serial.println("Sekunden: " + timeinfo->tm_sec);
  }

  if (status ==  false)
  {
...

Es gibt hier keinen Grund für irgendein delay()

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2018, 22:46
Beitrag #24
RE: NTP- tägliche Aktion
Irgendwie ist das nach meiner Ansicht ursprüngliche Problem aus dem Focus gedriftet.

Wir haben ja 2 Möglichkeiten der Steuerung für den täglichen Schaltvorgang:

1. Stunden + Minuten + Statusvariable (da die Abarbeitung sicher < 1 Minute ist)
2. UNIX-Time - nach Abarbeitung neueZeit = abarbeitungszeit +24 * 3600 auch hier evtl. Statusvariable benutzen.

delay ist (wie schon Amitlon schrieb) bei solchen Sachen immer falsch.

Da muss man sich mal für eine Richtung entscheiden.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste