Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Arduino a čas z internetu

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: po září 22 2014, 19:27    Předmět: Arduino a čas z internetu Citovat

Zdravím,
mám arduino mega 2560 a potřeboval bych v něm každých cca 10minut synchronizovat čas s nějakým ntp. Na internetu jsem našel asi 10 různých programů, ale buď nejsou funkční nebo k připojení k internetu využívají DHCP a já potřebuju mít u arduina nastavenou pevnou ip. masku i bránu, když se to DHCP pokusím změnit, tak někde dělám chybu, protože to začne hlásit error a nemůžu přijít na to v čem je problém.
Nemáte někdo nějaký funkční program, který umí synchronizovat čas nebo nedokázal by někdo upravit na pevnou ip program viz níže?

Předem děkuji za případnou pomoc

kód:

#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

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

IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov NTP server
// IPAddress timeServer(132, 163, 4, 102); // time-b.timefreq.bldrdoc.gov NTP server
// IPAddress timeServer(132, 163, 4, 103); // time-c.timefreq.bldrdoc.gov NTP server

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start Ethernet and UDP
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  Udp.begin(localPort);
}

void loop()
{
  sendNTPpacket(timeServer); // send an NTP packet to a time server

    // wait to see if a reply is available
  delay(1000); 
  if ( Udp.parsePacket() ) { 
    // We've received a packet, read the data from it
    Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); 
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord; 
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);               

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;     
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears; 
    // print Unix time:
    Serial.println(epoch);                               


    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':'); 
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch %60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000);
}

// send an NTP request to the time server at the given address
unsigned long 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();
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
hakamusai



Založen: Apr 17, 2007
Příspěvky: 943

PříspěvekZaslal: po září 22 2014, 20:34    Předmět: Citovat

Nešlo by simulovat příchozí data a nastavit PI natvrdo ?
Co použít DCF přijímač a číst čas z něj ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
berk



Založen: Feb 07, 2014
Příspěvky: 107

PříspěvekZaslal: po září 22 2014, 22:22    Předmět: Citovat

Myslím že tady je příklad:

http://arduino.cc/en/Reference/EthernetBegin

Jarda
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: út září 23 2014, 14:12    Předmět: Citovat

....nejsem v programování bohužel natolik zdatný, abych věděl, jak simulovat příchozí data a nastavit PI natvrdo?

Pokud je přijímačem myšlen modul RTC pro arduino, tak ten jsem testoval, ale po čase se o dost rozchází a neustále u něj hlídat čas... no kdyby šlo o jedno arduino asi bych to přežil, ale mám jich několik a potřebuju mít ve všech stejný čas z důvodu logování na sd kartu a následného vyhodnocení dat, takže pro mě připadá v úvahu pouze synchronizace s internetem.

jj vím jak zapsat nastavení pevné ip, ale nemůžu hnout s tím, jak to správně upravit v tom programu místo toho DHCP, aby se to synchronizovalo Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
FHonza



Založen: Nov 20, 2012
Příspěvky: 1453
Bydliště: Praha

PříspěvekZaslal: út září 23 2014, 15:09    Předmět: Citovat

Jestli tě dobře chápu, tak ti selže funkce
kód:
Ethernet.begin(mac)

protože nemáš DHCP. V odkazu, co psal Berk je vidět, jak zadat pevnou IP, případně i DNS a bránu:

kód:

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192, 168, 1, 100};

...

Ethernet.begin(mac, ip)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: út září 23 2014, 15:33    Předmět: Citovat

ano přesně tak, nemám DHCP, takže mi ten program výše neběží, když ho upravím, tak jak si myslím že by měl fungovat, tak to doběhne až po
kód:

Serial.print("nastaveni" );

a dál se už nic neděje jako by to zamrzlo
v kódu jsem vyznačil co jsem změnil oproti tomu původnímu
viz první příspěvek

kód:

#include <SPI.h>         
#include <Ethernet.h>
#include <EthernetUdp.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };


//----------------------- DOPLNIL JSEM
byte ip[] = { 192, 168, 0, 88 }; // nastavit IP Adresu
byte subnet[] = { 255, 255, 255, 0}; // maska sítě
byte gateway[] = { 192, 168, 0, 2 }; // nastavit bránu
//--------------------------------------------------------------


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

IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov NTP server
// IPAddress timeServer(132, 163, 4, 102); // time-b.timefreq.bldrdoc.gov NTP server
// IPAddress timeServer(132, 163, 4, 103); // time-c.timefreq.bldrdoc.gov NTP server

const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


//-------------------------DOPLNIL JSEM
  Ethernet.begin(mac,ip,subnet,gateway); //detekce sítě
  Udp.begin(localPort);
  Serial.print("nastaveni" );
//-------------------------------------------

//------------------------TOTO JSEM ZRUSIL
/*  // start Ethernet and UDP
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  Udp.begin(localPort);
  */
//--------------------------------------------------------------


}

void loop()
{
  sendNTPpacket(timeServer); // send an NTP packet to a time server

    // wait to see if a reply is available
  delay(1000); 
  if ( Udp.parsePacket() ) { 
    // We've received a packet, read the data from it
    Udp.read(packetBuffer,NTP_PACKET_SIZE);  // read the packet into the buffer

    //the timestamp starts at byte 40 of the received packet and is four bytes,
    // or two words, long. First, esxtract the two words:

    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); 
    // combine the four bytes (two words) into a long integer
    // this is NTP time (seconds since Jan 1 1900):
    unsigned long secsSince1900 = highWord << 16 | lowWord; 
    Serial.print("Seconds since Jan 1 1900 = " );
    Serial.println(secsSince1900);               

    // now convert NTP time into everyday time:
    Serial.print("Unix time = ");
    // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
    const unsigned long seventyYears = 2208988800UL;     
    // subtract seventy years:
    unsigned long epoch = secsSince1900 - seventyYears; 
    // print Unix time:
    Serial.println(epoch);                               


    // print the hour, minute and second:
    Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
    Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
    Serial.print(':'); 
    if ( ((epoch % 3600) / 60) < 10 ) {
      // In the first 10 minutes of each hour, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
    Serial.print(':');
    if ( (epoch % 60) < 10 ) {
      // In the first 10 seconds of each minute, we'll want a leading '0'
      Serial.print('0');
    }
    Serial.println(epoch %60); // print the second
  }
  // wait ten seconds before asking for the time again
  delay(10000);
}

// send an NTP request to the time server at the given address
unsigned long 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();
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: st září 24 2014, 13:49    Předmět: Citovat

Když se podívám na dokumentaci EthernetBegin, tak vaše volání v programu
kód:

Ethernet.begin(mac,ip,subnet,gateway); //detekce sítě

neodpovídá ani jednomu z možných prototypů:
kód:

Ethernet.begin(mac);
Ethernet.begin(mac, ip);
Ethernet.begin(mac, ip, dns);
Ethernet.begin(mac, ip, dns, gateway);
Ethernet.begin(mac, ip, dns, gateway, subnet);
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: st září 24 2014, 18:18    Předmět: Citovat

spousta programů co jsem našel ...funkčních, pro různá vyčítání dat z čidel atd.. a zobrazování na webu má ethernet.begin ,tak jak tam mám a fungují nebo i úplně jinak viz příklady

kód:

Ethernet.begin(mac);
Ethernet.begin(ip, mac, mask);
Ethernet.begin(dnServer, ip, gateway, mac, subnet);
atd...


ale proč ne zkusit se mají všechny možnosti zadal jsem, jak je uvedeno,
ale problém to nevyřešilo Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: st září 24 2014, 18:49    Předmět: Citovat

No, mixovat s parametry asi není nejlepší cesta, držel bych se dokumentace. Arduino neznám, to mají všechny Ethernet adaptéry pro Arduino stejnou MAC? Všiml jsem si, že MAC zadáváte stejnou jako v příkladu v dokumentaci.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: čt září 25 2014, 18:37    Předmět: Citovat

super Smile teda s poloviny... jj té MAC jsem si vůbec nevšiml,
arduina nemají všechna stejnou MAC je třeba ji změnit,
jenže to mi nějak uniklo, teď už to zobrazuje ve výpisu data,
ale trochu jiná než jsem čekal, že ten program bude zobrazovat


    nastaveniSeconds since Jan 1 1900 = 3620654565
    Unix time = 1411665765
    The UTC time is 17:26:45

v době kdy jsem to měl puštěné to mělo zobrazovat
25.9.2014 a čas 19:19

ntp server jsem změnil na jiný český, ale data dostávám stejná
kód:

IPAddress timeServer(147, 228, 52, 11);

nejspíš tam mají ještě nějaký jiný výpočet času, kdyby někoho
něco napadlo uvítám pomoc jinak jdu laborovat dál...
Prozatím díky
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Atlan



Založen: May 10, 2004
Příspěvky: 4507
Bydliště: Košice

PříspěvekZaslal: čt září 25 2014, 18:53    Předmět: Citovat

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
jiri255



Založen: Apr 18, 2013
Příspěvky: 168

PříspěvekZaslal: pá září 26 2014, 21:27    Předmět: Citovat

zajímavé, díky za odkazy Smile zkusím to nějak opravit do toho kódu a dám vědět...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.22 sekund