Buonasera Forum.
Sto cercando di realizzare un programma per gestire un'impianto di irrigazione con le seguenti caratteristiche:
- comunicazione con applicazione telefono (MIT)
- sincronizzazione ora tramite NTP
L'hardware che sto utilizzando è il seguente:
- Arduino Mega
- Ethernet shield W5100
- IDE 1.8.10
Premetto che ho letto molti post riguardante la programmazione NTP e gestione client e che, presi singolarmente funzionano. Il mio problema sta nel fatto che quando provo ad usarli entrambi, viene meno la comunicazione con il client.
Di seguito posto il codice
#include <SPI.h>
#include <Ethernet.h>
#include <TimeLib.h>
#include <EthernetUdp.h>
//Server Setting
IPAddress ip(192, 168, 1, 100);
EthernetServer server2(80);
EthernetClient client;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//NTP Setting
unsigned int localPort = 8888; // local port to listen for UDP packets
char timeServer[] = "time.nist.gov"; // time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48;
const int timeZone = 1; // Central European Time
byte packetBuffer[ NTP_PACKET_SIZE];
EthernetUDP Udp;
//Irrigation variables
int Line1 = 4;
int MLine1[5];
int Line2 = 5;
int MLine2[5];
int Line3 = 6;
int MLine3[5];
int Line4 = 7;
int MLine4[5];
int Pos_M = 0;
void setup()
{
//Initialization Server
Ethernet.begin(mac, ip);
server2.begin();
Serial.begin(9600);
//Initialization NTP
while (!Serial)
{
; // wait for serial port to connect. Needed for Leonardo only
}
if (Ethernet.begin(mac) == 0)
{
Serial.println("Failed to configure Ethernet using DHCP");
for (;;)
;
}
Udp.begin(localPort);
//Initialization Output line
pinMode(Line1, OUTPUT);
//Initialization Manual control
MLine1[0, 1, 2, 3, 4] = 0;
MLine2[0, 1, 2, 3, 4] = 0;
MLine3[0, 1, 2, 3, 4] = 0;
MLine4[0, 1, 2, 3, 4] = 0;
}
void loop()
{
DataTransfer_From_To_Server();
NTPFunction();
}
//Function to receive/send data from/to WebServer
void DataTransfer_From_To_Server()
{
//Receive data from WebServer
int bufLength;
String readString;
client = server2.available();
{
if (client)
{
boolean currentLineIsBlank = true;
while (client.connected())
{
if (client.available())
{
char c = client.read();
if (readString.length() < 100)
{
readString += c;
}
if (c == 'n')
{
codice
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
//Send data to WebServer
DataTransferToServer();
delay(1);
client.stop();
}
}
}
}
}
}
//Function to send data to WebServer
void DataTransferToServer()
{
codice
}
//Function NTP
void NTPFunction()
{
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) + timeZone * SECS_PER_HOUR;
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(1);
}
// send an NTP request to the time server at the given address
unsigned long 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();
}
Se disabilito l'NTP e l'UDP allora funziona la void "DataTransfer_From_To_Server"; se invece abilito tutto funziona solo l'NTP.
Grazie a tutti in anticipo per il prezioso aiuto.
Ciao
Roberto