Объем энергонезависимой памяти EEPROM в Arduino небольшой. И как же хранить больш ой объем данных без потери при перезагрузке? Для решения этой задачи на помощь приходит SD карта .
Arduino без проблем может создавать, удалять файлы, а также записывать данные в файлы. Об этом я рассказывал в предыдущих уроках:
#13.1.Arduino SD карта. Создаем, удаляем файлы.Чтение, запись файлов.
Урок 13.3 Arduino строим графики по данным c sd карты.
Для
данного
урока
нам понадоб
ятся:
1. Arduino UNO или Arduino NANO
2. Модуль SD карты .
3. Беспаечная макетная плата .
Подключаем 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 или другой отладочной платой с большим объемом динамической памяти.
Понравилась статья? Поделитесь ею с друзьями:
Вернуться в раздел: Уроки Arduino: Подключение датчиков и модулей к Arduino Дата публикации 7 ноября , 2019
Читайте также
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.