Pages: 1 [2]   Go Down
Author Topic: Problem saving data to SD  (Read 2087 times)
0 Members and 1 Guest are viewing this topic.
Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 551
Posts: 46240
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The format part of the sprintf argument list is the part between the "". If you want the message array to contain a CR\LF, add \n at the end:

Code:
sprintf(message,"%ld,%ld\n", temp, Vcc);

If you want to write more data into message, message must be longer.

As for the format "magic", see this:
http://www.cppreference.com/wiki/c/io/printf
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks so much PaulS,

It works perfectly now.

The link is great and looks very useful to learn more about C.

Now i post here the final code as i have it working. May be it could be useful to somebody else in the future.

Code:
#include <FileLogger.h>
#define MEM_PW 8

long readTemp() {
  long result;
  // Read temperature sensor against 1.1V reference
  ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3);
  delay(20); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = (result - 125) * 1075;
  return result;
}

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}

void setup() {
  pinMode(MEM_PW, OUTPUT);
  digitalWrite(MEM_PW, HIGH);
  Serial.begin(9600);
  Serial.println("Arduino inner temperature and inner voltage");
}

void loop() {
  // To read the inner temperature and voltage
  long temp=readTemp();
  long Vcc=readVcc();
  // To prepare and to save the data tostore in the microSD
  char message[20];
  sprintf(message,"%ld, %ld\n", temp, Vcc);
  unsigned long length = strlen(message);
  FileLogger::append("data.log", (byte*)message, length);
  // Now i show the result in serial
  Serial.print(temp, DEC); // show the inner temperature of arduino
  Serial.print(" x10^-4 degC   ");
  Serial.print(Vcc, DEC); // show the voltage
  Serial.println("  mVolts");
  // Wait 1 second until to take a new measurement
  delay(1000);
}

You could apply it to any other measurement acquired by temperature sensors, accelerometers, or whatever.... just only pay attention to the expression to be save, and the length of the message to be stored in the SD, as you could read in the previous post and the great explanations by PaulS.

Thanks PaulS. Enjoy everyone!
Logged

Pages: 1 [2]   Go Up
Jump to: