В случае Uno это вывод 10, для платы Mega это вывод 53. Описанные далее примеры собраны на плате Arduino Uno с выводом CS, заданным по умолчанию.
Библиотека SD позволит создать несложный пример записи данных на SD-карту.
Будем получать данные с датчиков и записывать на карту. Данные хранятся в фай
- 281 -
ле под названием log.csv, в дальнейшем его можно открыть на компьютере. Важно отметить, что при форматировании карты в F АТ 16 имена файлов должны быть записаны в формате "8.3", т. е. расширение должно состоять из трех символов, а имя файла - не более чем из восьми символов.
Убедитесь, что переходник SD правильно подключен к плате Arduino и в него установлена SD-карта. Для Cooking Hacks Micro SD shield это будет выглядеть так, как на рис. 13.13 (используются контакты 8-13 Arduino и перемычка находится на правой стороне).
Рис. 13.13. Подключение платы расширения Cooking Hacks Micro SD shield
Для отладки программы будем контролировать статус нескольких функций библиотеки SD. Например, для установки связи с SD-картой необходимо вызвать следующую функцию (листинг 13.1 ):
Листинг 13.1. Функция инициализации SD-карты
if (!SD.begin(CS_pin))
{
Serial.println("Card Failure");
return;
}
Serial.println("Card Ready");
- 282 -
Обратите внимание, что мы не просто инициализируем обмен с картой с помощью функции so.begin (CS_pin), а получаем статус выполнения этой функции. При успешной инициализации программа выдает в последовательный порт сообщение об этом, в противном случае выводится сообщение о неуспехе и команда возврата останавливает дальнейшее выполнение программы.
При записи строки в файл подход аналогичный. Например, если вы хотите записать новую строку "hello" в файл, код будет выглядеть так, как в листинге 13.2.
Листинг 13.2. Функция записи информации на SD-карту
File dataFile = SD.open("log.csv", FILE_WRITE);
if (dataFile)
{
dataFile.println("hello");
dataFile.close();
// Данные не записываются,
// пока соединение не будет закрыто
}
else
{
Serial.println("Couldn't open log file");
}
В первой строке расположена команда создания нового файла (или открытие, если он уже существует) с названием log. csv. Если файл создан/открыт успешно, переменная dataFile получит значение true, и начнем процесс записи данных в файл.
В противном случае сообщаем об ошибке в последовательный порт. Запись строки данных в файл осуществляет функция da taFile.println(); чтобы предотвратить добавление символа новой строки, вызывайте функцию dataFile.print(). Все данные направляются в буфер и записываются в файл только после выполнения команды dataFile.close().
Теперь напишем простую программу, которая создает на SD-карте файл log.csv и каждые 5 секунд записывает в него через запятую метки и какое-либо сообщение (листинг 13.3). В каждой строке файла CSV будет записана временная метка (текущее значение функции millis()) и некоторый текст. Программа может показаться вам бесполезной, но на самом деле это важный пример, подготавливающий взаимодействие с реальными датчиками, чем мы займемся в дальнейших проектах.
Листинг 13.3. Тест записи данных на SD-карту- write_to_sd.ino
// Запись данных на SD-карту
#include
// Подключение контактов
// MOSI = pin 11
// MISO = pin 12
// SCLK = pin 13
- 283 -
// Подключение контакта выбора CS
const int CS_PIN = 10;
// Контакт для питания SD-карты
const int POW_PIN =8;
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");
}
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 бит.
Файл открывается для записи и в него добавляются данные, разделенные запятыми.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии