Arduino: чтение и запись файлов на sd карту

Некоторые вещи, которые необходимо учитывать при использовании библиотеки SD

Обзор

Связь между микроконтроллером и SD картой использует интерфейс SPI, который занимает цифровые выводы 11, 12 и 13 (на большинстве плат Arduino) или 50, 51 и 52 (Arduino Mega). Кроме того, для выбора SD карты должен использоваться еще один дополнительный вывод. Это может быть аппаратный вывод SS – вывод 10 (на большинстве плат Arduino) или вывод 53 (на платах Arduino Mega) – или какой-либо другой вывод, заданный с помощью вызова 

Обратите внимание, что даже если вы не используете аппаратный вывод SS, он должен быть оставлен настроенным для работы на выход, иначе библиотека SD работать не будет. Разные платы расширения для этого используют разные выводы, поэтому убедитесь в правильности выбора вывода в

Форматирование/подготовка карты

Примечание: всякий раз, когда в данной статье упоминается SD карта, это означает и SD, и microSD размеры, а также SD и SDHD форматы.

Большинство SD карт работает правильно сразу из коробки, но, возможно, ваша карта использовалась в компьютере или камере и не может быть прочитана с помощью библиотеки SD. Форматирование такой карты создаст файловую систему, в которой Arduino сможет читать и писать.

Часто форматировать SD карты нежелательно, так как это уменьшает их срок службы.

Для форматирования карты вам понадобятся SD ридер и компьютер. Библиотека поддерживает файловые системы FAT16 и FAT32, но по возможности лучше используйте FAT16.

Именование файлов

Файловые системы FAT имеют ограничения, когда в них используются соглашения по именованию файлов. Вы должны использовать формат 8.3, в котором имена файлов выглядят так «NAME001.EXT«, где «NAME001» – строка из 8 или менее символов, а «EXT» – расширение из 3 символов. Люди часто используют расширения .TXT и .LOG. Возможно использовать и более короткие имена (например, mydata.txt или time.log), но более длинные имена файлов использовать запрещается.

Открытие/закрытие файлов

Когда вы используете , то на карту ничего не будет записано, пока вы не вызовете или . Всякий раз, когда вы открываете файл, убедитесь, что закрыли его, чтобы сохранить свои данные.

Начиная с версии 1.0, стало возможно иметь открытыми сразу несколько файлов.

Различные платы расширения

Ниже приведено несколько различных плат расширения, поддерживающих SD карты. Этот список неполный, но в нем приведены наиболее часто используемые платы.

Arduino Ethernet Shield

Arduino Ethernet Shield

Плата расширения Ethernet Shield поставляется со слотом для SD карты. Плата устанавливается на Arduino сверху. Поскольку Ethernet модуль использует вывод 10, вывод CS для SD карты был перемещен на вывод 4. Для использования функционала SD карты вызывайте метод .

Adafruit Micro-SD breakout Board

Adafruit Micro-SD breakout Board

Данная плата поддерживает Micro-SD карты. Перед использованием ее необходимо правильно подключить к Arduino. Вывод GND на плате соедините с шиной земли на Arduino, вывод 5V – с шиной 5V, CLK – с выводом 13 на Arduino, DO – с выводом 12, DI – с выводом 11, CS – с выводом 10. Если вы уже используете вывод 10, то можете к CS подключить другой вывод, но не забудьте изменить вывод в .

Sparkfun SD Shield

Sparkfun SD Shield

Плата расширения Sparkfun устанавливается на Arduino сверху и использует вывод 8 для CS. При использовании SD карты вам необходимо вызвать метод .

Схема подключения SD card к Arduino

Предварительно отформатировав карту памяти, приступайте к её подключению.

Отформатировать карту можно этой программой: SD Card Formatter

Платы расширений облегчат задачу, ведь они позволят урегулировать напряжение до необходимых нам 3.3 В, а контроллеры уровня преобразуют питание логики в подходящие для флешки.

Плата расширений потребуется под микроконтроллеры до 5 В, учитывайте это при её выборе. Главное достоинство Ардуино – простота, и подключение вспомогательных модулей не стало исключением. Лучшим выбором станет именно структура запуска через hardware SPI пины, дабы не усложнять новичкам жизнь. Нам потребуются 13, 12 и 11 цифровые пины, а также четвёртые, чтобы наладить «chip\slave select» цепь. Под это, зачастую, берётся 10 пин, но если вы знаете, что делаете, можете выбрать и более подходящий.

Распиновка подключения Arduino Uno к SD

Обратите внимание на то, что в зависимости от форм-фактора и типа платы Ардуино, точки подключения могут варьироваться. Например, для меги необходимо соединить цепь с 50, 51, 52 и 53 слотом

Модуль SD card Arduino Uno Arduino Mega
VCC 3.3V или 5V (проверьте описание платы) 3.3V или 5V (проверьте описание платы)
CS 4 53
MOSI 11 51
CLK 13 52
MISO 12 50
GND GND GND

В последующие разы вы можете поэкспериментировать с последними пинами на обеих картах, но поначалу лучше выбрать именно те, что указаны выше. Так вы сможете отработать код, избавившись от нежелательных поломок и осечек, что значительно упростит задачу в будущем. Оставшиеся 5 В и GND подсоединяйте к соответствующим портам, здесь никаких особых инструкций нет.

Еще один вариант наглядной схемы:

В конце процедуры необходимо замкнуть CD в заземление, так система не сможет инициализировать карту памяти. Но, в случае необходимости, всегда можно применить резисторы в 10 кОм и вспомогательные порты, однако мы не будем останавливаться на этом пине, так как сейчас он нам не нужен.

Загрузка библиотек и запуск SD card на Arduino

Чтобы подсоединиться к SD карте и свободно передавать на неё данные, потребуется написать немало кода, однако здесь нам поможет встроенная библиотека SD.

Библиотеку по работе с картами памяти можно найти на официальном сайте производителя микроконтроллера: https://www.arduino.cc/en/Reference/SD

Открыв подменю «образцов», найдите заготовку «cardinfo», именно её мы не будем использовать в качестве прописной функции при загрузке информации. Скетч пригодится лишь для проверки, опознаётся ли дополнительная память на устройстве. Проверяйте chipSelect, учитывая, что подключение идёт через 10 пин.

#include <SD.h>

const int chipSelect = 4;

void setup()
{

Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect.
}
Serial.print(“Initializing SD card…”);
pinMode(10, OUTPUT);

//iniot SD card
if (!SD.begin(chipSelect))
{
Serial.println(“Card failed, or not present”);
return;
}
Serial.println(“card initialized.”);
}

void loop()
{

String dataString = “”;

// read three sensors and append to the string
for (int analogPin = 0; analogPin < 3; analogPin++)
{
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2)
{
dataString += “,”;
}
}

// open the file.
File dataFile = SD.open(“data.txt”, FILE_WRITE);

// if the file is available, write to it:
if (dataFile)
{
dataFile.println(dataString);
dataFile.close();
}
// if the file isn’t open
else
{
Serial.println(“error opening data.txt”);
}
}

Если всё прошло удачно, то на экран выведется информация о типе файловой системы и объёме вашей SD-карты. Если же производитель подсунул вам не лучший продукт, могут возникнуть ошибки. Здесь проще купить новую флешку, чем бороться с ошибками файловой системы, изначально заложенными в девайс.

Когда вы получите отклик от системы, можете начинать подгружать библиотеки и нужные вам файлы. SD-карта полностью работает и подключена, однако не забудьте протестировать несколько типов файловых систем, дабы подобрать оптимальный вариант по скорости и потреблению ресурсов. В каждом конкретном случае эти параметры будут разными, поэтому не бойтесь экспериментировать.

Файлы стандартной библиотеки C++ .lib

Стандартная библиотека C++ Характеристики Параметр Директивы препроцессора
Многопоточная, статическая компоновка.
Многопоточная, динамическая компоновка (импорт библиотеки для ) ,
Многопоточная, статическая компоновка. ,
Многопоточная, динамическая компоновка (импорт библиотеки для ) , ,

При создании окончательной версии проекта одна из основных библиотек среды выполнения C ( , , ) по умолчанию связана в зависимости от выбранного параметра компилятора (многопоточная, DLL ). Если включить в код один из файлов заголовков стандартной библиотеки c++ , стандартная библиотека c++ будет автоматически связываться с Visual C++ во время компиляции. Пример:

Для совместимости на уровне двоичного кода одна библиотека импорта может задавать несколько DLL-файлов. Обновления версий могут ввести библиотеки dot — отдельные DLL-файлы, которые вводят новые функции библиотеки. например, Visual Studio 2017 версии 15,6 появились для поддержки дополнительных функций стандартной библиотеки, не нарушая работу двоичного интерфейса приложения (ABI), поддерживаемого . библиотека импорта, входящая в набор инструментов для Visual Studio 2017 версии 15,6, поддерживает обе библиотеки dll, а для этой версии устанавливается обе библиотеки dll. После доставки библиотека dot имеет фиксированный ABI и никогда не будет зависеть от библиотеки dot более поздней версии.

Код


1 #include // Подключаем библиотеку SD
2
3 /*
4 Используемые по умолчанию контакты для библиотеки SD.
5 Если вы используете Arduino Ethernet SD shiled или любую
6 другую плату расширения использующую эти контакты,
7 то ничего менять не надо
8 MOSI = 11 контакт
9 MISO = 12 контакт
10 SCLK = 13 контакт
11 */
12
13 #define CS_PIN 10 // Контакт выбора
14 // Примечание: если вы используете Arduino Ethernet SD shiled
15 // необходимо изменить номер контакта на 4.
16 // Если ваша плата расширения использует другой контакт
17 // вам необходимо его изменить на правильный

18
19
20 int refresh_rate = 5000; // Скорость опроса по умолчанию 5 сек.
21
22 void setup()
23 {
24 Serial.begin(9600); // Инициализация последовательного соединения на скорости 9600 бод
25 Serial.println(«Initializing Card»); // Распечатываем в мониторе последовательного порта «Initializing Card»(«Инициализация карты»)
26 pinMode(CS_PIN, OUTPUT); // Определяем CS(контакт выбора) контакт как выход
27
28 // Инициализация SD-карты
29 if (!SD.begin(CS_PIN))
30 {
31 Serial.println(«Card Failure»); // Распечатываем в мониторе последовательного порта «Card Failure»(«Сбой подключения к SD-карте»)
32 return; // Останавливаем выполнение программы
33 }
34 Serial.println(«Card Ready»); // Распечатываем в мониторе последовательного порта «Card Ready»(«Карта готова к работе»)
35
36 //Чтение конфигурационного файла speed.txt
37 File commandFile = SD.open(«speed.txt»);
38 if (commandFile)
39 {
40 Serial.println(«Reading Command File»); // Распечатываем в мониторе последовательного порта «Reading Command File»(«Чтение конфигурационного файла»)
41
42 while(commandFile.available())
43 {
44 refresh_rate = commandFile.parseInt();
45 }
46 Serial.print(«Refresh Rate = «); // Распечатываем в мониторе последовательного порта «Refresh Rate = » («Частота обновления = «)
47 Serial.print(refresh_rate); // Распечатываем в мониторе последовательного порта значение переменной refresh_rate
48 Serial.println(«ms»); // Распечатываем в мониторе последовательного порта «ms»(«мс.»)
49 commandFile.close(); // Закрываем файл
50 }
51 else
52 {
53 Serial.println(«Could not read command file.»); // Распечатываем в мониторе последовательного порта «Could not read command file.»(«Не удалось прочитать конфигурационный файл»)
54 return; // Останавливаем выполнение программы
55 }
56 }
57
58 void loop()
59 {
60 long timeStamp = millis(); // Временная метка
61 String dataString = «Hello World!»;
62
63 // Открываем файл и записываем в него данные
64 File dataFile = SD.open(«log.csv», FILE_WRITE);
65 if (dataFile)
66 {
67 dataFile.print(timeStamp);
68 dataFile.print(«,»);
69 dataFile.println(dataString);
70 dataFile.close(); // Внимание! Данные не будут записаны, пока вы не закроете соединение!
71
72 // Распечатываем в мониторе последовательного порта те же данные для отладки
73 Serial.print(timeStamp);
74 Serial.print(«,»);
75 Serial.println(dataString);
76 }
77 else
78 {
79 Serial.println(«Couldn’t open log file»); // Распечатываем в мониторе последовательного порта «Couldn’t open log file»(«Не удалось открыть файл журнала»)
80 }
81 delay(refresh_rate); // Задержка длительностью refresh_rate
82 }

Логические уровни.

Помимо питания в 3,3 вольта, картам памяти требуется и такое же напряжение на логических уровнях. Поскольку мы будем подключать карту к Ардуино, напрямую их логические уровни соединять нельзя. Почему? В Arduino используется микроконтроллер Atmega, который питается от 5 вольт, соответственно его логические уровни тоже 5 вольт (от какого напряжения питается контроллер, такое напряжение присутствует у него на логических уровнях). Это значит что логическая единица равна 5 вольт. Логические же уровни SD карты 3, 3 вольта, поскольку питание у карты такое же. Для подключение Arduino и SD модуля нужно согласовать их уровни. Для согласования уровней могут использоваться резисторы или специальные микросхемы, иногда могут использоваться транзисторы.В моём случае, модуль под карту microSD содержит преобразователь уровней на микросхеме  LVC125A.

Внимание! Платформа Arduino DUE работает с логическими уровнями 3,3В и для работы с SD картой не требуется согласование уровней. Подключать SD карту к данной платформе нужно напрямую к SPI интерфейсу, минуя резисторы, транзисторы и микросхемы, которые принимают участие в согласовании уровней

Подключение Arduino к адаптеру карт

Эти модули обычно используют последовательный периферийный интерфейс (SPI) для связи с микроконтроллером. Поэтому он будет занимать три вывода GPIO на Arduino. Кроме того, вам необходимо подключить линию выбора микросхемы, чтобы включить SD-карту и линии питания для питания адаптера.

Схема подключения Arduino к адаптеру SD-карты

Зеленая (MISO) и желтая (MOSI) линии соединяются с контактами 12 и 11 Arduino. Clock (тактовый сигнал, синий) должен быть привязан к контакту 13. Обратитесь к документации Arduino, если вы не уверены, какие контакты необходимо использовать на Arduino.

Создание динамической библиотеки

Для начала стоит сказать, что объектный файл создаваемый обычным способом не подходит для динамических
библиотек. Связано это с тем, что все объектные файлы создаваемые обычным образом не имеют представления о том в какие
адреса памяти будет загружена использующая их программа. Несколько различных программ могут использовать одну библиотеку,
и каждая из них располагается в различном адресном пространстве. Поэтому требуется, чтобы переходы в функциях библиотеки
(операции goto на ассемблере) использовали не абсолютную адресацию, а относительную. То есть генерируемый компилятором
код должен быть независимым от адресов, такая технология получила название PIC — Position Independent Code. В компиляторе
gcc данная возможность включается ключом

Теперь компилирование наших файлов будет иметь вид:

Динамическая библиотека это уже не архивный файл, а настоящая загружаемая программа, поэтому созданием динамических
библиотек занимается сам компилятор gcc. Для того, чтобы создать динамическую библиотеку надо использовать
ключ :

В результате получим динамическую библиотеку libfsdyn.so, которая по моей задумке будет динамической версией библиотеки
libfs.a, что видно из названия :) Теперь, чтобы компилировать результирующий файл с использованием динамической
библиотеки нам надо собрать файл командой:

Если теперь Вы сравните файлы, полученные при использовании статической и динамической библиотеки, то увидите, что их
размеры отличаются. В данном случае файл созданный с динамической библиотекой занимает чуть больше места, но это лишь
от того, что программа используемая нами совершенно примитивная и львиную долю там занимает специальный код для
использования динамических возможностей. В реальных условиях, когда используются очень большие функции размер программы
с использованием динамической библиотеки значительно меньше.

На этом фокусы не кончаются, если Вы сейчас попробуете запустить файл rezultdyn, то получите ошибку:

Это сообщение выдает динамический линковщик. Он просто не может найти файл нашей динамической библиотеки. Дело в том, что
загрузчик ищет файлы динамических библиотек в известных ему директориях, а наша директория ему не известна. Но это мы чуть
отложим, потому что это достаточно сложный вопрос.

А сейчас стоит поговорить еще об одном моменте использования библиотек. Я специально создал динамическую библиотеку с
названием fsdyn, чтобы она отличалась от названия статической библиотеки fs. Дело в том, что если у Вас две библиотеки
статическая и динамическая с одинаковыми названиями, то есть libfs.a и libfs.so, то компилятор всегда будет использовать
динамическую библиотеку.

Связано это с тем, что в ключе -l задается часть имени библиотеки, а префикс lib и окончание .a или .so приставляет сам
компилятор. Так вот алгоритм работы компилятора таков, что если есть динамическая библиотека, то она используется по
умолчанию. Статическая же библиотека используется когда компилятор не может обнаружить файл .so этой библиотеки. Во всей
имеющейся у меня документации пишется, что если использовать ключ -static, то можно насильно заставить компилятор
использовать статическую библиотеку. Отлично, попробуем…

Как бы я не пробовал играть с позицией ключа -static, результирующий файл rez1 получается размером в 900 Кб. После
применения программы strip размер ее уменьшается до 200 Кб, но это же не сравнить с тем, что наша первая статическая
компиляция давала программу размером 10 Кб. А связано это с тем, что любая программа написанная на C/C++ в Linux
использует стандартную библиотеку «C» library, которая содержит в себе определения таких функций, как printf(), write()
и всех остальных. Эта библиотека линкуется к файлу как динамическая, чтобы все программы написанные на C++ могли
использовать единожды загруженные функции. Ну, а при указании ключа -static компилятор делает линковку libc статической,
поэтому размер кода увеличивается на все 200 Кб.

Этот эффект я не смог побороть. Поэтому я пришел к выводу, что статическую библиотеку и динамическую лучше всего создавать
с разными именами. Надеюсь в будущем мы с Вами еще разберемся с этой загвоздкой, но если действительно все так плохо,
то решение с различными именами будет единственно верным.

Функции работы с динамическими библиотеками

Использовать динамические библиотеки можно не только в начале загрузки, но и в процессе самой работы программы.
Программа сама может вызывать любые функции из библиотеки, когда ей захочется. Для этого всего-лишь надо использовать
библиотеку dl, которая позволяет линковать библиотеки «на лету». Она управляет загрузкой динамических библиотек, вызовом
функций из них и выгрузкой после конца работы.

Для использования функций программной работы с динамическими библиотеками необходимо подключить заголовочный файл:

Чтобы вызывать какие-то функции из динамической библиотеки сначала надо открыть эту библиотеку (можно сказать «загрузить»).
Открывается она функцией:

Параметр filename содержит путь до требуемой библиотеки, а параметр flag задает некоторые специфические флаги для работы.
Функция возвращает указатель на загруженную библиотеку. В случае любой ошибки возвращается указатель NULL. В таком
случае тест ошибки понятный человеку можно получить с помощью функции dlerror(). Пока мы не будем задумываться над
этим, и я приведу стандартный код для открытия библиотеки:

После этого можно работать с библиотекой. А работа эта заключается в получении адреса требуемой функции из библиотеки.
Получить адрес функции или переменной можно по ее имени с помощью функции:

Для этой функции требуется адрес загруженной библиотеки handle, полученный при открытии функцией dlopen(). Требуемая
функция или переменная задается своим именем в переменной symbol.

Закрывается библиотека функцией:

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

Для примера создадим программу, которая в качестве параметра получает название функции, которую она будет использовать
в работе. Например, это будут математические функции возведения в степень. Создадим сначала динамическую библиотеку.
Пишем ее код:

Сохраняем его в файл lib.c и создаем динамическую библиотеку libpowers.so следующими командами:

Теперь создаем основную программу в файле main.c:

Код главной программы готов. Требуется его откомпилировать с использованием библиотеки dl:

Получим программный файл main, который можно тестировать. Наша программа должна возводить значение 3.0 в
требуемую нами степень, которая задается названием функции. Давайте попробуем:

На этом все.

По теме:

  • Изучаем Linux, 101: Управление общими библиотеками
  • How to print the ld(linker) search path
  • LD, Shared Library, SO и много страшных слов
  • dlfcn.h — dynamic linking

Веб-разработка

V8

Если Вам нужен удобный инструмент для работы с JavaScript, V8 подойдёт идеально.

Свои функции V8 реализует, используя специальные классы, написанные на с++ и объявленные в namespace V8. Работать с джава скрипт — структурами можно через привычную оболочку с++.

Схема взаимодействия объектов с++ и V8 реализована посредством использования  v8::Handle (template-классов).

Установка V8 обычно не занимает много времени, а польза для тех, кому периодически приходится работать с JavaScript’ом, неоценима.

Кроме того, о библиотеках, с помощью которых могут взаимодействовать C++ и JavaScript очень любят спрашивать на собеседованиях. Поэтому даже, если вы не собираетесь работать с js , с V8 или другими подобными библиотеками лучше познакомиться.

WebKit

Так или иначе, почти все разработчики на разных этапах сталкиваются с необходимостью отображать web – элементы. Чтобы всё выглядело красиво и в коде, и в конечном отображении, а выполнение этой задачи не отнимало слишком много времени и сил, существует библиотека WebKit.

Некоторые программисты называют WebKit «чёрным ящиком», органично перерабатывающим html, css и JavaScript в полноценные веб-страницы.

Awesomium

Awesomium — это библиотека для интеграции браузера (на базе Chromium) в своё приложение. Библиотека имеет 2 режима работы: Offscreen и Windowed.

В режиме Offscreen отрисовка  и работа скриптов на экране не отображается.

В режиме Windowed средствами библиотеки эффективно выполняется отрисовка в «окне приписки» и обработка активности мыши и клавиатуры.

Awesomium активно применяется в десятках разных приложений. Описаны случаи интеграции этой библиотеки в 3D игры.

Существенный минус – отсутствие активного сообщества, способного познакомить новичка с библиотекой, ответить на вопросы и исправить ошибки. А документация, доступная для работы с Awesomium на с++, даёт довольно смутное представление о принципах работы библиотеки.

Тем не менее, Awesomium остаётся очень удобным инструментом, завоевавшим признание сотен разработчиков по всему миру.

Описание модуля для SD карты памяти

Работа с памятью SD в ардуино не представляет особых трудностей. Самым простым способом является подключение готового модуля и использование стандартной библиотеки. С этого варианта мы и начнем.

Универсальный модуль представляет собой обыкновенную плату, на которой помещены слот для карты, резисторы и регулятор напряжений. Он обладает следующими техническими характеристиками:

  • Диапазон рабочих напряжений 4,5-5 В;
  • Поддержка SD карты до 2 Гб;
  • Ток 80 мА;
  • Файловая система FAT 16.

Модуль SD-карты реализует такие функции как хранение, чтение и запись информации на карту, которая требуется для нормального функционирования прибора на базе микроконтроллера.

Естественно, у недорогих модулей карт памяти есть и недостатки. Например, самые дешевые и распространенные модели поддерживают только карты до 4Гб и почти все модули позволяют хранить на SD карте файлы объемом до двух гигабайт – это ограничение используемой в большинстве моделей файловой системы FAT.

Еще одним недостатком карт памяти является относительно долгое время записи, однако существуют пути работы с ней, позволяющие увеличить ее скорость работы. Для этого используется механизм кэширования, когда данные сначала копятся в оперативной памяти, а потом сбрасываются за раз на карту памяти.

Платы Arduino для работы с SD

Для работы с SD card существует несколько различных плат:

  • Arduino Ethernet – эта  плата оснащена специальным модулем для вывода данных. Для выхода CS используется контакт 4. Для правильной работы нужно применять команду SD.begin(4).
  • Adafruit Micro-SD – это отладочная плата, которая используется при работе с Micro-SD картами.
  • Sparkfun SD – закрепляется сверху Ардуино, для выхода CS использует 8 контакт. В новой версии платы есть соединение с 3.3 В и встроен шестиразрядный инвертор.

Запись данных с модуля DS3231 на SD карту

Необходимые детали:► Arduino UNO R3 x 1 шт.► Модуль micro SD карт, SPI x 1 шт.► Часы реального времени DS3231 x 1 шт. ► Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.► Кабель USB 2.0 A-B x 1 шт.

ПодключениеВ примере используем модуль micro SD карты и часы реального времени DS3231, с последнего будем считывать время и показания температуры (раз в три сукунды). Схема не сложная, собираем согласно рисунку ниже.

Для работы скетча необходимо три библиотеки «SD«, «SPI» и «DS3231» последняя библиотека не входит в среду разработки IDE Arduino, необходимо дополнительно установить ее, скачать можно конце статьи.

/*
Тестировалось на Arduino IDE 1.8.5
Дата тестирования 15.02.2019г.
*/

#include <SD.h> // Подключаем библиотеку SD
#include <SPI.h> // Подключаем библиотеку SPI
#include <DS3231.h> // Подключаем библиотеку DS3231

File myFile;
DS3231 rtc(SDA, SCL);
const int chipSelect = 4; // Указываем к какому выводу подключен CS

void setup()
{
Serial.begin(9600); // Открытие последовательную связь
if (SD.begin())
{
Serial.println(«SD card is ready to use.»);
}
else
{
Serial.println(«SD card initialization failed»);
return;
}
rtc.begin();
}
void loop() {
Serial.print(rtc.getTimeStr()); // Печатаем считанное показания времени
Serial.print(«,»); // Печатаем символ «,»
Serial.println(int(rtc.getTemp())); // Печатаем считанное показания температуры

myFile = SD.open(«test.txt», FILE_WRITE); // Открытие файла, одновременно может быть открыт только один файл
if (myFile) {
myFile.print(rtc.getTimeStr()); // Запись текста в файл.
myFile.print(«,»); // Запись текста в файл.
myFile.println(int(rtc.getTemp())); // Запись текста в файл.
myFile.close(); // Закрываем файла
}
else {
Serial.println(«error opening test.txt»); // Печатаем текст, если не удалось открыть файл
}
delay(3000); // Пауза 3с
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

/*
Тестировалось на Arduino IDE 1.8.5
Дата тестирования 15.02.2019г.

*/

 
#include <SD.h>                                 // Подключаем библиотеку SD
#include <SPI.h>                                // Подключаем библиотеку SPI
#include <DS3231.h>                             // Подключаем библиотеку DS3231
 

File myFile;

DS3231  rtc(SDA,SCL);

constintchipSelect=4;// Указываем к какому выводу подключен CS

voidsetup()

{

Serial.begin(9600);// Открытие последовательную связь

if(SD.begin())

{

Serial.println(«SD card is ready to use.»);

}

else

{

Serial.println(«SD card initialization failed»);

return;

}

rtc.begin();

}

voidloop(){

Serial.print(rtc.getTimeStr());// Печатаем считанное показания времени

Serial.print(«,»);// Печатаем символ «,»

Serial.println(int(rtc.getTemp()));// Печатаем считанное показания температуры

myFile=SD.open(«test.txt»,FILE_WRITE);// Открытие файла, одновременно может быть открыт только один файл

if(myFile){

myFile.print(rtc.getTimeStr());// Запись текста в файл.

myFile.print(«,»);// Запись текста в файл.

myFile.println(int(rtc.getTemp()));// Запись текста в файл.

myFile.close();// Закрываем файла

}

else{

Serial.println(«error opening test.txt»);// Печатаем текст, если не удалось открыть файл

}

delay(3000);// Пауза 3с

}

После загрузки скетча Arduino начнет сохранять значения температуры каждые 3 секунды.

Теперь, через некоторое время можно подключить SD карту к компьютеру и открыть файл «TEST.txt», чтобы увидеть результаты.

При необходимости можно создать линейный график.

Ссылки  Библиотека libraries-DS3231

Купить на Aliexpress  Контроллер Arduino UNO R3 на CH340G  Контроллер Arduino UNO R3 на Atmega16U2  Провода DuPont, 2,54 мм, 20 см  Модуль SD кары, SPI  Часы реального времени RTC DS3231

Заключение

Как мы с вами убедились, подключить SD карту памяти к Ардуино и использовать ее в проекте не очень сложно. Для этого есть готовые библиотеки в Arduino IDE и самые разнообразные варианты модулей.  Приобрести карту памяти можно в любом магазине электроники, они стоят недорого, при этом позволяют существенно расширить потенциал платы Ардуино. С использованием карт памяти можно собирать и сохранять для последующего анализа большие объемы данных. С помощью нашей статьи мы сможете наделить памятью свои исследовательские проекты, создать системы голосового оповещения для умного дома, создать простой wav-проигрыватель и многое другое.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: