Объем
энергонезависимой
памяти EEPROM
в
Arduino
небольшой.
И как же
хранить
больш
ой
объем данных
без
потери при перезагрузке?
Для решения этой
задачи на помощь приходит
SD
карта
.
Arduino
без проблем может
создавать,
удалять
файлы,
а также
записывать
данные в файлы.
Об этом я рассказывал
в предыдущих уроках:
#13.1.Arduino SD карта. Создаем, удаляем файлы.Чтение, запись файлов.
Урок 13.3 Arduino строим графики по данным c sd карты.
Для
данного
урока
нам понадоб
ятся:
1.
Arduino
UNO
или
Arduino
NANO
2.
Модуль
SD карты
.
3.
Беспаечная
макетная плата
.
4.
Соединительные
провода
.
Подключаем
SD-модуль к Arduino UNO по
такой схеме.
Для
начала работы
подготовим
файл
с данными
,
которые будут
считывать
Arduino.
Так как я уже писал
в комментариях
в группе ВК, что можно создать
расписание будильника. Давайте это
и сделаем:
расписание
будильника на неделю
.
7,20;
7,00;
7,20;
6,40;
7,00;
9,00;
9,00;
Я
использую символы: точка запятой - это
конец строки, и запятая - это разделитель
между значениями (разделители можно
использовать любые).
Назовем
файл config.txt. Установим
карту
памяти в
SD-модуль.
Напишем
небольшой скетч, который будет считывать
данные с
SD-карты
и сохранять
данные в «переменные».
И выводить полученное
расписание будильника
на
монитор порта.
#include <SPI.h>
#include <SD.h>
File myFile;
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 8;
//Массив времени будильника. Можем использовать в любой строчке кода
char* names[7][2];
void setup()
{
// Открыть последовательное соединение и ждать открытия порта:
Serial.begin(9600);
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("initialization failed!");
while (1);
}
Serial.println("initialization done.");
// вызавим функцию для загрузки расписания будильника.
configSD();
}
void loop()
{
// после завершения настройки ничего не делать.
}
void configSD() // функции чтения конфигурационного файла с SD
{
// вспомогательные переменные
int h = 0;
int q = 0;
int d=7;
char array[d][10];
char *buffer;
char symbol2 = 0;
File configFile = SD.open("config.txt");
if (configFile)
{
Serial.println("config.txt open OK");
// файл существует считываем из него данные
while (configFile.available())
{
// считываем байт входящего файла
symbol2 = configFile.read();
if (symbol2==';') // символ конца строки
{
array[q][h]='\0';
q++;
h=0;
}
else // если еще не конец строки посимвольно добавляем
{
array[q][h] = symbol2;
h++;
}
delay(2);
}
configFile.close(); // закрываем файл
}
char *p;
byte t;
// разберем полученные строки разделитель запятая
for (int j=0; j < d; j++)
{
t = 0;
for( buffer = strtok_r(array[j], ",", &p); buffer; buffer = strtok_r(NULL, ",", &p) )
{
names[j][t]=buffer; // запишем в массив часы и мин.
t++;
}
}
for (byte j = 0; j < d; j++) { // Выведем данные в монитор порта
// данные из массива names[j][0] можно использовать в коде.
Serial.print(names[j][0]); // вывод часов
Serial.print(":"); // разделитель
Serial.print(names[j][1]); // вывод минут
}
}
Давайте подробнее рассмотрим код.
Считывание
файла
с
SD карты
вынесено в отдельную функцию. Вызываем
данную
функцию
в блоке void setup(). Так как нам достаточно
1 раз считать расписание будильника,
сохранить в «переменную» и использовать
в дальнейшем. При
необходимости
изменить
расписание
будильника можно повторно
вызвав
данную функцию.
// вызавим функцию для загрузки расписания будильника.
configSD();
Массив
char* names[7][2]; находится в разделе «глобальных
переменных»
не случайно. Так как данную «переменную»
мы сможем использовать в любом месте
кода, и,
соответственно,
получить
расписание
будильника
.
// файл существует считываем из него данные
while (configFile.available())
{
// считываем байт входящего файла
symbol2 = configFile.read();
if (symbol2==';') // символ конца строки
{
array[q][h]='\0';
q++;
h=0;
}
else // если еще не конец строки посимвольно добавляем
{
array[q][h] = symbol2;
h++;
}
delay(2);
}
configFile.close(); // закрываем файл
В
данном цикле микроконтроллер
считывает
побайтово
значения, пока не доходит
до символа
конца строки. После
чего считывает
следующую строку, пока не дойдет
до
конца файла. В нашем
случае
-
7 строк. После чего файл можно закрыть.
Он нам больше не нужен.
// разберем полученные строки разделитель запятая
for (int j=0; j < d; j++)
{
t = 0;
for( buffer = strtok_r(array[j], ",", &p); buffer; buffer = strtok_r(NULL, ",", &p) )
{
names[j][t]=buffer; // запишем в массив часы и мин.
t++;
}
}
В
этом
цикле мы разбираем наши строки на
элементы
разделенные запятой. И сохраняем
в наш массив
char*
names[7][2];
Сейчас
мы можем оперировать нашим расписанием.
Давайте выведем в монитор
порта наше расписание. Для этого напишем
вот такой небольшой цикл:
for (byte j = 0; j < d; j++) { // Выведем данные в монитор порта
// данные из массива names[][] можно использовать в коде.
Serial.print(names[j][0]); // вывод часов
Serial.print(":"); // разделитель
Serial.print(names[j][1]); // вывод минут
}
Данный
пример
можно доработать, чтоб
обрабатывать другое количество данных
с
SD
карты
средствами Arduino.
Но вы должны помнить,
что чем больше данных вы будете
сохранять
в «переменную», тем больше вам понадобится
динамической
памяти, которой не так
и
много в
Arduino
UNO или NANO
.
Для
обработки большего количества данных
вы можете воспользоваться,
например,
Arduino
MEGA
или другой отладочной платой с большим
объемом динамической памяти.
Не
забывайте подписываться на канал
Youtube и
вступайте в группы в
Вконтакте и Facebook.
Всем
Пока-Пока. И до встречи в следующем
уроке.
Понравилась статья? Поделитесь ею с друзьями:
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.