Hello,
Attached is the code that I am trying to use in the TimeNTP.pde example sketch that I cannot get to work. I was wondering if anyone knew how to make this example sketch work in 1.0. Also is there a way to modify this sketch to use EthernetUdp.h instead of UdpBytewise.h?
Thanks!
/*
* Time_NTP.pde
* Example showing time sync to NTP time source
*
* This sketch uses the Ethenet library with the user contributed UdpBytewise extension
*/
#include <Time.h>
#include <Ethernet.h>
#include <UdpBytewise.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
#if UDP_TX_PACKET_MAX_SIZE <64 || UDP_RX_PACKET_MAX_SIZE < 64
#error : UDP packet size to small - modify UdpBytewise.h to set buffers to 64 bytes
#endif
/*
*
* You may need to modify the UdpBytewise.h library to allow enough space in the buffers for the NTP packets.
* Open up UdpBytewse.h and set the following buffers to 64 bytes:
* #define UDP_TX_PACKET_MAX_SIZE 64
* #define UDP_RX_PACKET_MAX_SIZE 64
*/
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 44 }; // set the IP address to an unused address on your network
byte SNTP_server_IP[] = { 192, 43, 244, 18}; // time.nist.gov
//byte SNTP_server_IP[] = { 130,149,17,21}; // ntps1-0.cs.tu-berlin.de
//byte SNTP_server_IP[] = { 192,53,103,108}; // ptbtime1.ptb.de
time_t prevDisplay = 0; // when the digital clock was displayed
const long timeZoneOffset = 0L; // set this to the offset in seconds to your local time;
void setup()
{
Serial.begin(9600);
Ethernet.begin(mac,ip);
Serial.println("waiting for sync");
setSyncProvider(getNtpTime);
while(timeStatus()== timeNotSet)
; // wait until the time is set by the sync provider
}
void loop()
{
if( now() != prevDisplay) //update the display only if the time has changed
{
prevDisplay = now();
digitalClockDisplay();
}
}
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 function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
/*-------- NTP code ----------*/
unsigned long getNtpTime()
{
sendNTPpacket(SNTP_server_IP);
delay(1000);
if ( UdpBytewise.available() ) {
for(int i=0; i < 40; i++)
UdpBytewise.read(); // ignore every field except the time
const unsigned long seventy_years = 2208988800UL + timeZoneOffset;
return getUlong() - seventy_years;
}
return 0; // return 0 if unable to get the time
}
unsigned long sendNTPpacket(byte *address)
{
UdpBytewise.begin(123);
UdpBytewise.beginPacket(address, 123);
UdpBytewise.write(B11100011); // LI, Version, Mode
UdpBytewise.write(0); // Stratum
UdpBytewise.write(6); // Polling Interval
UdpBytewise.write(0xEC); // Peer Clock Precision
write_n(0, 8); // Root Delay & Root Dispersion
UdpBytewise.write(49);
UdpBytewise.write(0x4E);
UdpBytewise.write(49);
UdpBytewise.write(52);
write_n(0, 32); //Reference and time stamps
UdpBytewise.endPacket();
}
unsigned long getUlong()
{
unsigned long ulong = (unsigned long)UdpBytewise.read() << 24;
ulong |= (unsigned long)UdpBytewise.read() << 16;
ulong |= (unsigned long)UdpBytewise.read() << 8;
ulong |= (unsigned long)UdpBytewise.read();
return ulong;
}
void write_n(int what, int how_many)
{
for( int i = 0; i < how_many; i++ )
UdpBytewise.write(what);
}
Error
In file included from TimeNTP.cpp:10:
/Users/dan/Documents/Arduino/libraries/UDPBytewise/UdpBytewise.h:70: error: conflicting return type specified for 'virtual void UdpBytewiseClass::write(uint8_t)'
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.h:48: error: overriding 'virtual size_t Print::write(uint8_t)'
UdpBytewise.h
/*
* UdpBytewise.cpp: Library to send/receive UDP packets with the Arduino ethernet shield.
* Drop UdpBytewise.h/.cpp into the Ethernet library directory at hardware/libraries/Ethernet
*
* NOTE: UDP is fast, but has some important limitations (thanks to Warren Gray for mentioning these)
* 1) UDP does not guarantee the order in which assembled UDP packets are received. This
* might not happen often in practice, but in larger network topologies, a UDP
* packet can be received out of sequence.
* 2) UDP does not guard against lost packets - so packets *can* disappear without the sender being
* aware of it. Again, this may not be a concern in practice on small local networks.
* For more information, see http://www.cafeaulait.org/course/week12/35.html
*
* MIT License:
* Copyright (c) 2008 Bjoern Hartmann
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* bjoern@cs.stanford.edu 12/30/2008
*/
#ifndef UdpBytewise_h
#define UdpBytewise_h
#include "Print.h"
#define UDP_TX_PACKET_MAX_SIZE 64
#define UDP_RX_PACKET_MAX_SIZE 64
#define UDP_TX_OVERFLOW_TRUNCATE 0
#define UDP_TX_OVERFLOW_SPLIT 1
class UdpBytewiseClass: public Print {
private:
uint8_t _sock; // socket ID for Wiz5100
uint16_t _port; // local port to listen on
uint8_t _txBuffer[UDP_TX_PACKET_MAX_SIZE];
uint8_t _txIndex;
uint8_t _txIp[4];
uint16_t _txPort;
uint8_t _txOverflowStrategy;
uint8_t _rxBuffer[UDP_RX_PACKET_MAX_SIZE];
uint8_t _rxIndex;
int _rxSize;
uint8_t _rxIp[4];
uint16_t _rxPort;
public:
void begin(uint16_t); // initialize, start listening on specified port
int available(); // has data been received?
// Single byte-oriented functions:
int beginPacket(uint8_t *ip, unsigned int port); // returns 1 on success, 0 if we already started a packet
virtual void write(uint8_t); // add a byte to the currently assembled packet (if there's space)
int endPacket(); // returns # of bytes sent on success, 0 if there's nothing to send
int read(); //read a byte if available - returns -1 if no data available
void getSenderIp(uint8_t * ip); //get remote IP of the packet we're currently reading from
unsigned int getSenderPort(); //get remote port# of the packet we're currently reading from
void setOverflowStrategy(uint8_t); // what to do when our packet is full and we try to add more?
};
extern UdpBytewiseClass UdpBytewise;
#endif