Arduino:Примеры/Yún Datalogger

Материал из Онлайн справочника
Версия от 22:07, 13 декабря 2016; Myagkij (обсуждение | вклад) (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Запись лог-данных на 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;
}

См.также

Внешние ссылки