Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Запись лог-данных на 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-картой.

  1. #include <FileIO.h>

В секции setup() инициализируем Bridge, FileSystem (для коммуникации с файловой системой OpenWrt-Yun) и последовательную передачу данных. Ждем подключения, а затем выводим текстовое напоминание о начале работы скетча.

  1. void setup() {
  2.   Bridge.begin();
  3.   Serial.begin(9600);
  4.   FileSystem.begin();
  5.  
  6.   while(!Serial);  
  7.   Serial.println("Filesystem datalogger\n");  // "Запись лог-данных в файловой системе"
  8. }

В секции loop() создаем строку, которая будет начинаться с временной отметки – чтобы упорядочить данные логов. Воспользуемся для этого функцией getTimeStamp().

  1. void loop () {
  2.   String dataString;
  3.   dataString += getTimeStamp();
  4.   dataString += " = ";

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

  1. for (int analogPin = 0; analogPin < 3; analogPin++) {
  2.     int sensor = analogRead(analogPin);
  3.     dataString += String(sensor);
  4.     if (analogPin < 2) {
  5.       dataString += ",";  
  6.     }
  7.   }

Открываем файл, в который будем записывать все эти данные. Это делается при помощи объекта File и функции FileSystem(). Модификатор FILE_APPEND позволит записывать эту информацию в самый конец файла. Если такого файла не существует, он будет создан. В данном случае файл для записи будет называться «datalog.txt», а создан он будет в корневой директории SD-карты.

  1. File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);

Если открытие файла прошло успешно, вписываем туда строку, закрываем файл и выводим информацию на Serial Monitor.

  1. if (dataFile) {
  2.     dataFile.println(dataString);
  3.     dataFile.close();
  4.     Serial.println(dataString);
  5.   }

Если с открытием файла возникли какие-то проблемы, отсылаем на Serial Monitor сообщение об ошибке.

  1. else {
  2.     Serial.println("error opening datalog.txt");  // "ошибка при открытии файла datalog.txt"
  3.   }
  4.   delay(15000);
  5. }

Наконец, пишем функцию getTimeStamp(), оповещая о том, когда информация была прочитана. Она вернется в виде строки.

Сначала создаем строку, в котором будем хранить информацию о текущем времени. Далее создаем экземпляр класса Process под названием «time». Начинаем задавать параметры для этого процесса и вызываем приложение «date» – это утилита командной строки, которая возвращает информацию о текущих дате и времени. Далее при помощи функции time.addParameter() поточнее определяем временной формат, указывая параметры D и T, которые возвращают информацию о текущей дате (мм/дд/гг) и времени (чч/мм/сс). Запускаем процесс и считываем результаты в строку.

  1. String getTimeStamp() {
  2.   String result;
  3.   Process time;
  4.   time.begin("date");
  5.   time.addParameter("+%D-%T");  
  6.   time.run();
  7.  
  8.   while(time.available()>0) {
  9.     char c = time.read();
  10.     if(c != '\n')
  11.       result += c;
  12.   }
  13.  
  14.   return result;
  15. }

Весь скетч полностью – ниже:

  1. /*
  2. Запись лог-данных на SD-карту
  3.  
  4. Этот пример показывает, как при помощи библиотеки Bridge записывать   лог-данные от трех аналоговых датчиков на SD-карту, подключенную к Arduino Yun.
  5.  
  6. Цепь:
  7. * Три аналоговых датчика, подсоединенных к 0-ому, 1-ому и 2-ому аналоговых контактам
  8. * SD-карта, подключенная к SD-слоту Arduino Yun
  9.  
  10. Подготовьте SD-карту, создав в корневой директории пустую папку под названием «arduino».
  11. Это позволит Yun создать связь с SD-картой в виде пути «/mnt/sd».
  12.  
  13. Во время работы скетча и Linux эту SD-карту можно вынуть, но не стоит этого делать в то время, когда система записывает туда лог-данные.
  14.  
  15. Создан 24 ноября 2010,
  16. модифицирован 9 апреля 2012 Томом Иго (Tom Igoe),
  17. адаптирован к библиотеке Yun Bridge 20 июня 2013 Федерико Ванзати (Federico Vanzati)
  18. модифицирован 21 июня 2013 Томом Иго (Tom Igoe).
  19.  
  20. Этот код не защищен авторским правом.
  21.  
  22.  */
  23.  
  24. #include <FileIO.h>
  25.  
  26. void setup() {
  27.   // Инициализируем Bridge и Serial
  28.   Bridge.begin();
  29.   Serial.begin(9600);
  30.   FileSystem.begin();
  31.  
  32.   while(!Serial);  // ждем подключения последовательного порта:
  33.   Serial.println("Filesystem datalogger\n");  // "Запись лог-данных в файловой системе"
  34. }
  35.  
  36.  
  37. void loop () {
  38.   // Создаем строку, которая будет начинаться с временной отметки, чтобы собрать из всех этих данных, собственно, лог-данные:
  39.   String dataString;
  40.   dataString += getTimeStamp();
  41.   dataString += " = ";
  42.  
  43.   // Считываем данные с трех датчиков и добавляем их к строке:
  44.   for (int analogPin = 0; analogPin < 3; analogPin++) {
  45.     int sensor = analogRead(analogPin);
  46.     dataString += String(sensor);
  47.     if (analogPin < 2) {
  48.       dataString += ",";  // отделяем данные друг от друга при помощи запятой
  49.     }
  50.   }
  51.  
  52.   // Открываем файл.
  53.   // Учтите, что одновременно может быть открыт только один файл,
  54.   // поэтому перед тем, как отрыть один, вам нужно закрыть другой.
  55.   // SD-карта находится по пути «/mnt/sd»:
  56.   File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);
  57.  
  58.   // Если файл доступен, начинаем запись:
  59.   if (dataFile) {
  60.     dataFile.println(dataString);
  61.     dataFile.close();
  62.     // Выводим данные и на Serial Monitor:
  63.     Serial.println(dataString);
  64. }  
  65.   // Если файл не открылся, пишем об ошибке:
  66.   else {
  67.     Serial.println("error opening datalog.txt");  // "ошибка при открытии файла datalog.txt"
  68.   }
  69.  
  70.   delay(15000);
  71.  
  72. }
  73.  
  74. // Эта функция возвращает информацию с временной отметкой:
  75. String getTimeStamp() {
  76.   String result;
  77.   Process time;
  78.   // date – это утилита командной строки, которая позволяет получить данные о дате и времени
  79.   // в разных форматах в зависимости от дополнительных параметров.
  80.   time.begin("date");
  81.   time.addParameter("+%D-%T");  // Параметры: D – для даты (мм/дд/гг), T – для времени (чч/мм/сс)
  82.  
  83.   time.run();  // запускаем процесс
  84.  
  85.   // Считываем результат этого процесса:
  86.   while(time.available()>0) {
  87.     char c = time.read();
  88.     if(c != '\n')
  89.       result += c;
  90.   }
  91.  
  92.   return result;
  93. }

См.также

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

  1. Arduino - Yún Datalogger