Get time with NTP over ethernet and send data to Exosite

Dear Forum users,

I'm working on a monitoring system(for my beehives) based on one Arduino Uno (with an ethernet shield) that takes data from his ADCs and over software serial from a Teensy2++ and then sends the data to Exosite.

Until this point everything worked and so I tried to add the time(synchronised over internet with NTP) in order to be able to reset some variables overnight, the problem is that now I get the time but I can't send data to Exosite.

Does someone know where the problem is?

Here is the code, I always only get to the point were the arduino has the data from the Teensy and then it usually resets:

//librerie
#include <SPI.h> 
#include <SoftwareSerial.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Exosite.h>
#include <avr-libc.h>
#include <Time.h>

// function that calculates the temperature
 enum {
   T_KELVIN=0,
   T_CELSIUS,
   T_FAHRENHEIT
 };
 #define EPISCO_K164_10k 4300.0f,298.15f,10000.0f  // B,T0,R0
 #define SEN00250_10k 3977.0f,298.15f,10000.0f // B,T0,R0
 #define RESISTOR 9950.0f
float Temperature(int AnalogInputNumber,int OutputUnit,float B,float T0,float R0,float R_Balance)
 {
   float R,T;

   R=1024.0f*R_Balance/float(AnalogInputNumber)-R_Balance;
   T=1.0f/(1.0f/T0+(1.0f/B)*log(R/R0));

   switch(OutputUnit) {
     case T_CELSIUS :
       T-=273.15f;
     break;
     case T_FAHRENHEIT :
       T=9.0f*(T-273.15f)/3.28f+32.0f;
     break;
     default:
     break;
   };

   return T;
 }
// Indirizzo MAC della scheda Ethernet
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x11, 0x22 };

//Username di exosite
String cikData = "a0287bfc60666d2f90a5b87fe28b0db11952b969";      // <-- Fill in your CIK here! (https://portals.exosite.com -> Add Device)


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

IPAddress timeServer(199,167,198,163); // pool.ntp.org NTP server
//IPAddress timeServer = "hera.limescope.net";

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;

int timeZoneHour = +2; // Enter Your Actual Time Zone EDT (-4)

long timeZoneOffset = (timeZoneHour * -1) * 60 * 60 ;
int NTP_Update_Interval = 60; // Number of secs before resync - should be longer just testing really

//array che prendono i dati
unsigned int bilancia[50];
unsigned int compensazione[50];
//totali bilancia
unsigned int bilanciat1;
unsigned int bilanciat2;
unsigned int bilanciat;
//totali compensazione
unsigned int compensazionet2;
unsigned int compensazionet1;
unsigned int compensazionet;

int cleaned;

int i;

//costanti per il conteggio
unsigned int ins;
unsigned int insHigh;
unsigned int insLow;
unsigned int outs;
unsigned int outsHigh;
unsigned int outsLow;



int AnalogInputNumber;

// global
Exosite exosite(&Ethernet, mac, cikData);
//pin della comunicazione con il beecounter
SoftwareSerial myserial(6, 7); // RX, TX




void setup() 
{
  Serial.begin(9600);
  myserial.begin(9600);
  exosite.init();

 // Serial.println("Starting");
  // 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);
  Serial.print("Got IP:");
  Serial.println(Ethernet.localIP());
  setSyncProvider(getNTPTime);
  Serial.println("Looking for a time"); 
  Serial.println("Got a Time");
  //while(timeStatus()== timeNotSet)   
    // ;
  setSyncInterval(NTP_Update_Interval);
  

}

void loop()
{
  time_t t = now();
  
  printDigits(hour(t));
  Serial.print(":");
  printDigits(minute(t));
  Serial.println();
  
  String retVal;


//get the data from the ADCs

for(i=0; i<50; i++){
  bilancia[i]= analogRead(A0);
  compensazione[i]= analogRead(A1);
  bilanciat1= bilanciat1 + bilancia[i];
  compensazionet1= compensazionet1 + compensazione[i];
  delay(30); 
 }
 
 
  for(i=0; i<50; i++){
  bilancia[i]= 0;
  compensazione[i]= 0;
 }
 
 
  for(i=0; i<50; i++){
  bilancia[i]= analogRead(A0);
  compensazione[i]= analogRead(A1);
  bilanciat2= bilanciat2 + bilancia[i];
  compensazionet2 = compensazionet2 + compensazione[i];
  delay(30); 
 }
 
 for(i=0; i<50; i++){
  bilancia[i]= 0;
  compensazione[i]= 0;
 }
 Serial.println("Got the scale data");
 //medie parziali e medie totali
 bilanciat1 = bilanciat1/50;
 bilanciat2 = bilanciat2/50;
 
 compensazionet1 = compensazionet1/50;
 compensazionet2 = compensazionet2/50;
 
 bilanciat= (bilanciat1 + bilanciat2)/2;
 compensazionet = (compensazionet1 + compensazionet2)/2;
 

//calculate temperature
  AnalogInputNumber = compensazionet;
  float Temperatura = 100*Temperature(compensazionet,T_CELSIUS,SEN00250_10k,RESISTOR);
 Serial.println("Calculated the temperature");

//read data from the teensy over software serial
ins = 0;
outs = 0;
  while(ins == 0){
  myserial.listen();
  if (myserial.available() > 4){
    if (myserial.read() == 'I'){
     insHigh = myserial.read();
     insLow = myserial.read(); 
     outsHigh = myserial.read();
     outsLow = myserial.read();
     outs = outsLow + (outsHigh*256);
     ins = insLow + (insHigh*256);
     Serial.println("Getting beecounter data");

   }}}
     Serial.println("Got beecounter data");

 //The software interrupts here and it resets

  //Send analog input value to Exosite, use the alias (resource name) "1"
  exosite.sendToCloud("Bilancia", bilanciat);
  exosite.sendToCloud("Compensazione", compensazionet);
  exosite.sendToCloud("Temperatura", Temperatura);
  exosite.sendToCloud("Ins", ins);
  exosite.sendToCloud("Outs", outs);
  //exosite.sendToCloud("Cleaned", cleaned);

  Serial.println("DATA SENT");

  

  
 //send signal to the teensy to reset variable at midnight
 if(hour() == 00){
   myserial.print('S');
   ins=0;
   }
//azzerare costanti bilancia
 bilanciat1=0,
 bilanciat2=0;
 bilanciat=0;
 
 compensazionet2=0;
 compensazionet1=0;
 compensazionet=0;
 
 i = 0;
 

  delay(1000);
    }

//funzioni
void printDigits(int digits){
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

unsigned long getNTPTime()
{
  Serial.println("In getNTPTime");
  sendNTPpacket(timeServer);
  delay(1000); 
  if ( Udp.parsePacket() ) {  
    Serial.println("Got Time Packet");
    Udp.read(packetBuffer,NTP_PACKET_SIZE);
 
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);  
    unsigned long secsSince1900 = highWord << 16 | lowWord;  

    const unsigned long seventyYears = 2208988800UL + timeZoneOffset;      
    unsigned long epoch = secsSince1900 - seventyYears;  
  
    return epoch;    
  }
  Serial.println("No Time Packet Found");
  return 0;
}
// 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(); 
}

Thank you

Ciaociao

Normally a reset is caused by running out of SRAM. Try using the F() function on all your static string constants. Here is an example. Do the same to the rest.

    Serial.println(F("Failed to configure Ethernet using DHCP"));

Thank you very much, it worked! :slight_smile: