Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства
- Название:Изучаем Arduino: инструметы и методы технического волшебства
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2015
- Город:Санкт-Петербург
- ISBN:978-5-9775-3585-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства краткое содержание
Для радиолюбителей
Изучаем Arduino: инструметы и методы технического волшебства - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
// 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 бит.
Файл открывается для записи и в него добавляются данные, разделенные запятыми.
Мы также выводим эти данные в последовательный порт для отладочных целей.
Если вы откроете терминал последовательного порта, то увидите вывод данных как на рис. 13.14.

Рис. 13.14. и Рис. 13.15.
При возникновении ошибок проверьте правильность подключения переходника, убедитесь, что SD-карта отформатирована и должным образом вставлена. Для проверки корректности записи данных вставьте SD-карту в компьютер и откройте файл в программе просмотра электронных таблиц (рис. 13.15). Обратите внимание,
- 285 -
что данные располагаются в таблице с учетом разделяющих запятых и символов перехода на новую строку.
Теперь рассмотрим чтение информации с 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
// Подключение контактов
//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);
Serial.println("ms");
commandFile.close(); // Закрыть файл настроек
}
else
{
Serial.println("Could not read command file.");
return;
}
}
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(); // Закрыть файл
- 288 -
// Вывод в последовательный порт для отладки
Serial.print(timeStarnp);
Serial.print(",");
Serial.println(dataString);
}
else
{
Serial.println("Couldn't open log file");
}
delay(refresh_rate);
}
После загрузки на плату и запуска программы данные будут записываться с частотой, указанной при настройке. За процессом можно наблюдать в мониторе последовательного порта (рис. 13.17).

Рис. 13.17. Регистрация данных на скорости Refresh Rate, указанной в настройках
13.3. Использование часов реального времени
Почти каждое приложение регистрации данных выиграет от использования часов реального времени. Наличие часов реального времени (RТС) в системе позволит вставлять временные метки измерений, поэтому легко можно отследить, когда произошло событие. В предыдущем разделе мы вызывали функцию millis(), чтобы отследить время, прошедшее с начала включения платы Arduino. Теперь задейству
- 289 -
ем микросхему часов реального времени, позволяющую фиксировать текущее время регистрации данных на SD-карту.
Назначение часов реального времени ясно из названия. Вы устанавливаете время один раз, а часы продолжают очень точно отсчитывать время, даже с учетом високосных годов. В описанном далее примере выбрана популярная микросхема часов реального времени DS1307.
Читать дальшеИнтервал:
Закладка: