#13.4 Считывание данных с SD карты, и сохранение их как «переменные»

.#13.4 Считывание данных с SD карты, и сохранение их как «переменные»

Объем энергонезависимой памяти EEPROM в Arduino небольшой. И как же хранить больш ой объем данных без потери при перезагрузке? Для решения этой задачи на помощь приходит SD карта .

Arduino без проблем может создавать, удалять файлы, а также записывать данные в файлы. Об этом я рассказывал в предыдущих уроках:

#13.1.Arduino SD карта. Создаем, удаляем файлы.Чтение, запись файлов.

Урок 13.3 Arduino строим графики по данным c sd карты.

Arduino без проблем может создавать, удалять файлы, а также записывать данные в файлы.

Для данного урока нам понадоб ятся:

1. Arduino UNO или Arduino NANO

2. Модуль SD карты .

3. Беспаечная макетная плата .

4. Соединительные провода .

Подключаем SD-модуль к Arduino UNO по такой схеме.

Подключаем SD-модуль к Arduino UNO по такой схеме.

Для начала работы подготовим файл с данными , которые будут считывать Arduino. Так как я уже писал в комментариях в группе ВК, что можно создать расписание будильника. Давайте это и сделаем: расписание будильника на неделю .

    7,20;
    7,00;
    7,20;
    6,40;
    7,00;
    9,00;
    9,00;

Я использую символы: точка запятой - это конец строки, и запятая - это разделитель между значениями (разделители можно использовать любые).

Назовем файл config.txt. Установим карту памяти в SD-модуль.

Назовем файл 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];

Сейчас мы можем оперировать нашим расписанием.

Для обработки большего количества данных вы можете воспользоваться, например, Arduino MEGA

Давайте выведем в монитор порта наше расписание. Для этого напишем вот такой небольшой цикл:

  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.

Всем Пока-Пока. И до встречи в следующем уроке.

Понравилась статья? Поделитесь ею с друзьями:

Вернуться в раздел: Уроки Arduino: Подключение датчиков и модулей к Arduino Дата публикации 7 ноября , 2019

Комментарии

Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.


Cлучайные товары

Посмотреть товар в Магазине »

Мы в соц сетях

Подпишись на канал Telegram

Portal-PK (Портал ПК) © 2015 - 2024
Разработка проектов
AT Block
DWIN Box