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
Zeit-Server-Problem
06.06.2018, 20:24
Beitrag #1
Zeit-Server-Problem
Hallo,

mein Arduino Uno mit Ethernet-Shield soll sich die Zeit von einen Timeserver holen und mit dieser Zeit den DS3132 synchronisieren.
Fällt der Timeserver oder die Verbindung dort hin aus so soll beim ersten Start die Zeit vom DS3231 kommen. (hat die Zeit von der letzten Synchronisation)

Die geholte Zeitinfo wird irgendwo an TimeLib übergeben und diese sorgt dann für den Fortgang der Zeit.
Bei Problemen zum Zeitsever soll dann der DS3132 einspringen.

Wie bekomme ich die Zeitinfo in die TimeLib und wo wird die Zeit gestartet?

LG

Code:
#include "Time.h"
#include "TimeLib.h"

#include <Wire.h>
#include "LiquidCrystal_I2C.h"
//#include <TimeLib.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SPI.h>
#include "DS3231.h"

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xDD, 0xDD, 0xED };
IPAddress ip(192, 168, 178, 175);
EthernetServer server(80);
char timeServer[] = "ptbtime1.ptb.de";  //Zeitserver der PTB (Physikalisch-Technischen Bundesanstalt) in Braunschweig
const int ntpsync = 7200; // *** NTP Sync alle 2 Stunden
int timeZone = 1;     // Central European Time
boolean ntpsyncDone = false;    //wird TRue wenn die Zeit neu synchronisiert wurde
boolean timeSommerzeit = false;
unsigned int localPort = 8888;  // local port to listen for UDP packets
int NTPGod = 0;
int NTPBade = 0;
int messwert=0;

LiquidCrystal_I2C lcd(0x27, 20, 4);
EthernetUDP Udp;
DS3231 rtc;           //neues RTC-Objekt

void setup(){
  Serial.begin(9600);
  rtc.init();
  Serial.print("1.Zeit von RTC "); Serial.println(rtc.getDate().getTimeString());
  lcd.begin();
  Ethernet.begin(mac, ip);
    Serial.print("IP number assigned by DHCP is ");
    Serial.println(Ethernet.localIP());
  Udp.begin(localPort);
    Serial.println("waiting for sync");
  setSyncProvider(getNtpTime);
  delay(100);
  if(! ntpsyncDone){              //wurde die Zeit nicht mit dem Zeitserver synchronisiert
    Serial.print("Zeit von RTC ");
    Serial.println(rtc.getDate().getTimeString());
  }
  setSyncInterval(ntpsync); // NTP Sync alle 2 Stunden
  server.begin();
    Serial.print("server is at ");
    Serial.println(Ethernet.localIP());
}

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

void loop(){

  if (timeStatus() != timeNotSet) {
    if(ntpsyncDone){
      adjustTime(summertime_EU(year(),month(),day(),hour(),1) * 3600);    //Sommerzeit
      rtc.init();                                                         //DS3231 zurücksetzten
      rtc.setDate(year(),month(),day());                                  //DS3132 Datum neu synchronisieren    
      rtc.setTime(hour(),minute());                                       //DS3132 Zeit neu synchronisieren  */
      ntpsyncDone = false;                                                //Flage löschen
    }
    if (now() != prevDisplay) { //update the display only if time has changed
      prevDisplay = now();
      digitalClockDisplay();  
    }
  }
  
  
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    //Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    //Serial.println("client disconnected");
  }
  

  delay(100);
}

void DS3231Set(){
  rtc.init();
  rtc.setDate(14, 10, 20);
}

void digitalClockDisplay(){
  lcd.setCursor(0,0);
  printDigits(hour());
  lcd.print(':');
  printDigits(minute());
  lcd.print(':');
  printDigits(second());
  lcd.print(' ');
  lcd.print(TagStr(weekday()));
  lcd.print(' ');
  printDigits(day());
  lcd.print('.');
  printDigits(month());
  lcd.print('.');
  lcd.print(year()-2000);
  
  lcd.setCursor(0,2);
  lcd.print(NTPGod);
  lcd.print("  ");
  lcd.print(NTPBade);
  lcd.print("  ");

  Serial.print(hour());
  Serial.print(" ");
  Serial.print(minute());
  Serial.print(" ");
  Serial.print(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
}

boolean summertime_EU(int year, byte month, byte day, byte hour, byte tzHours)
{
  if (month<3 || month>10) return false; // keine Sommerzeit in Jan, Feb, Nov, Dez
  if (month>3 && month<10) return true; // Sommerzeit in Apr, Mai, Jun, Jul, Aug, Sep
  if (month==3 && (hour + 24 * day)>=(1 + tzHours + 24*(31 - (5 * year /4 + 4) % 7)) || month==10 && (hour + 24 * day)<(1 + tzHours + 24*(31 - (5 * year /4 + 1) % 7)))
    return true;
  else
    return false;
}

char* TagStr(byte Tag){
  switch(Tag) {
    case 0:return "So";break;
    case 1:return "Mo";break;
    case 2:return "Di";break;
    case 3:return "Mi";break;
    case 4:return "Do";break;
    case 5:return "Fr";break;
    case 6:return "Sa";break;
    default:return "XX";break;
  }
}

void printDigits(int digits){
  if(digits < 10){
    lcd.print('0');
  }
  lcd.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(){
  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  Serial.println("Transmit NTP Request");
  sendNTPpacket(timeServer);
  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];
      ntpsyncDone = true;
      NTPGod++;
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  NTPBade++;
  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){
void sendNTPpacket(char* 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();
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2018, 20:31
Beitrag #2
RE: Zeit-Server-Problem
Haben Dir die Antworten im anderen Forum nicht gefallen? Hier bekommst Du auch keine anderen Antworten.
Informiere Dich mal über Crossposting und warum dieses im Netz verpönt ist.

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
06.06.2018, 20:37
Beitrag #3
RE: Zeit-Server-Problem
Hallo Tommy ,
lass mich bitte in Ruhe!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2018, 20:43
Beitrag #4
RE: Zeit-Server-Problem
(06.06.2018 20:37)182 schrieb:  Hallo Tommy ,
lass mich bitte in Ruhe!

Gewöhne Du Dir lieber ein paar Gepflogenheiten an.

Gruß

Gregor
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2018, 20:50
Beitrag #5
RE: Zeit-Server-Problem
(06.06.2018 20:37)182 schrieb:  Hallo Tommy ,
lass mich bitte in Ruhe!
Dann lerne, Dich im Netz zu benehmen.
Du liegst daneben, nicht ich.

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
06.06.2018, 20:51
Beitrag #6
RE: Zeit-Server-Problem
Erkläre was ich falsch gemacht habe?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.06.2018, 20:59
Beitrag #7
RE: Zeit-Server-Problem
(06.06.2018 20:51)182 schrieb:  Erkläre was ich falsch gemacht habe?
1. Du wolltest den Foristen mit vielen ! vorschreiben, worüber sie zu schreiben hätten, da machen sie genau das Gegenteil
2. Crossposting
3. nur nebenbei Deine Ausgabe der Server-IP war falsch und auf meinen Hinweis darauf hast Du mich als ahnungslos bezeichnet

Das kommt halt arrogant rüber und das ist keine gute Basis, wenn man Hilfe will.

Entscheide Dich, in welchem Forum Du das Thema weiter verfolgen willst und tu das nur dort. Schreibe die Entscheidung aber in beide Foren.

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
06.06.2018, 21:14
Beitrag #8
RE: Zeit-Server-Problem
(06.06.2018 20:59)Tommy56 schrieb:  3. nur nebenbei Deine Ausgabe der Server-IP war falsch und auf meinen Hinweis darauf hast Du mich als ahnungslos bezeichnet

Die eben nicht falsch!
Es funktioniert ja alles, bis ich den LAN-Stecker ziehe.
Du hättest bis zu dieser Zeile lesen sollen.
Code:
char timeServer[] = "ptbtime1.ptb.de";  //Zeitserver der PTB (Physikalisch-Technischen Bundesanstalt) in Braunschweig
Das ist der Zeitserver!

Ich lese sehr viel im Forum, da fällt mir schon auf, dass 50% deiner Beiträge Zurechtweisungen sind und keinen weiter helfen.

Crossposting ist wenn ich es gleichzeitig mache.
Ich habe erst das Forum gewechselt als ich gemerkt habe, da kann keiner helfen.

Ist 56 dein Gebutrsjahr, dann solltest du einmal über Alterstatsinn nachdenken!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Anfänger mit Problem/Gärtenbewässerungsprojekt Bommes 5 349 01.10.2018 08:44
Letzter Beitrag: hotsystems
  Problem beim Kompilieren Mega2560 und Dallastemp sepp01 2 249 24.09.2018 11:33
Letzter Beitrag: sepp01
  Schleife bei Zeit x abbrechen BitsAndBytes 7 375 23.09.2018 00:30
Letzter Beitrag: BitsAndBytes
  Daten zum Server schicken (SSL?) Gandalf 1 381 03.09.2018 18:13
Letzter Beitrag: Tommy56
  Problem mit Pointer GuaAck 6 484 02.09.2018 18:34
Letzter Beitrag: Tommy56
  Counter hinzufügen (Problem bin ich) Sasch600xt 5 300 29.08.2018 15:19
Letzter Beitrag: Hilgi
  Problem mit TFT Display Anzeige wechseln Thor Wallhall 10 1.577 06.07.2018 20:51
Letzter Beitrag: Thor Wallhall
  Bootloader update mit USBASP Problem sepp01 15 1.696 12.05.2018 17:23
Letzter Beitrag: sepp01
  C++ Library Datenübergabe Problem jose_ph 9 1.183 08.05.2018 14:10
Letzter Beitrag: Tommy56
  Problem mit der Textauswertung Franz54 13 983 15.04.2018 18:17
Letzter Beitrag: Tommy56

Gehe zu:


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