Go Down

Topic: Mega with wiznet shield (wire hack)+thingspeak+sd problem (Read 5 times) previous topic - next topic

vespapierre

Tim,

this is the full code, without the date and time...sometimes it is put empty lines to log, or stop the log, however serial sais log ok.

Code: [Select]

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <OneWire.h>
#include <DallasTemperature.h>

byte mac[] = { 
  0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };

// change to your network settings
IPAddress ip(192,168,9,110);
IPAddress gateway(192, 168, 9, 1);
IPAddress subnet(255, 255, 255, 0);

// change to your server
IPAddress server(184,106,153,149);

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

//Variables

EthernetClient client;
int totalCount = 0;
int loopCount = 0;
char pageAdd[140];
int temp0;                                   //temperature 1
int temp1;                                  //temperature 2
int temp2;                                  //temperature 3
int numberOfDevices;                          // Number of temperature devices found
DeviceAddress tempDeviceAddress;             // We'll use this variable to store a found device address


// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

//**********SETUP***************
void setup() {
  Serial.begin(9600);

  // disable SD SPI
  pinMode(8,OUTPUT);
  digitalWrite(8,HIGH);

  // Start ethernet
  Serial.println("Starting ethernet...");
  Ethernet.begin(mac, ip, gateway, gateway, subnet);

  // If using dhcp, comment out the line above
  // and uncomment the next 2 lines

   //if(!Ethernet.begin(mac)) Serial.println("failed");
   //else Serial.println("ok");

  digitalWrite(10,HIGH);
  Serial.println(Ethernet.localIP());
  //start SD
  Serial.print("Starting SD...");
  if(!SD.begin(8)) Serial.println("failed");
  else Serial.print("ok ");
  delay(2000);
  Serial.println("Ready");
  //Start sensors
  sensors.begin();
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();

  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");

  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++)
  {

    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
    {
      Serial.print("Found device ");
      Serial.print(i, DEC);
      Serial.print(" with address: ");
      printAddress(tempDeviceAddress);
      Serial.println();
      delay(100);
      // Get inital sensor readings to avoid 85 degrees
      sensors.requestTemperatures();            //issue global request for each temp sensor on network to return a temp
      if(sensors.getAddress(tempDeviceAddress, 0))
        temp0=(sensors.getTempC(tempDeviceAddress)); //read temp from sensor 0
      if(sensors.getAddress(tempDeviceAddress, 1))
        temp1=(sensors.getTempC(tempDeviceAddress)); //read temp from sensor 1
      if(sensors.getAddress(tempDeviceAddress, 2))
        temp2=(sensors.getTempC(tempDeviceAddress));  //read temp from sensor 2
}
  }
}

//****************LOOP****************

void loop()
{
  if(loopCount < 30)
  {
    // if loopCount is less than 30, just delay a second
    delay(1000);
  }
  else
  {
    // every thirty seconds this runs
    loopCount = 0;

    // Modify next line to load different page
    // or pass values to server
    //get temperatures
    Serial.print("Getting temperatures...\n\r");
    sensors.requestTemperatures();            //issue global request for each temp sensor on network to return a temp
    if(sensors.getAddress(tempDeviceAddress, 0))
      temp0=(sensors.getTempC(tempDeviceAddress)); //read temp from sensor 0
    if(sensors.getAddress(tempDeviceAddress, 1))
      temp1=(sensors.getTempC(tempDeviceAddress)); //read temp from sensor 1
    if(sensors.getAddress(tempDeviceAddress, 2))
      temp2=(sensors.getTempC(tempDeviceAddress));  //read temp from sensor 2   

    Serial.print("Temperatures are ");
    Serial.print(temp0);
    Serial.print(" Celsius, ");
    Serial.print(temp1);
    Serial.print(" Celsius, ");
    Serial.print(temp2);
    Serial.print(" Celsius, ");
    Serial.print("\n\r");

    sprintf(pageAdd,"/update?key=XXXXXXXXXXXXXX&field1=%u&field2=%u&field3=%u",temp0,temp1,temp2);
    // sprintf(pageAdd,"/",totalCount);

    // sprintf(pageAdd,"/arduino.php?test=%u",totalCount);

    if(!getPage(server,pageAdd)) Serial.print("Fail ");
    else Serial.print("Pass ");
    delay(500);
    if(!logFile(temp0,temp1,temp2)) Serial.println("Log failed");
    else Serial.println("Log ok");

    totalCount++;
    Serial.println(totalCount,DEC);
  }   

  loopCount++;
}
int logFile(int temp0, int temp1, int temp2) {
  File fh = SD.open("test.txt",FILE_WRITE);
  if(!fh) {
    Serial.println("Open fail");
    return 0;
  }

  // Use the same character array here to send stuff to the file.
  // pageAdd array is global
  sprintf(pageAdd,"Field1=%u,Field2=%u,Field3=%u",temp0,temp1,temp2);
  fh.println(pageAdd);
  fh.close();
  return 1;
}

byte getPage(IPAddress ipBuf,char *page)
{
  int inChar;
  char outBuf[128];

  Serial.print("connecting...");

  if(client.connect(ipBuf,80))
  {
    Serial.println("connected");

    sprintf(outBuf,"GET %s HTTP/1.0\r\n\r\n",page);
    client.write(outBuf);
  }
  else
  {
    Serial.println("failed");
    return 0;
  }

  // connectLoop controls the hardware fail timeout
  int connectLoop = 0;

  while(client.connected())
  {
    while(client.available())
    {
      inChar = client.read();
      Serial.write(inChar);
      // set connectLoop to zero if a packet arrives
      connectLoop = 0;
    }

    connectLoop++;

    // if more than 10000 milliseconds since the last packet
    if(connectLoop > 10000)
    {
      // then close the connection from this end.
      Serial.println();
      Serial.println("Timeout");
      client.stop();
    }
    // this is a delay for the connectLoop timing
    delay(1);
  }

  Serial.println();

  Serial.println("disconnecting.");
  // close client end
  client.stop();

  return 1;
}

SurferTim

You may be running out of SRAM. The SD open function requires a lot of memory. If you run out of SRAM, the open function may return success, but if you try to read or write, that is when it seems to fail. I'll take a quick guess that it does not check if the memory is available, just if it can open the file on the SD card.

vespapierre

#42
Nov 24, 2012, 02:05 pm Last Edit: Nov 24, 2012, 02:15 pm by vespapierre Reason: 1
:( what can I do in this case? Should I take out some from the code? I have just followed your advices.

edit: maybe I should not use the function to find the onewire adresses automatically? but that is good function in case of a sensor change...

SurferTim

#43
Nov 24, 2012, 02:14 pm Last Edit: Nov 24, 2012, 02:17 pm by SurferTim Reason: 1
If you are using a Mega, you should not be running out of SRAM unless something has gone wrong. It has 8K, compared to the Uno's 2K. I suspect maybe a buffer overflow is the cause.

Go back to the playground and upload that code again. Get it running. You had it running before. Change the network settings, the array size for pageAdd, and add "#include <SD.h>" at the top (edit: Change the pin for your SD card SS to the correct pin number in SD.begin). That's all!

Then add this to it:
Code: [Select]
int logFile(int temp0, int temp1, int temp2) {
 File fh = SD.open("test.txt",FILE_WRITE);
 if(!fh) {
   Serial.println("Open fail");
   return 0;
 }

 // Use the same character array here to send stuff to the file.
 // pageAdd array is global
 sprintf(pageAdd,"Field1=%u,Field2=%u,Field3=%u",temp0,temp1,temp2);
 fh.println(pageAdd);
 fh.close();
 return 1;
}

Don't call the the logFile routine in loop(). See if everything runs ok before you do.

Upload the code, then power down the Arduino for a few seconds, then power it up and open the serial monitor.

vespapierre

ok. with this as you said running all ok:

Code: [Select]

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

// this must be unique
byte mac[] = {  0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };

// change to your network settings
IPAddress ip(192,168,9,108);
IPAddress gateway(192, 168, 9, 1);
IPAddress subnet(255, 255, 255, 0);

// change to your server
IPAddress server(184,106,153,149);

EthernetClient client;
int totalCount = 0;
int loopCount = 0;
char pageAdd[200];

//char pageAdd[140];

void setup() {
 Serial.begin(9600);

 // disable SD SPI
 pinMode(8,OUTPUT);
 digitalWrite(8,HIGH);

 // Start ethernet
 Serial.println("Starting ethernet...");
 Ethernet.begin(mac, ip, gateway, gateway, subnet);

 // If using dhcp, comment out the line above
 // and uncomment the next 2 lines

 // if(!Ethernet.begin(mac)) Serial.println("failed");
 // else Serial.println("ok");
 digitalWrite(10,HIGH);

 Serial.println(Ethernet.localIP());
//start SD
Serial.print("Starting SD...");
if(!SD.begin(8)) Serial.println("failed");
else Serial.print("ok ");
 delay(2000);
 Serial.println("Ready");
 
}

void loop()
{
 if(loopCount < 30)
 {
   // if loopCount is less than 30, just delay a second
   delay(1000);
 }
 else
 {
   // every thirty seconds this runs
   loopCount = 0;

   // Modify next line to load different page
   // or pass values to server
   
 
  sprintf(pageAdd,"/update?key=XXXXXXXXXXXXXXX&field1=200&field2=200&field3=200");

   if(!getPage(server,pageAdd)) Serial.print("Fail ");
   else Serial.print("Pass ");
   totalCount++;
   Serial.println(totalCount,DEC);
 }    

 loopCount++;
}

byte getPage(IPAddress ipBuf,char *page)
{
 int inChar;
 char outBuf[128];

 Serial.print("connecting...");

 if(client.connect(ipBuf,80))
 {
   Serial.println("connected");

   sprintf(outBuf,"GET %s HTTP/1.0\r\n\r\n",page);
   client.write(outBuf);
 }
 else
 {
   Serial.println("failed");
   return 0;
 }

 // connectLoop controls the hardware fail timeout
 int connectLoop = 0;

 while(client.connected())
 {
   while(client.available())
   {
     inChar = client.read();
     Serial.write(inChar);
     // set connectLoop to zero if a packet arrives
     connectLoop = 0;
   }

   connectLoop++;

   // if more than 10000 milliseconds since the last packet
   if(connectLoop > 10000)
   {
     // then close the connection from this end.
     Serial.println();
     Serial.println("Timeout");
     client.stop();
   }
   // this is a delay for the connectLoop timing
   delay(1);
 }

 Serial.println();

 Serial.println("disconnecting.");
 // close client end
 client.stop();

 return 1;
}

int logFile(int temp0, int temp1, int temp2) {
 File fh = SD.open("test.txt",FILE_WRITE);
 if(!fh) {
   Serial.println("Open fail");
   return 0;
 }

 // Use the same character array here to send stuff to the file.
 // pageAdd array is global
 sprintf(pageAdd,"Field1=%u,Field2=%u,Field3=%u",temp0,temp1,temp2);
 fh.println(pageAdd);
 fh.close();
 return 1;
}



here there was mannually added temp values as 200. no temp reading from the sensors. and no writing to the logfile

Go Up