sd card. csv
- Войдите на сайт для отправки комментариев
Вс, 12/10/2014 - 15:23
не могу понять в чем дело- необходимо данные с нескольких датчиков сохранить на карте памяти, а 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
Мутишь строку: String dataString = String(id) + ", " + String(light_level) + ", " + String(temp_f) );
Пишешь в файл: logFile.println(dataString);
Получаешь три значения через запятую. Что тебя не устраивает?
хотелось бы, чтобы они были в разных столбцах. дабы потом можно было составлять диаграмы
CSV - Comma-separated values - значения, разделенные запятыми. Или тебе курсы Экселя бесплатные провести надо? ;)
точно. только сейчас понял свою ошибку)
хотелось бы, чтобы они были в разных столбцах. дабы потом можно было составлять диаграмы
А они что, в одинаковых? Согласно формату csv именно так и должно быть
вы не поняли, загвостка в том как разделись данные
Не нравится csv - пишите в другом формате
Можно вообще структуру объявить, заполнять её и писать в файл как есть, потом всё это парсить и строить графики.
Я бы еще RTC подвесил, чтобы временные отметки писать, а хранить время можно числом как unixtime.
anton71, если ваша следующая цель открывать файл в microsoft excel, то начните с него же (с экселя). По-моему, в нём csv совсем не тот. Создайте в экселе простую табличку: три столбика, пять строчек. Сохраните как "csv". Откройте в notepad ++. Русский эксель выдаёт типа, если правильно помню:
"Имя датчика";"Текущее значение";"МинЗначение24ч"
"Термометр1";"23.1";"22.4"
Ни одной 'comma' (то есть запятой).
А в один пост оформить никак?