sd card. csv

anton71
Offline
Зарегистрирован: 12.10.2014

не могу понять в чем дело- необходимо данные с нескольких датчиков сохранить на карте памяти, а arduino вместо этого записывает все в один столец: 

 

//Program by Jeremy Blum
//www.jeremyblum.com


#include <SD.h>         //SD Card Library
#include <Wire.h>       //I2C Library

//SPI SD Card Pins
  //MOSI = Pin 11
  //MISO = Pin 12
  //SCLK = PIN 13
  int CS_pin = 10;
  int pow_pin = 8;
  
//I2C Temperature Pins
  //SDA = Analog Pin 4
  //SCL = Analog Pin 5
  

//Light Sensor Pins
  int light_pin = 1;

float refresh_rate = 0.0;  //Dataloger Refresh Rate
int temp_address = 73;     //Address of the I2C Temp Sensor
long id = 1;                //Use this to store the id # of our reading.

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("Initializing Card");
  //CS Pin is an output
  pinMode(CS_pin, OUTPUT);
  
  //SD Card will Draw Power from Pin 8, so set it high
  pinMode(pow_pin, OUTPUT);  
  digitalWrite(pow_pin, HIGH);
  
  //Initialize Card
  if (!SD.begin(CS_pin))
  {
      Serial.println("Card Failure");
      return;
  }
  Serial.println("Card Ready");
  
  //Read the Configuration information (COMMANDS.txt)
  File commandFile = SD.open("COMMANDS.txt");
  if (commandFile)
  {
    Serial.println("Reading Command File");
    
    float decade = pow(10, (commandFile.available() - 1));
    while(commandFile.available())
    {
      float temp = (commandFile.read() - '0');
      refresh_rate = temp*decade+refresh_rate;
      decade = decade/10;
    }
    Serial.print("Refresh Rate = ");
    Serial.print(refresh_rate);
    Serial.println("ms");
    commandFile.close();
  }
  else
  {
    Serial.println("Could not read command file.");
    return;
  }
  
  //Write Log File Header
  File logFile = SD.open("LOG.csv", FILE_WRITE);
  if (logFile)
  {
    logFile.println(", , "); //Just a leading blank line, incase there was previous data
    String header = "ID, Light, Temp";
    logFile.println(header);
    logFile.close();
    Serial.println(header);
  }
  else
  {
    Serial.println("Couldn't open log file");
  }
  
}

void loop()
{
  //Check Light Level
  int light_level = analogRead(light_pin);
  
  //Read Temperature
  Wire.beginTransmission(temp_address); //Start talking
  Wire.send(0); //Ask for Register zero
  Wire.endTransmission(); //Complete Transmission
  Wire.requestFrom(temp_address, 1); //Request 1 Byte
  while(Wire.available() == 0); //wait for response
  int temp_c = Wire.receive(); // Get the temp
  int temp_f = round(temp_c*9.0/5.0 +32.0);  //Convert to stupid American units
  
 
  
  //Create Data string for storing to SD card
  //We will use CSV Format  
  String dataString = String(id) + ", " + String(light_level) + ", " + String(temp_f) ); 
  
  //Open a file to write to
  //Only one file can be open at a time
  File logFile = SD.open("LOG.csv", FILE_WRITE);
  if (logFile)
  {
    logFile.println(dataString);
    logFile.close();
    Serial.println(dataString);
  }
  else
  {
    Serial.println("Couldn't open log file");
  }
  
  //Increment ID number
  id++;
  
  delay(refresh_rate);
}

   получается примерно так:

ID, LIght, Temp

1,253,26

2,256,26

3,260,26

Radjah
Offline
Зарегистрирован: 06.08.2014

Мутишь строку: String dataString = String(id) + ", " + String(light_level) + ", " + String(temp_f) );

Пишешь в файл: logFile.println(dataString);

Получаешь три значения через запятую. Что тебя не устраивает?

anton71
Offline
Зарегистрирован: 12.10.2014

хотелось бы, чтобы они были в разных столбцах. дабы потом можно было составлять диаграмы 

Radjah
Offline
Зарегистрирован: 06.08.2014

CSV - Comma-separated values - значения, разделенные запятыми. Или тебе курсы Экселя бесплатные провести надо? ;)

anton71
Offline
Зарегистрирован: 12.10.2014

точно. только сейчас понял свою ошибку)

vdk
Offline
Зарегистрирован: 14.04.2013

anton71 пишет:

хотелось бы, чтобы они были в разных столбцах. дабы потом можно было составлять диаграмы 

А они что, в одинаковых? Согласно формату csv именно так и должно быть

anton71
Offline
Зарегистрирован: 12.10.2014

вы не поняли, загвостка в том как разделись данные

vdk
Offline
Зарегистрирован: 14.04.2013

Не нравится csv - пишите в другом формате

Radjah
Offline
Зарегистрирован: 06.08.2014

Можно вообще структуру объявить, заполнять её и писать в файл как есть, потом всё это парсить и строить графики.

Я бы еще RTC подвесил, чтобы временные отметки писать, а хранить время можно числом как unixtime.

toc
Offline
Зарегистрирован: 09.02.2013

anton71, если ваша следующая цель открывать файл в microsoft excel, то начните с него же (с экселя). По-моему, в нём csv совсем не тот. Создайте в экселе простую табличку: три столбика, пять строчек. Сохраните как "csv". Откройте в notepad ++.  Русский эксель выдаёт типа, если правильно помню:

"Имя датчика";"Текущее значение";"МинЗначение24ч"

"Термометр1";"23.1";"22.4"

 

Ни одной 'comma' (то есть запятой).

 

maxi_10
Offline
Зарегистрирован: 05.01.2012

maxi_10
Offline
Зарегистрирован: 05.01.2012

maxi_10
Offline
Зарегистрирован: 05.01.2012

maxi_10
Offline
Зарегистрирован: 05.01.2012

maxi_10
Offline
Зарегистрирован: 05.01.2012

maxi_10
Offline
Зарегистрирован: 05.01.2012

maxi_10
Offline
Зарегистрирован: 05.01.2012

maxi_10
Offline
Зарегистрирован: 05.01.2012

Radjah
Offline
Зарегистрирован: 06.08.2014

А в один пост оформить никак?