Проект 27: SD-карта. Читання і запис даних
В цьому експерименті ми покажемо, як до плати Arduino підключити SD-карту.
Необхідні компоненти:
- контролер Arduino UNO R3;
- плата для прототипування;
- модуль SD-card;
- модуль годин реального часу DS1307 з батарейкою;
- датчик температури LM335;
- резистор 2,2 кОм;
- дроти тато-тато.
Якщо вашим Аrduino-проектам не вистачає пам'яті, а обсяг енергонезалежної пам'яті EEPROM в платах Arduino зовсім невеликий, можна використовувати зовнішні носії. Один з найпростіших по підключенню до платам Arduino - це SD-карта. Можна під'єднатися до SD-карті безпосередньо, а можна використовувати модулі.Подсоедінім модуль SD-card до плати Arduino і напишемо приклад збереження на SD-карті даних аналогового датчика температури LM335. Для аналізу даних температури потрібно знати і час вимірювання даних, тому будемо використовувати і модуль годин реального часу RTC. Зберемо схему, показану на рис. 27.1.

Рис. 27.1. Схема підключення модулів SD-card і DS1307 до Arduino
При написанні скетчу використовуємо бібліотеку SD для роботи з SD-картою, а також бібліотеки Time і DS1307 для роботи з модулем RTC. Вміст скетчу показано в лістингу 27.1. Кожні 5 хвилин ми зчитуємо дані з датчика LM335, підключеного до аналогового входу A0, і заносимо час вимірювання і дані температури в файл виду dmY. На початку доби створюємо новий файл на новий день.
лістинг 27.1
// підключення бібліотек для RTC
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
// підключення бібліотеки для SD
#include <SD.h>
File myFile;
String sfilename;
char filename [20];
const int LM335 = A0; // для підключення LM335
tmElements_t tm;
unsigned long millis1 = 0;
void setup ()
{;}
void loop ()
{
// перевірка пройшло 5 хвилин?
if (millis () - millis1> 5 * 60 * 000)
{
millis1 = millis ();
// отримати ім'я файлу для поточного дня
sfilename = get_file_name ();
sfilename.toCharArray (filename, 20);
// відкрити файл або створити
myFile = SD.open (filename, FILE_WRITE);
// отримати температуру
double val = analogRead (lm335); // читання
double voltage = val * 5.0 / 1024; // переклад в вольти
double temp = voltage * 100 - 273.15; // в градуси Цельсія
// отримати час H: m
// створити запис для файлу
record = get_time ();
record + = "";
record + = String (temp);
myFile.println (record);
myFile.close ();
}
// отримання часу дня
String get_time ()
{
String time1;
RTC.read (tm);
if (tm.Hour () <10)
time1 = "0" + String (tm.Hour (), DEC);
else
time1 = String (tm.Hour (), DEC);
if (tm.Minute () <10)
time1 + = ": 0" + String (tm.Minute (), DEC);
else
time1 + = ":" + String (tm.Minute (), DEC);
return time1;
}
Порядок підключення:
- Підключаємо модулі SD card, DS1307 і датчик температури LM335 до плати Arduino за схемою на рис. 27.1.
- Завантажуємо в плату Arduino скетч з лістингу 27.1. Чекаємо тривалий час, потім виймаємо карту, вставляємо в комп'ютер, відкриваємо файл, що відповідає поточному дню, і дивимося його вміст - по рядках часу виміру і показники температури.