Arduino: чтение и запись файлов на sd карту

Arduino: чтение и запись файлов на sd карту

Logging Data to an SD Card

Using an SD card, we will create a data logger for the BMP280 connected to an Arduino. Generally, a data logger is an electronic device used to record data from sensors over time and stores it for further use or analysis.

The BMP280 will be connected as I2C and the SD Card as SPI. We will read the elapsed time since the Arduino was started and include this as data in the file as a make-shift time-stamp. This is the bare-bones for a data logging application. Here, we will use a real-time clock module as the timekeeper.

For this tutorial, we will use the I2C 3.3V version. This one, although 3.3V, is 5V compliant on the data pins. For more information on how the BMP280 works, check out our tutorial on Wireless Communication Between Two Arduinos.

BMP280 Pins

Какие операционные системы и каналы связи используют в IoT

Использование операционных систем, как и в случае языков программирования, определяется тем, с какой частью архитектуры вы работаете (но надо понимать, что для уровня микроконтроллеров и встраиваемых устройств операционная система — необязательный компонент).

Во встраиваемых устройствах, шлюзах и микроконтроллерах самым популярным выбором является Linux (в основном урезанные или специфические версии — из «обычных» линуксов более-менее популярен разве что CentOS). Linux — гибкая и свободная ОС, которую можно «доработать напильником» практически под любые нужды, которая умеет запускаться на множестве разных архитектур. Плюс у него огромное сообщество и куча готового софта почти под любые задачи (разве что с Photoshop и Microsoft Office проблемы — но кому они нужны в IoT).

«Для всего, что можно воткнуть в розетку, существует операционная система Linux. В качестве use case может быть определение безопасности закрытия дверей в поезде. Для этого используют обычные компьютеры, которые соединены с датчиками по проводу или с помощью Bluetooth.Чтобы эта система работала, нужно полноценное питание и интернет-соединение. Приложения для умного дома можно писать на чём угодно — в серверных используют файрволы, роутеры и хранилища App Storage для загрузки файлов. Для написания приложений существует множество open-source-проектов, в основном построенных на PHP».

Иван Игнатьев, Cloud Solution Architect из Pluto Informatics

За Linux следует FreeRTOS — операционка реального времени, созданная специально под микроконтроллеры. А значит, она умеет экономно использовать даже самые скромные ресурсы. Особенность систем реального времени — они заранее гарантируют, что задача будет выполнена в конкретные сроки

То есть работают максимально предсказуемо, что особенно важно для обработки критических запросов в военной или космической промышленности, а также везде, где от точной до миллисекунды обработки задачи зависят жизни людей или работоспособность дорогостоящего оборудования. Кстати, Linux так не умеет

На третьем месте с большим отрывом — Windows. Все мы работали с терминалами оплаты или банкоматами, в которых нередко используется именно система от Microsoft. Это закрытая и гораздо менее гибкая система, и подходит она только для тех устройств, в которых достаточно много свободных ресурсов.

На четвёртом месте Zephyr — ещё одна свободная операционка реального времени, созданная специально для работы со встраиваемыми устройствами и микроконтроллерами.


Операционные системы для шлюзов и встраиваемых устройств. Из исследования Eclipse FoundationИнфографика: Eclipse Foundation

А вот на серверах и в облаках ситуация отличается — хотя в рейтинге всё так же присутствуют Linux (лидирует с большим отрывом) и Windows. Кроме того, достаточно популярен майкрософтовский вариант Linux — Azure Sphere. Неудивительно — на ней строится Azure, а это один из лидеров в мире среди облачных платформ. Четвёртое место скромно заняла FreeBSD, ещё одна свободная операционка, которая традиционно считается более надёжной и безопасной, чем Linux.


Операционные системы для серверов и облаков, популярные в IoT. Из исследования Eclipse FoundationИнфографика: Eclipse Foundation

Среди каналов связи, конечно же, лидирует классический Ethernet — проводной, надёжный, стабильный и предсказуемый. Он обеспечивает самые большие скорости и может быть почти «бесплатным» с точки зрения энергопотребления.

Из беспроводных технологий наибольшей популярностью пользуется Wi-Fi — его можно развернуть относительно дёшево, не нужно использовать базовые станции, привязанные к операторам связи, у него отличная скорость, и он может покрывать относительно неплохое расстояние.

Чуть менее популярны сети сотовой связи. Их плюс — они уже есть на куче смартфонов, могут обеспечить хорошую зону покрытия и работают на больших расстояниях. То есть удобны там, где нет проводов, а Wi-Fi просто «не добивает».

Bluetooth на четвёртом месте — у него достаточно низкая скорость передачи данных, он не так стабилен в работе, и у него серьёзные ограничения по расстоянию между устройствами. Зато он экономнее в потреблении электроэнергии, чем Wi-Fi и сотовые сети связи.


Технологии связи, популярные в IoT. Из исследования Eclipse FoundationИнфографика: Eclipse Foundation

Чтение из файла, хранящегося на SD-карте

Вы также можете использовать библиотеку SD-карты для чтения файла. Однако по сравнению со стандартными функциями C доступные методы довольно ограничены. Я обнаружил, что в библиотеке SD-карт часто возникают проблемы с поиском файлов в папках. В следующем примере (в папке SD_read в zip-файле) показано, как можно прочитать значение из файла, который содержит показания датчика.

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

Адаптеры/модули SD-карт могут быть полезны, если вы хотите оставить проект без присмотра и заставить его создавать файлы журнала или сохранять большое количество показаний датчиков в течение более длительного периода времени

Однако, важно понимать, что чтение файлов с SD-карты не всегда работает должным образом. Ниже вы можете скачать архив с программами, которые были также приведены выше:

SD и microSD карты могут существенно расширить возможности проектов ардуино, работающих с большими объемами данных: регистраторов данных, метеостанций, систем умного дома. Платы arduino оснащены сравнительно небольшой внутренней памятью, всего до 4 килобайт, включая и флэш-память, и EEPROM. Этой памяти не хватит для записи больших объемов данных, тем более, если плата будет постоянно выключаться или выключаться. Подключение SD карты ардуино в качестве внешнего накопителя позволяет многократно увеличить место для хранения любой информации. Съемные накопители SD стоят дешево, легко подключаются и удобны в использовании. О правильном подключении SD карты к Arduino и пойдет речь в статье.

Configuration File

If you would rather not use the serial terminal for modifying the settings on your OpenLog, you can also update the settings by modifying the CONFIG.TXT file.

Note: This feature only functions on firmware verison 1.6 or newer. If you have bought an OpenLog after 2012, you will be running firmware version 1.6+

To do this, you will need a microSD card reader and a text editor. Open up the config.txt file (the capitalization of the file name does not matter), and configure away! If you have never powered up your OpenLog with the SD card before, you can also manually create the file. If you have powered up the OpenLog with the microSD card inserted previously, you should see something like the following when you read the microSD card.

The OpenLog creates a config.txt and LOG0000.txt file on first power up.

The default configuration file has one line of settings and one line of definitions.

Default configuration file written by the OpenLog.

Note that these are regular visible characters (there are no non-visible or binary values), and each value is separated by a comma.

The settings are defined as follows:

  • : The communication baud rate. 9600bps is default. Acceptable values that are compatible with the Arduino IDE are 2400, 4800, 9600, 19200, 38400, 57600, and 115200. You can use other baud rates, but you will be unable to communicate with the OpenLog through the Arduino IDE serial monitor.

  • : The ASCII value (in decimal format) of the escape character. 26 is and is default. 36 is and is a commonly used escape character.

  • : The number of escape characters required. By default, it is three, so you must hit the escape character three times to drop to command mode. Acceptable values are from 0 to 254. Setting this value to will disable escape character checking completely.

  • : System mode. OpenLog starts in New Log mode() by default. Acceptable values are =New Log, = Sequential Log, = Command Mode.

  • : Verbose mode. Extended (verbose) error messages are turned on by default. Setting this to turns on verbose error messages (such as ). Setting this to turns off verbose errors but will respond with a if there is an error. Turning off verbose mode is handy if you are trying to handle errors from an embedded system.

  • : Echo mode. While in command mode, characters are echoed by default. Setting this to turns off character echo. Turning this off is handy if handling errors and you don’t want sent commands being echoed back to the OpenLog.

  • : Emergency Override. Normally, OpenLog will emergency reset when the RX pin is pulled low during power up. Setting this to will disable the checking of the RX pin during power up. This can be helpful for systems that will hold the RX line low for various reasons. If Emergency Override is disabled, you will not be able to force the unit back to 9600bps, and the configuration file will be the only way to modify the baud rate.

Arduino SD card распиновка, характеристики

micro SD Arduino характеристики

  • Напряжение питания: 5 В или 3.3 В
  • Потребляемый ток: от 0.2 мА до 200 мА
  • Поддержка карт: micro SD, micro SDHC
  • Интерфейс: SPI
  • Габариты: 42мм х 24мм х 12мм

Модуль подключается к Arduino через интерфейс SPI, для этого вам понадобятся контакты SCK, MISO, MOSI и CS. Платы Arduino Uno и Nano имеют выделенные контакты для шины SPI, плата Mega 2560 имеет порты SPI на других контактах. Вы можете использовать любой свободный пин Ардуино для контакта CS и указать изменение в программе. По умолчанию используются контакты микроконтроллеров, перечисленных в таблице ниже.

Log Intervals

There are a few quirks to squeezing as many measurements as you can out of the OpenLog and the Micro:bit when using MakeCode. If you want to squeeze as many data points as possible out of every second, then you need to turn your baud rate up to 115200. The baud rate on the Micro:bit and Openlog need to match. To change the baud rate on the Openlog, open your SD card on a pc, and open the config.txt file. This file controls the configuration of the OpenLog. Change the 9600 baud rate to 115200, save the file, and reboot your Openlog once its reinserted. That’s all there is to it!

We noticed a considerable increase in readings per second with the higher baud rate (no surprise!). I also found that if I included running time in microseconds I got more entries per second. It seems that the more data you save per entry the more frequently the entries are saved. This is evident by the average entries per second nearly doubling after the microsecond and millisecond values have climbed up pretty high. This is unusual and is likely caused by something going on behind the scenes within MakeCode, luckily, it’s easy to work around, just save a lot of bytes! Here is a summary of the intervals with different settings:

Using a radio to transmit to another Micro:bit:4 entries per second

OpenLog at 9600 baud:8-12 entries per second

OpenLog at 9600 baud with running time in microseconds included:10-15 entries per second

Openlog at 115200 baud:10-15 entries per second

Opendlog at 115200 baud with running time in microseconds included:15-30 entries per second

When logging for very long periods of time, it’s important to note that the running time values will reach a maximum number, then switch to negative and countdown. This is important to keep your log from being filled up by microseconds alone. If you are going to leave your device logging for a long time, you should put in a formula that calculates, minutes/hours/days for you so it’s easier to determine when things occurred on your timestamp.

We tested let this program run for an hour, and the log file was only 2,349 KB. We are using a 16GB card, so we could continuously log our sensor data for 283 days before running out of memory!

Скетч для Ардуино записи на SD карту данных

#include "SPI.h"
#include "SD.h"

File myFile;

const int chipSelect = 4;    

void setup() {
   Serial.begin(9600);
   pinMode(SS, OUTPUT);

   while (!SD.begin(SPI_HALF_SPEED, chipSelect)) {
     Serial.println("initialization failed");
   }
 
   myFile = SD.open("test.txt", FILE_WRITE);

   if (myFile) {
      Serial.println("Writing to test.txt");
      myFile.println("testing 1, 2, 3");
      myFile.close();
   }

   else { Serial.println("error opening test.txt"); }

   myFile = SD.open("test.txt");

   if (myFile) {
      Serial.println("\ntest.txt:");
      while (myFile.available()) {
         Serial.write(myFile.read());
      }
      myFile.close();
   }

   else { Serial.println("error opening test.txt"); }
}

void loop() {
}

Следующий код позволяет вывести на монитор порта информацию о размере файла test.txt из предыдущего примера и всей информации, которая была в него записана

Обратите внимание, что имя файла на SD-карте не должно содержать более 8 символов (латинских букв), не включая расширение файла. Библиотека SD.h не чувствительна к регистру в имени файла, то есть «TEST.txt» и «test.txt» — это один и тот же файл

Где и как учиться?

Создавать шедевры с нуля не получиться. Здесь необходимы знания, опыт и практика. Но где их взять? Существует несколько путей. Первоначально можно самостоятельно выискивать нужную информацию в мировой сети. Можно записать на курсы программирования (дистанционные или очные) для получения базовых навыков работы. Каждый подход имеет свои преимущества. Так, дистанционные курсы программирования будут более дешевыми, а может и бесплатными. Но если что-то не будет получаться, то при очных занятиях опытный разработчик сможет быстрее найти причину проблемы. Также не лишним будет ознакомиться с литературой, что находится в свободном доступе. Конечно, на одних книгах выехать не получится, но получить базовые знания про устройство, программирование на «СИ», «Ассемблере» и о других рабочих моментах можно.

Другие полезные функции

Есть и другие полезные функции для работы с SD картой. Некоторые из них мы приведем ниже:

  • Если вы хотите проверить наличие файла на носителе, используйте функцию SD.exists(«имя_файла.txt»), которая вернет значение true или false.
  • Удалить файл можно с помощью функции SD.remove(«имя_файла.txt»). Но будьте аккуратны! Файл удалиться полностью. Никакой «корзины» или резервной копии для восстановления не останется.
  • Создать подпапку можно с помощью функции SD.mkdir(«/имя_новой_папки»). Очень удобно для структуризации ваших данных на начальном уровне. Если папка с таким именем уже существует, ничего не произойдет. Не забывайте, что вы можете воспользоваться функцией SD.exists() перед созданием папки для проверки.

Несколько полезных функций для работы с файлами:

  • Для перемещения указателя при считывании/записи файла, используется функция seek(). Например, запись функции в виде seek(0) переместит вас в начало файла.
  • Функция position() позволит вам узнать, где именно вы находитесь в пределах файла на данный момент.
  • Функция size() выведет вам информацию о размере файла в байтах.
  • Узнать, является ли файл на карте директорией можно вызвав функцию isDirectory().
  • Последовательная работа с файлами, которые находятся в папке реализуется с помощью вызова функции openNextFile().
  • Возможно, вам понадобится имя файла. Например, если вы вызвали следующий файл в папке с помощью openNextFile(). В этом случае можно воспользоваться функцией name(), которая вернет массив символьных данных, которые можно отобразить непосредственно в серийном мониторе Arduino IDE с помощью Serial.print().

Displaying Bitmap images on TFT LCD from micro SD card module.

After setting up the micro SD card module for use with Arduino, we can now be able to store data like images in the sd card and display them on a TFT LCD screen. The best images to display are bitmap images so make sure you convert your images to bitmap format before storing them into the SD card. You can use an online image convertor.

Another important aspect you should keep in mind when converting your images is the size of the images. This depends on the size of the screen you are using, for example am using a 128×128 pixels screen therefore my images should be that size. Also make sure the images don’t exceed 60kb so that the can easily be processed by the microcontroller to be displayed on the TFT screen.

The setup of components and connections for the various pins of the Arduino, TFT LCD and SD card module are done as shown below.

I have included a button on pin 2 which is going to be used as a switch for changing the images displayed on the TFT screen.

Troyka контакты

Контакты шины SPI:

  • сигнальный () — подключите к пину микроконтроллера. MOSI (Master Out Slave In) — линия для передачи данных от ведущего устройства «Master» (микроконтроллера) к ведомому устройству «Slave» (microSD-карте);
  • сигнальный () — подключите к пину микроконтроллера. MISO (Master In Slave Out) — линия для передачи данных от ведомого устройства «Slave» (microSD-карты) к ведущему устройству «Master» (микроконтроллеру);
  • сигнальный () — подключите к пину микроконтроллера. SCK (Serial Clock) — тактовые импульсы, генерируемые ведущим устройством «Master» (микроконтроллером) для синхронизации процесса передачи данных.

Контакты питания:

  • земля () — соедините с землёй микроконтроллера;
  • питание () — соедините с питанием микроконтроллера;
  • сигнальный () — подключите к цифровому пину микроконтроллера. SS (Slave Select) — вывод, присутствующий на каждом ведомом устройстве. Он предназначен для активизации Мастером того или иного периферийного устройства.

Периферийное устройство (Slave) взаимодействует с ведущим (Master) тогда, когда на выводе присутствует низкий уровень сигнала. В противном случае данные от Master-устройства будут игнорироваться. Такая архитектура позволяет взаимодействовать с несколькими SPI-устройствами, подключенными к одной и той же шине: , и .

Introduction

Heads up! This tutorial is for the Open Log for serial UART . If you are using the Qwiic OpenLog for I2C , please refer to the Qwiic OpenLog Hookup Guide.

The OpenLog Data Logger is a simple-to-use, open-source solution for logging serial data from your projects. The OpenLog provides a simple serial interface to log data from a project to a microSD card.

added to your cart!

DEV-13712

$16.95

22

91

added to your cart!

DEV-13955

$17.50

3

8

Materials Required

In order to fully work through this tutorial, you will need the following parts. You may not need everything though depending on what you have. Add it to your cart, read through the guide, and adjust the cart as necessary.

Recommended Reading

If you are not familiar or comfortable with the following concepts, we recommend reading through these before continuing on with the OpenLog Hookup Guide.

Serial Terminal Basics

This tutorial will show you how to communicate with your serial devices using a variety of terminal emulator applications.

47

Исходный код программы (скетча)

Arduino

#include <SD.h>
const int chipSelect = 10;
File myFile;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
// wait for Serial Monitor to connect. Needed for native USB port boards only:
while (!Serial);
check_and_create_file();
write_text();
}
void loop() {
// nothing happens after setup finishes.
}
void check_and_create_file()
{
Serial.print(«Initializing SD card…»);

/*Проверяем существует ли SD карта или нет*/
if (!SD.begin(chipSelect)) {
Serial.println(«initialization failed!»);
while (1);
}
Serial.println(«initialization done.»);
if (SD.exists(«data_log.txt»))
Serial.println(«data_log.txt exists.»);
else
{
Serial.println(«data_log.txt doesn’t exist.»);
/* открываем новый файл и немедленно закрываем его –
таким образом создастся новый файл */
Serial.println(«Creating data_log.txt…»);
myFile = SD.open(«data_log.txt», FILE_WRITE);
myFile.close();

/*Снова проверяем существует ли файл на SD карте или нет */
if (SD.exists(«data_log.txt»))
Serial.println(«data_log.txt exists.»);
else
Serial.println(«data_log.txt doesn’t exist.»);
}
}

void write_text()
{
myFile = SD.open(«data_log.txt», FILE_WRITE);
// если файл корректно открылся, записываем в него текст
if (myFile) {
Serial.print(«Writing to data_log.txt…»);
myFile.println(«testing 1, 2, 3.»);
// закрываем файл:
myFile.close();
Serial.println(«done.»);
} else {
// если файл не открылся, выводим сообщение об ошибке:
Serial.println(«error opening data_log.txt»);
}

// заново открываем файл для чтения:
myFile = SD.open(«data_log.txt»);
if (myFile) {
Serial.println(«data_log.txt:»);

// считываем из файла всю информацию до тех пор пока не достигнем конца файла
// и передаем эту информацию в последовательный порт связи
read from the file until there’s nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// закрываем файл:
myFile.close();
} else {
// если файл не открылся выводим сообщение об ошибке:
Serial.println(«error opening data_log.txt»);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

#include <SD.h>

constintchipSelect=10;

FilemyFile;

voidsetup(){

// Open serial communications and wait for port to open:

Serial.begin(9600);

// wait for Serial Monitor to connect. Needed for native USB port boards only:

while(!Serial);

check_and_create_file();

write_text();

}

voidloop(){

// nothing happens after setup finishes.

}

voidcheck_and_create_file()

{

Serial.print(«Initializing SD card…»);

/*Проверяем существует ли SD карта или нет*/

if(!SD.begin(chipSelect)){

Serial.println(«initialization failed!»);

while(1);

}

Serial.println(«initialization done.»);

if(SD.exists(«data_log.txt»))

Serial.println(«data_log.txt exists.»);

else

{

Serial.println(«data_log.txt doesn’t exist.»);

/* открываем новый файл и немедленно закрываем его –

     таким образом создастся новый файл */

Serial.println(«Creating data_log.txt…»);

myFile=SD.open(«data_log.txt»,FILE_WRITE);

myFile.close();

/*Снова проверяем существует ли файл на SD карте или нет */

if(SD.exists(«data_log.txt»))

Serial.println(«data_log.txt exists.»);

else

Serial.println(«data_log.txt doesn’t exist.»);

}

}
 

voidwrite_text()

{

myFile=SD.open(«data_log.txt»,FILE_WRITE);

// если файл корректно открылся, записываем в него текст

if(myFile){

Serial.print(«Writing to data_log.txt…»);

myFile.println(«testing 1, 2, 3.»);

// закрываем файл:

myFile.close();

Serial.println(«done.»);

}else{

// если файл не открылся, выводим сообщение об ошибке:

Serial.println(«error opening data_log.txt»);

}

// заново открываем файл для чтения:

myFile=SD.open(«data_log.txt»);

if(myFile){

Serial.println(«data_log.txt:»);

// считываем из файла всю информацию до тех пор пока не достигнем конца файла

// и передаем эту информацию в последовательный порт связи

readfromthefileuntilthere’snothingelseinit

while(myFile.available()){

Serial.write(myFile.read());

}

// закрываем файл:

myFile.close();

}else{

// если файл не открылся выводим сообщение об ошибке:

Serial.println(«error opening data_log.txt»);

}

}

Понравилась статья? Поделиться с друзьями:
Зинг-Электро
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: