Data Logging Sketch Locking Up (Arduino MEGA1280 w/Official Ethernet Shield)


hi guys,

i've quite literally spent day going through code cannot life of me figure out what's going on. seems lock up, i've tried multiple arduino's , ethernet shields i'm code issue.

the idea 1 arduino logs sensors , transmits data second arduino via twi logging sd card , live (give or take few seconds) submission php server via ethernet.

however, reason second sketch keeps locking up. can shed light on me, can't seem find reason nor pattern it. seems main loop stops running, when happens wire interrupt still work , log data sd, other times nothing happens @ all.

code: [select]
#include <wire.h>
#include <sd.h>
#include <spi.h>
#include <ethernet.h>
#include <avr/wdt.h>
#include <memoryfree.h>

byte mac[] = { 
  0x00, 0xaa, 0xbb, 0xcc, 0xde, 0x02 };
char server[] = "my.web.server"; // self explanatory!
char siteid[] = "1"; // arduino identifier, if decide have several.
char sitepw[] = "password"; // 'password' unique each site

ethernetclient client;
unsigned long timer;
string datastring;
string sendstring;
int fileindex = 0;
char itoabuffer[12];
string serverresponse = "";
////////////////////////////////////////////////////////////////////////////
void setup ()
{
  serial.begin(57600);
  serial.println("setting ethernet");
  if(ethernet.begin(mac) == 0)
  {
    serial.println("*** failed configure ethernet using dhcp");
    software_reboot(3);
  }
  else
  {
    (byte thisbyte = 0; thisbyte < 4; thisbyte++) {
      serial.print(ethernet.localip()[thisbyte], dec);
      serial.print(".");
    }
    serial.println();
    delay(1000);
  }
  serial.println("setting sd card");
  if (!sd.begin(4))
  {
    serial.println("*** unable setup sd card");
    software_reboot(4);
  }
  serial.println("checking files on sd card");
  while(sd.exists(itoa(fileindex, itoabuffer, 10)))
  {
    serial.print("found file ");
    serial.println(fileindex);
    fileindex++;
  }
  if(fileindex > 0)
  {
    fileindex--;
  }
  serial.println("starting twi");
  wire.begin(4);
  wire.onreceive(receiveevent);
  serial.println("setup complete");
}
////////////////////////////////////////////////////////////////////////////
void loop ()
{
  if (millis() > timer)
  {
    serial.print("free memory:");
    serial.println(freememory());
    serial.println("timer up");
    timer = millis() + 3000;
    char sdreading[15];
    char sendchar[35];
    serial.println("checking if sd files exist");
    if(sd.exists(itoa(fileindex, itoabuffer, 10)))
    {
      serial.println("found file, reading file");
      file myfile = sd.open(itoa(fileindex, itoabuffer, 10), file_read);
      for(byte = 0; myfile.available() || < 12; i++)
      {
        serial.print("1");
        if(i < sizeof(sdreading))
        {
          serial.print("2");
          sdreading[i] = myfile.read();
          serial.print(sdreading[i]);
        }
        else
        {
          serial.print("3");
          myfile.read();
        }
      }
      myfile.close();
      serial.println("closing file");
      byte dataend = 0;
      byte x = 0;
      for(x = 0; x < (sizeof(sdreading) + 1); x++)
      {
        serial.print("4");
        if(sdreading[x] == '.')
        {
          serial.print("5");
          dataend = x;
          x = sizeof(sdreading) + 1;
        }
      }
      sendstring = "";
      for(x = 0; x < dataend; x++)
      {
        serial.print("6");
        sendstring += sdreading[x];
      }
      submittoserver(sendstring);
    }
    else
    {
      serial.println("no files found");
    }
  }
}
////////////////////////////////////////////////////////////////////////////
void receiveevent(int howmany)
{
  datastring = "";
  while(0 < wire.available())
  {
    serial.print("7");
    byte sensor = wire.read();
    int z = 0;
    z = wire.read() << 8;
    z |= wire.read();
    datastring += string(sensor);
    datastring += ",";
    datastring += string(z);
    datastring += ".";
    while(sd.exists(itoa(fileindex, itoabuffer, 10)))
    {
      serial.print("8");
      fileindex++;
    }
    file datafile = sd.open(itoa(fileindex, itoabuffer, 10), file_write);
    if(datafile)
    {
      serial.print("writing ");
      serial.print(datastring);
      serial.print(" file ");
      serial.println(fileindex);
      datafile.println(datastring);
      datafile.close();
      serial.println("... done");
      serial.print("free memory:");
      serial.println(freememory());
      serial.print("timer: ");
      serial.println(timer);
      serial.print("millis: ");
      serial.println(millis());
    }
  }
}
////////////////////////////////////////////////////////////////////////////
void submittoserver(string sitedata)
{
  serial.print("9");
  client.stop();
  serial.print("10");
  client.flush();
  serial.print("11");
  serverresponse = "";
  string sendurl = "";
  if(client.connect(server, 80))
  {
    serial.println("connected");
    sendurl += "get /ard/srv.php?d=";
    sendurl += siteid;
    sendurl += "&p=";
    sendurl += sitepw;
    sendurl += "&v=";
    sendurl += sitedata;
    sendurl += " http/1.1";
    serial.println(sendurl);
    client.println(sendurl);
    client.println("host: htpour.forumcomputers.co.uk");
    client.println("connection: close");
    client.println();
  }
  else
  {
    serial.println("connection failed");
    software_reboot(2);
  }
  while(client.connected())
  {
    while(client.available())
    {
      char c = client.read();
      serial.print(c);
      if (c == '<')
      {
        c = client.read();
        serverresponse += c;
        c = client.read();
        serverresponse += c;
        c = client.read();
        serverresponse += c;
        c = client.read();
        serverresponse += c;
        serial.print("server responded: ");
        serial.println(serverresponse);
        serial.println("disconnecting");
        client.stop();
      }
    }
  }
  if(serverresponse == "okok")
  {
    if(fileindex > 0)
    {
      serial.print("removing file ");
      serial.println(fileindex);
      if(sd.exists(itoa(fileindex, itoabuffer, 10)))
      {
        serial.print("a");
        sd.remove(itoa(fileindex, itoabuffer, 10));
      }
      fileindex--;
    }
    else
    {
      if(sd.exists(itoa(fileindex, itoabuffer, 10)))
      {
        serial.print("removing last file ");
        serial.println(fileindex);
        sd.remove(itoa(fileindex, itoabuffer, 10));
        serial.println("last file removed");
      }
    }
    serverresponse = "";
  }
}
////////////////////////////////////////////////////////////////////////////
void software_reboot(byte count)
{
  serial.print("*** error: ");
  serial.println(count);
  serial.println("rebooting...");
  while(count != 0)
  {
    digitalwrite(13,high);
    delay(1000);
    digitalwrite(13,low);
    delay(500);
    count--;
  }
  //cli();
  //wdt_enable(wdto_15ms);
  //while(1)
  //{
  //}
}


many in advance!

what software_reboot() supposed doing?

i suggest simplify sketch far can eliminate functionality unrelated problem, , add print statements show code executing when sketch locks up. if you're putting trace statements close lock-up, suggest call serial.flush() ensure trace message gets sent before sketch locks up.


Arduino Forum > Using Arduino > Programming Questions > Data Logging Sketch Locking Up (Arduino MEGA1280 w/Official Ethernet Shield)


arduino

Comments

Popular posts from this blog

opencv3, tbb and rasp pi 2 - Raspberry Pi Forums

small ethernet problem - Raspberry Pi Forums

Multithumb configuration params not working? - Joomla! Forum - community, help and support