Arduino:Примеры/Yún Datalogger
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Запись лог-данных на SD-карту[1]
Этот пример показывает, как при помощи библиотеки Bridge записывать лог-данные от трех аналоговых сенсоров на SD-карту, подключенную к Arduino Yun. Bridge используется, потому что SD-карта подключена не к 32U4, а к AR9331.
Подготовьте SD-карту, создав в корневом каталоге пустую папку под названием «arduino». Когда OpenWrt-Yun найдет эту папку , то создаст связь с SD-картой в виде пути «/mnt/sd».
Во время работы скетча и Linux эту SD-карту можно вынуть, но не делайте этого, пока данные будут записываться на карту.
Необходимое оборудование
- Плата Arduino Yun;
- Карта microSD;
- Три аналоговых датчика;
Цепь
Аналоговые датчики подключены к 0-ому, 1-ому и 2-ому входным аналоговым контактам. SD-карту подключите к SD-слоту Arduino Yun.
Код
Подключаем класс FileIO – чтобы Arduino могла «общаться» с SD-картой.
#include <FileIO.h>
В секции setup() инициализируем Bridge, FileSystem (для коммуникации с файловой системой OpenWrt-Yun) и последовательную передачу данных. Ждем подключения, а затем выводим текстовое напоминание о начале работы скетча.
void setup() {
Bridge.begin();
Serial.begin(9600);
FileSystem.begin();
while(!Serial);
Serial.println("Filesystem datalogger\n"); // "Запись лог-данных в файловой системе"
}
В секции loop() создаем строку, которая будет начинаться с временной отметки – чтобы упорядочить данные логов. Воспользуемся для этого функцией getTimeStamp().
void loop () {
String dataString;
dataString += getTimeStamp();
dataString += " = ";
Считываем данные с датчиков, а затем прибавляем их к строке, попутно отделяя их друг от друга при помощи запятой.
for (int analogPin = 0; analogPin < 3; analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2) {
dataString += ",";
}
}
Открываем файл, в который будем записывать все эти данные. Это делается при помощи объекта File и функции FileSystem(). Модификатор FILE_APPEND позволит записывать эту информацию в самый конец файла. Если такого файла не существует, он будет создан. В данном случае файл для записи будет называться «datalog.txt», а создан он будет в корневой директории SD-карты.
File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);
Если открытие файла прошло успешно, вписываем туда строку, закрываем файл и выводим информацию на Serial Monitor.
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
Serial.println(dataString);
}
Если с открытием файла возникли какие-то проблемы, отсылаем на Serial Monitor сообщение об ошибке.
else {
Serial.println("error opening datalog.txt"); // "ошибка при открытии файла datalog.txt"
}
delay(15000);
}
Наконец, пишем функцию getTimeStamp(), оповещая о том, когда информация была прочитана. Она вернется в виде строки.
Сначала создаем строку, в котором будем хранить информацию о текущем времени. Далее создаем экземпляр класса Process под названием «time». Начинаем задавать параметры для этого процесса и вызываем приложение «date» – это утилита командной строки, которая возвращает информацию о текущих дате и времени. Далее при помощи функции time.addParameter() поточнее определяем временной формат, указывая параметры D и T, которые возвращают информацию о текущей дате (мм/дд/гг) и времени (чч/мм/сс). Запускаем процесс и считываем результаты в строку.
String getTimeStamp() {
String result;
Process time;
time.begin("date");
time.addParameter("+%D-%T");
time.run();
while(time.available()>0) {
char c = time.read();
if(c != '\n')
result += c;
}
return result;
}
Весь скетч полностью – ниже:
/*
Запись лог-данных на SD-карту
Этот пример показывает, как при помощи библиотеки Bridge записывать лог-данные от трех аналоговых датчиков на SD-карту, подключенную к Arduino Yun.
Цепь:
* Три аналоговых датчика, подсоединенных к 0-ому, 1-ому и 2-ому аналоговых контактам
* SD-карта, подключенная к SD-слоту Arduino Yun
Подготовьте SD-карту, создав в корневой директории пустую папку под названием «arduino».
Это позволит Yun создать связь с SD-картой в виде пути «/mnt/sd».
Во время работы скетча и Linux эту SD-карту можно вынуть, но не стоит этого делать в то время, когда система записывает туда лог-данные.
Создан 24 ноября 2010,
модифицирован 9 апреля 2012 Томом Иго (Tom Igoe),
адаптирован к библиотеке Yun Bridge 20 июня 2013 Федерико Ванзати (Federico Vanzati)
модифицирован 21 июня 2013 Томом Иго (Tom Igoe).
Этот код не защищен авторским правом.
*/
#include <FileIO.h>
void setup() {
// Инициализируем Bridge и Serial
Bridge.begin();
Serial.begin(9600);
FileSystem.begin();
while(!Serial); // ждем подключения последовательного порта:
Serial.println("Filesystem datalogger\n"); // "Запись лог-данных в файловой системе"
}
void loop () {
// Создаем строку, которая будет начинаться с временной отметки, чтобы собрать из всех этих данных, собственно, лог-данные:
String dataString;
dataString += getTimeStamp();
dataString += " = ";
// Считываем данные с трех датчиков и добавляем их к строке:
for (int analogPin = 0; analogPin < 3; analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2) {
dataString += ","; // отделяем данные друг от друга при помощи запятой
}
}
// Открываем файл.
// Учтите, что одновременно может быть открыт только один файл,
// поэтому перед тем, как отрыть один, вам нужно закрыть другой.
// SD-карта находится по пути «/mnt/sd»:
File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);
// Если файл доступен, начинаем запись:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// Выводим данные и на Serial Monitor:
Serial.println(dataString);
}
// Если файл не открылся, пишем об ошибке:
else {
Serial.println("error opening datalog.txt"); // "ошибка при открытии файла datalog.txt"
}
delay(15000);
}
// Эта функция возвращает информацию с временной отметкой:
String getTimeStamp() {
String result;
Process time;
// date – это утилита командной строки, которая позволяет получить данные о дате и времени
// в разных форматах в зависимости от дополнительных параметров.
time.begin("date");
time.addParameter("+%D-%T"); // Параметры: D – для даты (мм/дд/гг), T – для времени (чч/мм/сс)
time.run(); // запускаем процесс
// Считываем результат этого процесса:
while(time.available()>0) {
char c = time.read();
if(c != '\n')
result += c;
}
return result;
}