Pages: [1]   Go Down
Author Topic: Problem with datalogger example in SD library  (Read 2599 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I found a bug in the datalogger program in the SD lib.

Took me a while to figure it out. Program ran fine for several iterations, then crashed.
If you want, I can post the datalogger that I'm developing. It uses a DS1307 clock to timestamp the data from analog and digital events.


Code as posted to lib

...............

void loop()
{
  // make a string for assembling the data to log:
  String dataString = "";     <<<<<<<<<<<<<------------------bad, bad

                              <<This creates a NEW string in each loop
                              <<move the create to global and null out the
                              <<string in loop

  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ",";
    }
  }

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  } 
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
}

..................................
Logged

Dubai, UAE
Offline Offline
Edison Member
*
Karma: 22
Posts: 1675
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
   Well done for finding that.

I guess the ultimate fix is to replace the string object with a static buffer that way there is no dependency on the string class or how it manages memory internally which could change between Arduino versions.

Duane B

rcarduino.blogspot.com


Logged


Topsham, Vermont USA
Offline Offline
Edison Member
*
Karma: 33
Posts: 1924
... in The Woods In Vermont
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
I can post the datalogger that I'm developing. It uses a DS1307 clock to timestamp the data from analog and digital events.

Please do! Some of us are working on these same things...
Logged

Regards, Terry King terry@yourduino.com  - Check great prices, devices and Arduino-related boards at http://YourDuino.com
HOW-TO: http://ArduinoInfo.Info

Andrews SC
Offline Offline
Full Member
***
Karma: 0
Posts: 239
If Arduino is not the answer, you are asking the wrong question!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

This is an old topic, but since the last post indicated a sdcard / ds1307 sketch would be posted, and I didn't see it posted, I'm posting mine. The only issue I'm having is datalog.txt has to be erased each time it's used, as if it already exists,

Initializing SD card...Card failed, or not present
error opening datalog.txt


Is the result.

Code:
// Real Time Clock

#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>

/*
  SD card datalogger
 
 This example shows how to log data from three analog sensors
 to an SD card using the SD library.
   
 The circuit:
 * analog sensors on analog ins 0, 1, and 2
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created  24 Nov 2010
 modified 9 Apr 2012
 by Tom Igoe
 
 This example code is in the public domain.
     
 */

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 4;

  //make a string to hold date & time
  String dateTime = "";
 
   // make a string for assembling the data to log:
  String dataString = "";

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
 
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
 

}

void loop()
{
 
  //zero date & time string
  dateTime = "";
 
   //zero data string
  dataString = "";
 
 
  // Setup time
  tmElements_t tm;
 
  //read date and time into a string
  if (RTC.read(tm)){
  dateTime += ",";
  dateTime += tm.Hour;
  dateTime += ":";
  dateTime += tm.Minute;
  dateTime += ":";
  dateTime += tm.Second;
  dateTime += ",";
  dateTime += tm.Month;
  dateTime += "/";
  dateTime += tm.Day;
  dateTime += "/";
  dateTime += tmYearToCalendar(tm.Year);
  }
 
 

  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ",";
    }
  }

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.

  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(dataString);
    dataFile.println(dateTime);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
    Serial.println(dateTime);
  } 
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
      }
}
Logged

Steve Spence - ET/AT/R&D KK4HFJ

Topsham, Vermont USA
Offline Offline
Edison Member
*
Karma: 33
Posts: 1924
... in The Woods In Vermont
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Steve,

I don't have this hardware set up, but I also get a compile error at
Code:
  // Setup time
  tmElements_t tm;

The libraries are found.. What RTC library from where are you using?
Logged

Regards, Terry King terry@yourduino.com  - Check great prices, devices and Arduino-related boards at http://YourDuino.com
HOW-TO: http://ArduinoInfo.Info

Andrews SC
Offline Offline
Full Member
***
Karma: 0
Posts: 239
If Arduino is not the answer, you are asking the wrong question!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

https://www.pjrc.com/teensy/td_libs_DS1307RTC.html
Logged

Steve Spence - ET/AT/R&D KK4HFJ

Pages: [1]   Go Up
Jump to: