В этом уроке мы узнаем, как подключить к плате Arduino модуль SD-карты и записывать на него информацию. Также в сочетании с модулем часов реального времени DS3231 мы создадим пример регистрации данных, в котором мы будем хранить данные датчика температуры на SD-карте и импортировать их в Excel, чтобы затем построить на их основе диаграмму.
Также на нашем сайте вы можете посмотреть другие проекты, в которых мы использовали модуль SD-карты:
- как работает модуль чтения SD карт и как его подключить к Arduino;
- запись информации на SD карту с помощью микроконтроллера PIC;
- бесконтактный настенный термометр на Arduino с логгером данных на SD карту;
- логгер данных температуры и влажности на SD карту и компьютер с помощью Arduino.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress) или Arduino Mega 2560 (купить на AliExpress).
- Модуль чтения SD карт (купить на AliExpress).
- Модуль часов реального времени DS3231 RTC (купить на AliExpress).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Как работает модуль SD-карты
Сначала давайте взглянем на модуль SD-карты. Он работает со стандартными картами MicroSD, рабочее напряжение которых составляет 3,3 В. Поэтому модуль имеет регулятор напряжения и переключатель уровня, поэтому мы можем использовать его с контактами 5 В на плате Arduino.
Модуль SD-карты имеет шесть контактов: два для питания модуля, контакты VCC и GND, и еще четыре контакта для связи по интерфейсу SPI. Более подробно про устройство и принцип работы модуля SD-карты вы можете прочитать в этой статье.
Схема проекта
Схема подключения модуля SD-карты к плате Arduino представлена на следующем рисунке.
Обратите внимание, что каждая плата Arduino имеет разные контакты SPI, которые следует подключать соответствующим образом.
Более подробно про работу с интерфейсом SPI в плате Arduino вы можете прочитать в этой статье.
Код модуля SD-карты Arduino
Далее нам нужно запрограммировать плату Arduino. Вот простой код для этого:
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
/* * Arduino SD Card Tutorial Example * * by Dejan Nedelkovski, www.HowToMechatronics.com */ #include <SD.h> #include <SPI.h> File myFile; int pinCS = 53; // контакт 10 на плате Arduino Uno void setup() { Serial.begin(9600); pinMode(pinCS, OUTPUT); // инициализация SD карты if (SD.begin()) { Serial.println("SD card is ready to use."); } else { Serial.println("SD card initialization failed"); return; } // создание/открытие файла myFile = SD.open("test.txt", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { Serial.println("Writing to file..."); // Write to file myFile.println("Testing text 1, 2 ,3..."); myFile.close(); // close the file Serial.println("Done."); } // если файл не открылся выводим сообщение об ошибке else { Serial.println("error opening test.txt"); } // чтение из файла myFile = SD.open("test.txt"); if (myFile) { Serial.println("Read:"); // Reading the whole file while (myFile.available()) { Serial.write(myFile.read()); } myFile.close(); } else { Serial.println("error opening test.txt"); } } void loop() { // empty } |
Описание кода: Итак, сначала нам нужно подключить стандартные библиотеки SD и SPI, создать объект «Файл» и определить вывод ChipSelect шины SPI, в моем случае это вывод 53 для Arduino Mega Board. В этом примере мы хотим, чтобы наш код выполнялся только один раз, поэтому весь код будет помещен в функцию Setup, а функция loop останется пустой.
Итак, сначала нам нужно запустить последовательную связь и задать режим работы контакта ChipSelect на вывод данных. Мы должны это сделать, потому что на контакте ChipSelect должен быть «Низкий» уровень, чтобы работала связь SPI между модулем и Arduino.
Затем, используя функцию SD.begin(), мы инициализируем SD-карту, и если инициализация прошла успешно, оператор «if» станет истинным и в мониторе последовательной связи появится строка «SD-карта готова к использованию». В противном случае будет напечатана строка «Инициализация SD-карты не удалась», а программа будет завершена.
Затем, используя функцию SD.open(), мы создадим новый файл с именем «test.txt», включая аргумент FILE_WRITE, означающий, что мы можем как читать, так и записывать в файл. Если файл уже существует, функция SD.open() просто откроет его.
Поэтому, если файл был успешно создан, сначала мы напечатаем строку «Запись в файл» в последовательном мониторе, а затем с помощью функции myFile.println() напечатаем текст «Тестовый текст 1, 2, 3…» в файл. После этого нам нужно использовать функцию close(), чтобы гарантировать, что предыдущие данные, записанные в файл, физически сохраняются на SD-карте.
Далее мы увидим, как можно читать из файла. Итак, мы снова воспользуемся той же функцией SD.open(), но на этот раз, поскольку файл «test.txt» уже создан, функция просто откроет файл. Затем, используя функцию myFile.read(), мы прочитаем файл и распечатаем его на последовательном мониторе. Функция read() на самом деле считывает только один символ за раз, поэтому нам нужно использовать цикл while и функцию myFile.available() для чтения всех символов или всех ранее записанных данных. В конце нам нужно закрыть файл.
Теперь после загрузки кода в Arduino, если все в порядке, на последовательном мониторе появится следующее.
Как мы видим, SD-карта успешно инициализирована, запись на нее также прошла успешно, а также успешно прочитано чтение записанных данных, то есть строка «Тестовый текст 1, 2, 3…». Если мы откроем SD-карту на нашем компьютере, мы увидим созданный файл «test.txt» и написанный в нем текст.
Регистрация данных на SD-карте с помощью Arduino
Теперь давайте приведем еще один, более интересный пример регистрации данных на SD карту с датчика температуры. Для этой цели мы будем использовать модуль часов реального времени DS3231, который также имеет встроенный датчик температуры. Более подробную информацию о том, как подключить и использовать этот модуль, вы можете найти в статье про подключение модуля DS3231 к плате Arduino.
Итак, после подключения модуля SD карты и модуля DS3231 к плате Arduino, давайте посмотрим на код этого примера.
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 45 46 47 48 49 |
/* * Arduino Temperature Data Logging * * by Dejan Nedelkovski, www.HowToMechatronics.com */ #include <SD.h> #include <SPI.h> #include <DS3231.h> File myFile; DS3231 rtc(SDA, SCL); int pinCS = 53; // Pin 10 on Arduino Uno void setup() { Serial.begin(9600); pinMode(pinCS, OUTPUT); // SD Card Initialization 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(); // close the file } // если файл не открылся выводим сообщение об ошибке else { Serial.println("error opening test.txt"); } delay(3000); } |
Описание кода: сначала нам нужно подключить библиотеки, необходимые для обоих модулей, затем создать два объекта и в разделе настройки инициализировать их.
В разделе цикла с использованием функции Serial.print() мы будем печатать значения времени и температуры в окне монитора последовательной связи с символом «запятая» между ними и новой строкой после значения температуры. Такая форма сообщений нам нужна, чтобы мы могли легко их импортировать и построить диаграмму в Excel. Также обратите внимание, что значения температуры преобразуются в целые числа.
Таким образом, эти же значения также будут записаны во вновь созданный файл «test.txt», и в конце нам просто нужно добавить задержку, которая будет представлять собой интервал записи данных о температуре.
После загрузки кода плата Arduino начнет сохранять значения температуры каждые 3 секунды. Через некоторое время мы можем открыть SD-карту на нашем компьютере, чтобы увидеть результаты.
Для создания диаграммы в Excel нам нужно импортировать этот файл, и вот как мы это сделаем.
В меню данных в Excel нам нужно нажать кнопку “Get Data From Text” («Получить данные из текста») и выбрать текстовый файл. Здесь мы выберем “Delimited” («С разделителями») и нажмем «Далее», а на втором этапе выберем запятую в качестве разделителя и завершим работу мастера.
Таким образом, этот процесс будет вставлять значения времени и температуры в отдельные столбцы. Теперь нам просто нужно выбрать оба столбца и в меню вставки выбрать “Insert line chart” («Вставить линейную диаграмму»). Это создаст диаграмму, на которой мы сможем видеть значения температуры каждые 3 секунды.