СОДЕРЖАНИЕ ►
Модуль карты памяти Ардуино (sd card shield) позволяет сохранять данные с датчиков при создании сложных проектов, так как собственная энергонезависимая память (eeprom arduino) позволяет использовать лишь 4 Кбайта памяти на Arduino Mega (Atmega2560). Рассмотрим в этом обзоре, как правильно производить чтение и запись информации в файл на SD память при помощи микроконтроллера Ардуино.
Модуль SD card shield Arduino Uno

Некоторые производители изготавливают модули с двумя контактами питания — 5 В и 3,3 В. К контакту «3,3В» в этом случае следует подключить стабилизированное напряжение 3,3 Вольта. Если нет такого контакта, то к выводу «5В» или «VCC» следует подключить 5 Вольт от платы, которое будет преобразовываться в 3,3 В. К контакту «3,3В» нельзя подключать большее напряжение, так как это выведет из строя microSD.
Для работы с модулем рекомендуется использовать файловую систему на sd карте — FAT16 или FAT32. При работе с новой картой всегда используйте данную программу для проверки работоспособности флэш памяти и модуля. Если у вас не появилась подобная информация на мониторе порта Arduino IDE, проверьте правильность подключения micro sd card модуля к плате и попробуйте предварительно отформатировать карту.
SD библиотека Arduino описание команд
Перед началом работы с модулем карты памяти потребуется установить в Arduino IDE библиотеки SD.h и SPI.h, которые можно скачать на нашем сайте — здесь. Данная библиотека содержит множество полезных команд и функций, позволяющих работать с файлами на флэш памяти sd card shield arduino nano: создавать и удалять файлы, открывать и сохранять в файлах нужную информацию с датчиков и т.д.
Функции библиотеки SD.h для microsd Arduino
- begin() – инициализация библиотеки, присваивает пин для сигнала;
- exists() – проверка, имеется ли на карте информация;
- mkdir() – создает нужную папку на sd карте памяти;
- rmdir() – удалят папку (папка должна была пустой);
- open() – открывает файл для записи/чтения (если файла нет, то он будет создан);
- remove() – удаляет файл с карты памяти.
Команды библиотеки SD.h для Arduino microsd
- available() – проверяет наличие в файле байт, доступные для чтения;
- size() – выводит информацию о размере данных;
- read() – считывает информацию;
- write() – производит запись в файл;
- close() – закрывает файл, проверяя сохранены ли данные на sd карту;
- flush() – позволяет убедиться, записаны ли данные на карту памяти;
- name() – возвращает указатель на имя;
- peek() – считывает байты данных, не перемещая указатель;
- position() – показывает текущее положение указателя в файле;
- seek() – меняет положение текущей позиции в файле;
- print() – выводит данные в отдельный файл;
- println() – печатает данные в файл до места, где появляется пустая строка;
- isDirectory() – проверка, является ли файл директорией (папкой);
- openNextFile() – выводит имя следующего файла на карте;
- rewindDirectory() – возвращает к первому файлу в папке;
Как подключить SD карту к Ардуино
Для этого занятия потребуется:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- arduino micro sd card;
- провода «папа-мама».

| SD card shield | Arduino Uno | Arduino Nano | Arduino Mega |
| GND | GND | GND | GND |
| VCC | 5V | 5V | 5V |
| MOSI | 11 | 11 | 51 |
| MISO | 12 | 12 | 50 |
| SCK | 13 | 13 | 52 |
| SC | 4 | 4 | 53 |
Модуль подключается к Ардуино по SPI интерфейсу, а для этого понадобятся выводы SCK, MISO, MOSI и CS. Для SPI шины у плат Arduino Uno и Nano имеются специальные пины, у платы Mega 2560 пины отличаются. Для контакта CS можно использовать любой свободный пин на микроконтроллере и указать это изменение в коде. По умолчанию используют пины на платах, указанные в следующей таблице.
Скетч. Проверка microSD карты памяти
Для проверки подключения sd модуля к плате Ардуино и флэш памяти используйте стандартный скетч из библиотеки SD.h — CardInfo (пример кода размещен ниже). После загрузки программы в микроконтроллер, откройте монитор порта и вы увидите там информацию (смотри скриншот ниже) — файловая система microSD карты, доступный объем памяти и список файлов с датой создания, которые сейчас есть на карте.
#include "SPI.h" #include "SD.h" Sd2Card card; SdVolume volume; SdFile root; const int chipSelect = 4; void setup(){ Serial.begin(9600); pinMode(SS, OUTPUT); // если карта не исправна, есть ошибка в подключении модуля - выводим сообщение while (!card.init(SPI_HALF_SPEED, chipSelect)) { Serial.println("initialization failed"); } // определяем тип карты и выводим его в COM-порт Serial.print("\nCard type: "); switch(card.type()) { case SD_CARD_TYPE_SD1: Serial.println("SD1"); break; case SD_CARD_TYPE_SD2: Serial.println("SD2"); break; case SD_CARD_TYPE_SDHC: Serial.println("SDHC"); break; default: Serial.println("Unknown"); } // инициализация файловой системы if (!volume.init(card)) { Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card"); return; } // вычисляем размер первого раздела на карте uint32_t volumesize; Serial.print("\nVolume type is FAT"); Serial.println(volume.fatType(), DEC); Serial.println(); // вычисляем объем памяти карты в Кб и Мб volumesize = volume.blocksPerCluster(); volumesize *= volume.clusterCount(); volumesize *= 512; Serial.print("Volume size (Kbytes): "); volumesize /= 1024; Serial.println(volumesize); Serial.print("Volume size (Mbytes): "); volumesize /= 1024; Serial.println(volumesize); Serial.println("\nFiles found on the card (name, date and size in bytes): "); root.openRoot(volume); // выводим список файлов в COM-порт root.ls(LS_R | LS_DATE | LS_SIZE); } void loop(void) { }
Пояснения к коду:
- в дальнейшем, после диагностики целостности карты памяти и правильного подключения sd модуля к плате, от проверки типа microSD, вычисления объема памяти карты и вывода списка файлов на флэшке можно отказаться.

Скетч Ардуино запись на SD карту данных
Следующий пример кода позволяет открыть файл test.txt с карты памяти для записи (если файла с таким именем нет, то он будет создан) и сохранить в нем строчку текста «testing 1, 2, 3». После этого файл следует обязательно закрыть, чтобы все данные в нем сохранились. И уже вся информация с файла выводится на COM-порт Arduino IDE. Загрузите скетч для записи файла на SD карте и откройте монитор порта.
#include "SPI.h" #include "SD.h" File myFile; const int chipSelect = 4; void setup(){ Serial.begin(9600); pinMode(SS, OUTPUT); // если карта не исправна, есть ошибка в подключении модуля - выводим сообщение while (!SD.begin(SPI_HALF_SPEED, chipSelect)) { Serial.println("initialization failed"); } // открываем файл, в котором будем сохранять информацию myFile = SD.open("test.txt", FILE_WRITE); // если файл открылся, сохраняем в нем строчку "testing 1, 2, 3" if (myFile) { Serial.println("Writing to test.txt"); myFile.println("testing 1, 2, 3"); myFile.close(); } // иначе выводим ошибку об открытии файла else { Serial.println("error opening test.txt"); } // снова открываем файл с sd карты для чтения myFile = SD.open("test.txt"); // если файл открылся, выводим информацию с него на монитор порта if (myFile) { Serial.println("\ntest.txt:"); while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } // иначе выводим ошибку об открытии файла else { Serial.println("error opening test.txt"); } } void loop(){ }
Пояснения к коду:
- при работе с sd card module в Arduino IDE нельзя открывать несколько файлов одновременно, перед открытием нового файла, старый надо закрыть;
- при каждой перезагрузке программы новые данные в файл будут добавляться, а не перезаписываться (смотри скриншот ниже).

Скетч Ардуино чтение данных с micro SD card
Следующий код позволяет вывести на монитор порта информацию о размере файла test.txt из предыдущего примера, а также всю информацию, которая была в него записана. Отметим, что имя файла на SD карте памяти не должно содержать более 8 символов (букв), не включая расширение. А библиотека SD.h не чувствительна к регистру букв в имени файла, т.е. «TEST.txt» и «test.txt» — это один и тот же файл.
#include "SPI.h" #include "SD.h" File myFile; const int chipSelect = 4; void setup(){ Serial.begin(9600); pinMode(SS, OUTPUT); // если карта не исправна, есть ошибка в подключении модуля - выводим сообщение while (!SD.begin(SPI_HALF_SPEED, chipSelect)) { Serial.println("initialization failed"); } // открываем файл с sd карты для чтения myFile = SD.open("test.txt"); // если файл открылся, узнаем его размер и выводим информацию if (myFile) { Serial.print(myFile.size()); Serial.println(" Kb"); Serial.println("\ntest.txt:"); while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } // иначе выводим ошибку об открытии файла else { Serial.println("error opening test.txt"); } } void loop(){ }
Пояснения к коду:
- библиотека SD.h не чувствительна к регистру букв, т.е. команды
SD.open("test.txt");иSD.open("TEST.txt");откроют один и тот же файл.
Заключение. Мы рассмотрели несколько возможностей работы с sd модулем для Ардуино Уно для чтения и записи файлов на sd карту памяти. Данный модуль будет полезно использовать в проектах, где требуется периодически сохранять информацию. Например, если требуется ежедневно сохранять информацию с датчика bmp180 (GY-68) Arduino об атмосферном давлении и температуре окружающего воздуха.










Спасибо! Датчик DHT уже встраивали в схему с microSD, интересно было бы посмотреть как происходит запись данных на SD карту.
Подскажите для чего мы создаем pinMode(SS, OUTPUT); и какой это пин?