Выбрать главу

// Установить CS как выход

pinMode(CS_PIN, OUTPUT);

// Для питания карты используется вывод 8, установить HIGH

pinMode(POW_PIN, OUTPUT);

digitalWrite(POW_PIN, HIGH);

if ( !SD.begin(CS_PIN))

{

Serial.println("Card Failure");

return;

}

Serial.println("Card Ready");

}

void loop()

{

long timeStamp = millis();

String dataString = "Hello There!";

// Открыть файл и записать в него

File dataFile = SD.open("log.csv", FILE_WRITE);

if (dataFile)

{

dataFile.print(timeStamp);

dataFile.print(",");

dataFile.println(dataString);

dataFile.close(); // Данные не записаны,

// пока соединение не закрыто!

// Вывод в монитор для отладки

Serial.print(timeStamp);

Serial.print(",");

Serial.println(dataString);

}

else

{

Serial.println("Couldn't open log file");

}

delay(5000);

}

- 284 -

Обратите внимание на несколько моментов, особенно если у вас такой же переходник, как у меня (Cooking Hacks Micro SD shield):

• CS можно установить на любом контакте; если это не контакт по умолчанию (10), то необходимо в setup() предусмотреть команду pinMode(10, OUTPUT), иначе библиотека SD не будет работать;

• питание на переходник подается через контакт 8, поэтому POW_PIN должен быть установлен в качестве выхода и в setup() необходимо определить его значение как HIGH;

• при каждом проходе цикла loop() временная метка обновляется значением текущего времени, прошедшего с начала выполнения программы в миллисекундах. Переменная должна иметь тип long, потому что millis() возвращает число больше, чем 16 бит.

Файл открывается для записи и в него добавляются данные, разделенные запятыми.

Мы также выводим эти данные в последовательный порт для отладочных целей.

Если вы откроете терминал последовательного порта, то увидите вывод данных как на рис. 13.14.

Рис. 13.14. и Рис. 13.15.

При возникновении ошибок проверьте правильность подключения переходника, убедитесь, что SD-карта отформатирована и должным образом вставлена. Для проверки корректности записи данных вставьте SD-карту в компьютер и откройте файл в программе просмотра электронных таблиц (рис. 13.15). Обратите внимание,

- 285 -

что данные располагаются в таблице с учетом разделяющих запятых и символов перехода на новую строку.

13.2.4. Чтение с SD-карты

Теперь рассмотрим чтение информации с SD-карты. При регистрации данных это не нужно, но может оказаться полезным для установки параметров программы. Например, можно указать частоту регистрации данных.

Вставьте SD-карту в компьютер и создайте на ней новый текстовый файл с именем speed.txt. В этом файле просто введите время обновления в миллисекундах. На рис. 13.16 показано, что я задал время, равное 1000 мс ( 1 с).

После записи желаемой скорости обновления сохраните файл на SD-карте и вставьте карту в переходник, подключенный к Arduino. Теперь изменим програм

Рис. 13.16. Пример файла данных

- 286 -

му, предусмотрев чтение этого файла, извлечение информации и установку скорости обновления данных для регистрации.

Открыть файл для чтения позволяет та же команда so.open(), но без указания второго параметра FILE_WRITE. Поскольку класс File наследует свойства от класса потока (так же, как serial), можно использовать многие из полезных команд, например parseInt(). Сказанное иллюстрирует листинг 13.4.

Листинг 13.4. Пример чтения информации с SD-карты

File commandFile=SD.open("speed.txt");

if (commandFile)

{

Serial.println ( "Reading Command File");

while(commandFile.available() )

{

refresh_rate=commandFile.parseInt();

}

Serial.print("Refresh Rate = ");

Serial.print(refresh_rate);

Serial.println("ms");

}

else

{

Serial.println("Could not read command file.");

return;

}

Программа из листинга 13.4 открывает файл для чтения и считывает целые значения. Значение сохраняется в переменной частоты обновления, которую необходимо будет определить в начале программы. После чтения файл следует закрыть.

Теперь можно объединить листинги 13.3 и 13.4 и менять скорость записи, основываясь на содержимом файла speed.txt, как показано в листинге 13.5.

Листинг 13.5. Чтение и запись с SD-карты- sd_read_write.ino

// Чтение и запись SD-карты

#include <SD.h>

// Подключение контактов

//MOSI = pin 11

//MISO = pin 12

//SCLK = pin 13

// Подключение контакта выбора CS

const int CS_PIN =10;

const int POW_PIN =8;

// Скорость опроса по умолчанию

int refresh rate = 5000;

- 287 -

void setup()

{

Serial.begin(9600);

Serial.println("Initializing Card");

// Установить CS как выход

pinMode(CS_PIN, OUTPUT);

// Для питания карты используется контакт 8, установить HIGH

pinMode(POW_PIN, OUTPUT);

digitalWrite(POW_PIN, HIGH);

if ( !SD.begin(CS_PIN))

{

Serial.println("Card Failure");

return;

}

Serial.println("Card Ready");

// Чтение настроек (speed.txt)

File commandFile = SD.open("speed.txt");

if (comrnandFile)

{

Serial.println ( "Reading Comrnand File");

while(commandFile.available())

{

refresh_rate = commandFile.parseInt();

}

Serial.print("Refresh Rate = ");

Serial.print(refresh_rate);