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");
}
}
..................................
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
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...
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.
// 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");
}
}
Hi Steve,
I don't have this hardware set up, but I also get a compile error at
// Setup time
tmElements_t tm;
The libraries are found.. What RTC library from where are you using?