Arduino:Примеры/Yún Datalogger: различия между версиями
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">») |
Нет описания правки |
||
Строка 25: | Строка 25: | ||
Подключаем класс '''FileIO''' – чтобы '''Arduino''' могла '''«общаться»''' с '''SD-картой'''. | Подключаем класс '''FileIO''' – чтобы '''Arduino''' могла '''«общаться»''' с '''SD-картой'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <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 | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Запись лог-данных на SD-карту | Запись лог-данных на SD-карту |
Версия от 12:35, 20 мая 2023
Содержание | Знакомство с 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;
}