Arduino SD problem

Hello everyone,

I need to use the SD library for a project that I need to get done.
But some problems got along.

Here’s the code:

#include <XBee.h>
#include <SPI.h>
#include <Ethernet.h>
#include <aJSON.h>
#include <Wire.h>
#include <RTClib.h>
#include <SD.h>

RTC_DS1307 RTC;

XBee xbee = XBee();
Rx16IoSampleResponse Sample = Rx16IoSampleResponse();

//int sample_qty;
//int qty = 0;
float *volt_data;
float *curr_data;
float watts;
//float watts_hour;

float max_v, min_v, avg_v, peak_v;
float curr_norm = 15.5;
float curr_ref = 494;
float volt_ref = 170*2;

char* xbee_address;
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x87, 0xFA}; 
char serverName[] = "http://monitoramentodoconsumo.appspot.com/addjson";
EthernetClient client;

DateTime dtaux;

const int chipSelect = 4;
File myFile;


void setup() {
  xbee.begin(9600);
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  RTC.adjust(DateTime(__DATE__, __TIME__));
  
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  
  
}


void loop() {
        
    xbee.readPacket();
    
    if (xbee.getResponse().isAvailable()) {
        
        if (xbee.getResponse().getApiId() == RX_16_IO_RESPONSE) {
                xbee.getResponse().getRx16IoSampleResponse(Sample);
                
                xbee_address = (char*)Sample.getRemoteAddress16();
                
                
                volt_data = (float*)malloc(sizeof(float)*Sample.getSampleSize());
                curr_data = (float*)malloc(sizeof(float)*Sample.getSampleSize());
                
                for(int i=0; i<Sample.getSampleSize(); i++){
                   
                    volt_data[i] = Sample.getAnalog(0,i);
                    curr_data[i] = Sample.getAnalog(4,i);
                       
                }
                  
                  max_v = 0; min_v = 1023;
              
                  for (int k=0; k<Sample.getSampleSize(); k++){
                      if(max_v < volt_data[k])
                          max_v = volt_data[k];
                      else if(min_v > volt_data[k])
                          min_v = volt_data[k];
                  }
                  
                  avg_v = (max_v + min_v)/2;
                  peak_v = max_v - min_v;
                  
                  
                  for(int i=0; i<Sample.getSampleSize(); i++){
                    volt_data[i] -= avg_v;
                    volt_data[i] = (volt_data[i]*volt_ref)/peak_v;
                  }
                   
                  for(int i=0; i<Sample.getSampleSize(); i++){
                    curr_data[i] -= curr_ref;
                    curr_data[i] = curr_data[i] / curr_norm;
                    watts = watts + fabs((volt_data[i]*curr_data[i]));       
                  }
                  
                  watts = watts / Sample.getSampleSize();
                  
                  free(volt_data);
                  free(curr_data);
                  

/****************************************************************************************************************************************************/
//JSON com object
                      aJsonObject *root = aJson.createObject();
                      dtaux = RTC.now();
                      
                      aJson.addNumberToObject(root, "ano",(int)dtaux.year());
                      aJson.addNumberToObject(root, "mes",(int)dtaux.month());
                      aJson.addNumberToObject(root, "dia",(int)dtaux.day());
                      aJson.addNumberToObject(root, "hora",(int)dtaux.hour());
                      aJson.addNumberToObject(root, "minuto",(int)dtaux.minute());
                      aJson.addNumberToObject(root, "segundo",(int)dtaux.second());
                      
                      aJson.addNumberToObject(root, "address", (int)xbee_address);
                      aJson.addNumberToObject(root,"consumo",watts);
                      
                      
                      char *str = aJson.print(root);
                      aJson.deleteItem(root);
                      
/****************************************************************************************************************************************************/
// Writing on the SD card
                    
                        //dataFile = SD.open("dataLog.txt", FILE_WRITE);
                          myFile = SD.open("datalog.txt");
                          if(myFile){
                             myFile.println(str);
                             myFile.close();
                          }
                        //else
                          //Serial.println("can't fill in the file");
                      free(str);
                     
                      


/****************************************************************************************************************************************************/
                  
                    Serial.println("chegou aqui");
                    /*if(client.connect(serverName,80)){
                      Serial.println("conexao feita");
                      
                      if(client.available()){
                        char c = client.read();
                        Serial.print("c=");
                        Serial.println(c); 
                      }
                      
                      client.write("Content_Type");
                      client.write("multipart/form_data;boundary=");
                      client.write("AaB03x");
                      
                      client.write("--");
                      client.write("AaB03x");
                      client.write("\r\n");
                      client.write("Content-Disposition: form-data; name=\"jsonFile\"; filename=\"jsonFile\"");
                      client.write("\r\n");
                      client.write("Content-Type: application/json");
                      client.write("\r\n");
                      client.write("\r\n");
                      client.write(str);
                      client.write("\r\n");
                      client.write("--");
                      client.write("AaB03x");
                      
                      free(str);
                      aJson.deleteItem(root);
                      //free(xbee_address);
                      //client.stop();
                      
                      Serial.println("fez tudo");
                      //if(client.available()){
                        //char c = client.read();
                        //Serial.print("c=");
                        //Serial.println(c); 
                      //}
                      client.stop();
                      
                      
                    }
                    
                  
                    else{
                      Serial.println("s");
                    }
                  //}*/
                  
        
      } else {
      	// not something we were expecting
        //flashLed(errorLed, 1, 25);  
        //Serial.println(xbee.getResponse().getApiId()); 
        //Serial.println(xbee.getResponse().isAvailable()); 
      }
    }
}

Part 2:

And this is the problematic part:

// Writing on the SD card
                      //pinMode(10, OUTPUT);
                      //analogWrite(10, HIGH);
                    
                        //dataFile = SD.open("dataLog.txt", FILE_WRITE);
                          myFile = SD.open("datalog.txt");
                          if(myFile){
                             myFile.println(str);
                             myFile.close();
                          }
                        //else
                          //Serial.println("can't write on the file");
                      free(str);

When I try to use the open() method and upload to the board, the compiler gives me the following message:

avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x64
avrdude: stk500_cmd(): programmer is out of sync

When I don’t, the code is uploaded just fine.

I switched boards, cables, and even tried to upload a code example from the SD library, and everything worked fine.

Has anyone had this sort of problem before?

Thanks in advance
Guilherme

Found the problem. The code is too long.
Guess I'll have to put it on a diet :slight_smile:

There are a lot of strings in there that'll be occupying RAM. Consider moving them to progmem. There's also a lot of dynamic memory allocation going on which, on a system with so little RAM, can often cause problems.