Arduino:Примеры/Yún Datalogger: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<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">»)
 
Нет описания правки
Строка 25: Строка 25:
Подключаем класс '''FileIO''' – чтобы '''Arduino''' могла '''«общаться»''' с '''SD-картой'''.
Подключаем класс '''FileIO''' – чтобы '''Arduino''' могла '''«общаться»''' с '''SD-картой'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#include <FileIO.h>
#include <FileIO.h>
</syntaxhighlight>
</syntaxhighlight>
Строка 31: Строка 31:
В секции setup() инициализируем '''Bridge''', '''FileSystem''' (для коммуникации с файловой системой '''OpenWrt-Yun''') и последовательную передачу данных. Ждем подключения, а затем выводим текстовое напоминание о начале работы скетча.
В секции setup() инициализируем '''Bridge''', '''FileSystem''' (для коммуникации с файловой системой '''OpenWrt-Yun''') и последовательную передачу данных. Ждем подключения, а затем выводим текстовое напоминание о начале работы скетча.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void setup() {
void setup() {
   Bridge.begin();
   Bridge.begin();
Строка 44: Строка 44:
В секции loop() создаем строку, которая будет начинаться с временной отметки – чтобы упорядочить данные логов. Воспользуемся для этого функцией getTimeStamp().
В секции loop() создаем строку, которая будет начинаться с временной отметки – чтобы упорядочить данные логов. Воспользуемся для этого функцией getTimeStamp().


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void loop () {
void loop () {
   String dataString;
   String dataString;
Строка 53: Строка 53:
Считываем данные с датчиков, а затем прибавляем их к строке, попутно отделяя их друг от друга при помощи запятой.
Считываем данные с датчиков, а затем прибавляем их к строке, попутно отделяя их друг от друга при помощи запятой.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
for (int analogPin = 0; analogPin < 3; analogPin++) {
for (int analogPin = 0; analogPin < 3; analogPin++) {
     int sensor = analogRead(analogPin);
     int sensor = analogRead(analogPin);
Строка 65: Строка 65:
Открываем файл, в который будем записывать все эти данные. Это делается при помощи объекта '''File''' и функции FileSystem(). Модификатор '''FILE_APPEND'''  позволит записывать эту информацию в самый конец файла. Если такого файла не существует, он будет создан. В данном случае файл для записи будет называться '''«datalog.txt»''', а создан он будет в корневой директории SD-карты.
Открываем файл, в который будем записывать все эти данные. Это делается при помощи объекта '''File''' и функции FileSystem(). Модификатор '''FILE_APPEND'''  позволит записывать эту информацию в самый конец файла. Если такого файла не существует, он будет создан. В данном случае файл для записи будет называться '''«datalog.txt»''', а создан он будет в корневой директории SD-карты.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);
File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);
</syntaxhighlight>
</syntaxhighlight>
Строка 71: Строка 71:
Если открытие файла прошло успешно, вписываем туда строку, закрываем файл и выводим информацию на '''Serial Monitor'''.  
Если открытие файла прошло успешно, вписываем туда строку, закрываем файл и выводим информацию на '''Serial Monitor'''.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
if (dataFile) {
if (dataFile) {
     dataFile.println(dataString);
     dataFile.println(dataString);
Строка 81: Строка 81:
Если с открытием файла возникли какие-то проблемы, отсылаем на '''Serial Monitor''' сообщение об ошибке.
Если с открытием файла возникли какие-то проблемы, отсылаем на '''Serial Monitor''' сообщение об ошибке.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
else {
else {
     Serial.println("error opening datalog.txt");  // "ошибка при открытии файла datalog.txt"
     Serial.println("error opening datalog.txt");  // "ошибка при открытии файла datalog.txt"
Строка 93: Строка 93:
Сначала создаем строку, в котором будем хранить информацию о текущем времени. Далее создаем экземпляр класса '''Process''' под названием '''«time»'''. Начинаем задавать параметры для этого процесса и вызываем приложение '''«date»''' – это утилита командной строки, которая возвращает информацию о текущих дате и времени. Далее при помощи функции time.addParameter() поточнее определяем временной формат, указывая параметры '''D''' и '''T''', которые возвращают информацию '''о текущей дате''' ('''мм/дд/гг''') и '''времени''' ('''чч/мм/сс'''). Запускаем процесс и считываем результаты в строку.
Сначала создаем строку, в котором будем хранить информацию о текущем времени. Далее создаем экземпляр класса '''Process''' под названием '''«time»'''. Начинаем задавать параметры для этого процесса и вызываем приложение '''«date»''' – это утилита командной строки, которая возвращает информацию о текущих дате и времени. Далее при помощи функции time.addParameter() поточнее определяем временной формат, указывая параметры '''D''' и '''T''', которые возвращают информацию '''о текущей дате''' ('''мм/дд/гг''') и '''времени''' ('''чч/мм/сс'''). Запускаем процесс и считываем результаты в строку.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
String getTimeStamp() {
String getTimeStamp() {
   String result;
   String result;
Строка 113: Строка 113:
Весь скетч полностью – ниже:
Весь скетч полностью – ниже:


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
Запись лог-данных на SD-карту
Запись лог-данных на SD-карту

Версия от 12:35, 20 мая 2023

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


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

См.также

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