Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/Чтение и запись произвольных данных на SD карту с использованием часов реального времени

Материал из Онлайн справочника
Перейти к: навигация, поиск

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Чтение и запись произвольных данных на SD карту с использованием часов реального времени

Данный пример демонстрирует чтение и запись произвольных данных на SD-карту с использованием платы Arduino Uno, любой платы расширения(шилд), работающей с SD-картами или MicroSD-картами(Cooking HAcks Micro SD shiled, Arduino Wireless SD shiled, Arduino Ethernet SD shiled, Arduino Wi-Fi SD shield, Adafruit data logging shield, SparkFun MicroSD shield) и любой платы расширения(шилд) RTC.

Необходимые компоненты

Монтажная схема

Соедините выбранную вами плату расширения работающую с SD-картами или MicroSD-картами, плату расширения часов реального времени и плату Arduino Uno.

Для примеры мы взяли Arduino Ethernet SD shiled + Arduino Uno + Плата расширения RTC.

Arduino uno ethernet shield rtc 1.png

Код

  1. #include <SD.h>                                             // Подключаем библиотеку SD для работы с платой расширения, оснащенной SD-слотом
  2. #include <Wire.h>                                           // Подключаем библиотеку Wire для работы с I2C устройствами, в данном случае с платой расширения RTC
  3. #include "RTClib.h"                                         // Подключаем библиотеку RTClib
  4.  
  5. /*
  6. Используемые по умолчанию контакты для библиотеки SD.
  7. Если вы используете Arduino Ethernet SD shiled или любую
  8. другую плату расширения использующую эти контакты,
  9. то ничего менять не надо
  10. MOSI = 11 контакт
  11. MISO = 12 контакт
  12. SCLK = 13 контакт
  13. */
  14.  
  15. #define CS_PIN 10                                           // Контакт выбора
  16.                                                             // Примечание: если вы используете Arduino Ethernet SD shiled
  17.                                                             // необходимо изменить номер контакта на 4.
  18.                                                             // Если ваша плата расширения использует другой контакт
  19.                                                             // вам необходимо его изменить на правильный.    
  20.  
  21.  
  22. int refresh_rate = 5000;                                    // Скорость опроса по умолчанию 5 сек.
  23.  
  24. RTC_DS1307 RTC;                                             // Объявляем RTC объект
  25.  
  26. String year, month, day, hour, minute, second, time, date;  // Объявляем строковые переменный для хранения даты и времени
  27.  
  28. void setup()
  29. {
  30.   Serial.begin(9600);                                       // Инициализация последовательного соединения на скорости 9600 бод
  31.   Serial.println(F("Initializing Card"));                   // Распечатываем в мониторе последовательного порта "Initializing Card"("Инициализация карты")
  32.   pinMode(CS_PIN, OUTPUT);                                  // Определяем CS(контакт выбора) контакт как выход
  33.    
  34.   Wire.begin();                                             // Инициализация шины I2C
  35.   RTC.begin();                                              // Инициализация библиотеки RTC
  36.  
  37.   // Если микросхема RTC не запущена, то записываем данные часов компьютера при компиляции в RTC
  38.   if (! RTC.isrunning())
  39.   {
  40.     Serial.println(F("RTC is NOT running!"));               // Распечатываем в мониторе последовательного порта "RTC is NOT running!"("Микросхема RTC не запущена!")
  41.     RTC.adjust(DateTime(__DATE__, __TIME__));
  42.   }
  43.  
  44.   // Инициализация SD-карты
  45.   if (!SD.begin(CS_PIN))
  46.   {
  47.     Serial.println(F("Card Failure"));                      // Распечатываем в мониторе последовательного порта "Card Failure"("Сбой подключения к SD-карте")
  48.     return;                                                 // Останавливаем выполнение программы
  49.   }
  50.   Serial.println(F("Card Ready"));                          // Распечатываем в мониторе последовательного порта "Card Ready"("Карта готова к работе")
  51.  
  52.   File commandFile = SD.open("speed.txt");
  53.   if (commandFile)
  54.   {
  55.      Serial.println(F("Reading Command File"));              // Распечатываем в мониторе последовательного порта "Reading Command File"("Чтение конфигурационного файла")
  56.  
  57.      while(commandFile.available())
  58.      {
  59.        refresh_rate = commandFile.parseInt();
  60.      }
  61.      Serial.print(F("Refresh Rate = "));                     // Распечатываем в мониторе последовательного порта "Refresh Rate = " ("Частота обновления = ")
  62.      Serial.print(F(refresh_rate));                          // Распечатываем в мониторе последовательного порта значение переменной refresh_rate
  63.      Serial.println(F("ms"));                                // Распечатываем в мониторе последовательного порта "ms"("мс.")
  64.      commandFile.close();                                    // Закрываем файл
  65.   }  
  66.   else
  67.   {
  68.     Serial.println(F("Could not read command file."));       // Распечатываем в мониторе последовательного порта "Could not read command file."("Не удалось прочитать конфигурационный файл")
  69.     return;                                                  // Останавливаем выполнение программы
  70.   }
  71.  
  72.   // Открываем файл и создаем заголовки
  73.   File dataFile = SD.open("log.csv", FILE_WRITE);
  74.   if (dataFile)
  75.   {
  76.     dataFile.println(F("\nNew Log Started!"));
  77.     dataFile.println(F("Date,Time,Phrase"));
  78.     dataFile.close();                                        // Внимание! Данные не будут записаны, пока вы не закроете соединение!
  79.  
  80.     // Распечатываем в мониторе последовательного порта те же данные для отладки
  81.     Serial.println(F("\nNew Log Started!"));                 // Распечатываем в мониторе последовательного порта "\nNew Log Started!"("Новый лог начат")
  82.     Serial.println(F("Date,Time,Phrase"));                   // Распечатываем в мониторе последовательного порта "Date,Time,Phrase"
  83.   }
  84.   else
  85.   {
  86.     Serial.println(F("Couldn't open log file"));             // Распечатываем в мониторе последовательного порта "Couldn't open log file"("Не удалось открыть файл журнала")
  87.   }
  88.  
  89. }
  90.  
  91. void loop()
  92. {
  93.   // Получаем текущую дату и время и сохраняем в строковых переменных
  94.   DateTime datetime = RTC.now();
  95.   year  = String(datetime.year(),  DEC);
  96.   month = String(datetime.month(), DEC);
  97.   day  = String(datetime.day(),  DEC);
  98.   hour  = String(datetime.hour(),  DEC);
  99.   minute = String(datetime.minute(), DEC);
  100.   second = String(datetime.second(), DEC);
  101.  
  102.   // Объединяем строки для получения полной даты и времени
  103.   date = year + "/" + month + "/" + day;
  104.   time = hour + ":" + minute + ":" + second;
  105.  
  106.   String dataString = "Hello World!";
  107.  
  108.   // Открываем файл и записываем в него данные
  109.   File dataFile = SD.open("log.csv", FILE_WRITE);
  110.   if (dataFile)
  111.   {
  112.     dataFile.print(date);
  113.     dataFile.print(F(","));
  114.     dataFile.print(time);
  115.     dataFile.print(F(","));
  116.     dataFile.println(dataString);
  117.     dataFile.close();                                         // Внимание! Данные не будут записаны, пока вы не закроете соединение!
  118.  
  119.     // Распечатываем в мониторе последовательного порта те же данные для отладки
  120.     Serial.print(date);
  121.     Serial.print(F(","));
  122.     Serial.print(time);
  123.     Serial.print(F(","));
  124.     Serial.println(dataString);
  125.   }
  126.   else
  127.   {
  128.     Serial.println(F("Couldn't open log file"));             // Распечатываем в мониторе последовательного порта "Couldn't open log file"("Не удалось открыть файл журнала")  
  129.   }
  130.   delay(refresh_rate);                                       // Задержка длительностью refresh_rate
  131. }

См.также

Внешние ссылки