Инженеры и разработчики всегда полагаются на собранные данные для проектирования или улучшения системы. Запись данных и их анализ является обычной практикой в большинстве отраслей промышленности и в этой статье мы рассмотрим проект регистратора данных на основе платы Arduino (Arduino Data Logger), в котором мы будем регистрировать (записывать) данные через определенные интервалы времени. В этом проекте плата Arduino будет считывать определенные данные (температура, влажность, дата и время) и сохранять их на SD-карте и компьютере одновременно.
Сохраненные данные затем можно будет легко открыть в листе Excel для дальнейшего анализа. Для получения информации о дате и времени мы будем использовать хорошо известный модуль часов реального времени DS3231 RTC (RTC — англ. Real Time Clock), а для измерения температуры и влажности – датчик DHT11.
В конце работы над проектом вы узнаете:
1. Как записать на SD-карту данные даты и времени, а также значения с датчиков.
2. Как записать данные непосредственно в лист Excel на компьютер с помощью последовательной связи.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress) (или любая другая).
- Датчик температуры и влажности DHT11 (купить на AliExpress).
- Модуль часов реального времени DS3231 RTC (купить на AliExpress).
- Модуль для чтения SD карт (купить на AliExpress).
- SD карта.
- Макетная плата.
- Соединительные провода.
- Компьютер/ноутбук.
Работа схемы
Схема устройства представлена на следующем рисунке.
Как можно видеть, соединения на схеме достаточно простые и перечислены в следующих таблицах:
контакт Arduino | контакт датчика температуры и влажности DHT11 |
Vcc | 5V |
Gnd | Gnd |
Nc | Nc |
Pin 7 | Out |
контакт Arduino | контакт DS3231 RTC |
5V | Vcc |
Gnd | Gnd |
Pin A5 | SCL |
Pin A4 | SDA |
контакт Arduino | контакт модуля для чтения SD карт |
5V | Vcc |
Gnd | Gnd |
Pin 12 | MISO |
Pin 11 | MOSI |
Pin 13 | SCK |
CS | CS |
Вы можете заменить датчик DHT11 в схеме на любой другой аналогичный, например, LM35. Модуль RTC DS3231 подключается к плате Arduino по протоколу I2C (SCL, SDA), а модуль чтения SD карт – по протоколу SPI (MISO, MOSI, SCK, CS). Контакты 4 и 7 платы Arduino подключаются к контактам CS и Out модуля чтения SD карт и датчика DHT11 соответственно, при желании вы их можете сменить на любые другие контакты. Ранее подключение модуля чтения SD карт к плате Arduino мы рассматривали в проекте аудиоплеера на Arduino.
В программе для Arduino мы должны сделать следующие вещи:
- Считывать данные с датчика DTH11 (или с любого другого датчика, данные с которого мы хотим регистрировать).
- Инициализировать шину I2C чтобы считывать данные от часов реального времени (RTC module).
- Инициализировать шину SPI чтобы подключить модуль чтения SD карт к плате Arduino.
- Сохранить дату, время, температуру и влажность на SD карту.
- Сохранить дату, время, температуру и влажность в лист Excel на компьютере.
Все перечисленные вещи легко осуществить когда мы скачаем необходимые библиотеки для Arduino, которые будут делать всю работу за нас. Скачать их можно по следующим ссылкам:
- DHT11 Sensor Library (библиотека для работы с датчиком температуры и влажности) с GitHub.
- DS3231 RTC module library (библиотека для работы с часами реального времени) с Rinky-Dink Electronics.
Когда вы скачаете эти библиотеки, добавьте их в вашу Arduino IDE с помощью инструкции вида (или с помощью аналогичного пункта меню в Arduino IDE):
Sketch->Include Library -> Add .ZIP Library
Чтобы передавать данные с Arduino в лист Excel на вашем компьютере установите программное обеспечение под названием PLX-DAQ, разработанное компанией Parallax Inc. Скачайте его по приведенной ссылке и установите его на ваш компьютер. В результате этой операции на вашем компьютере должна появиться папка с названием PLS-DAQ.
После того как вы скачали и установили обе приведенные библиотеки и программное обеспечение PLX-DAQ вы можете загружать полный код программы (приведенный в конце статьи) в плату Arduino и тестировать его работу. Здесь же мы обсудим работу наиболее важных участков этого кода.
1. Чтение данных с модуля DS3231
DS3231 представляет собой модуль часов реального времени (RTC, Real Time Clock). Он используется для поддержания/хранения даты и времени во многих электронных проектах. Модуль имеет свой собственный источник питания (батарейку), поэтому сохраняет значения даты и времени даже когда питание всего устройства (в котором он стоит) выключается или когда устройство подвергается аппаратному сбросу. Поэтому стоит нам один раз выставить в нем правильную дату и время и он будет хранить/поддерживать их все время (до тех пор пока не разрядится его батарейка).
Работать с этим модулем очень просто благодаря специальной библиотеке, присутствующей в Arduino.
// инициализируем модуль DS3231 используя аппаратный интерфейс DS3231 rtc(SDA, SCL); void Initialize_RTC() { // инициализируем rtc объект rtc.begin(); //#### следующие строки необходимо извлечь из комментариев чтобы установить дату и время в модуле в первый раз### /* rtc.setDOW(FRIDAY); // устанавливаем день недели rtc.setTime(18, 46, 45); // устанавливаем время 12:00:00 (24hr format) rtc.setDate(6, 30, 2017); // устанавливаем дату – 1 января 2014 года */ } |
Примечание: когда вы используете этот модуль в первый раз вы должны установить в нем дату и время. Для этого раскоментарьте (снимите комментарий) со строк, приведенных выше (установите в них необходимые вам дату и время). После этого снова поставьте комментарии к этим строкам и заново загрузите программу в плату Arduino иначе (если вы оставите их раскомментированными), то каждый раз при запуске программы в модуль будут записываться эти дата и время. Также вы можете использовать модуль часов реального времени RTC IC DS1307 для считывания времени в плату Arduino.
2. Считывание данных с датчика DHT11
DHT11 представляет собой датчик температуры и влажности. Он передает значения температуры и влажности по 8 бит последовательно через свой выходной контакт. С помощью библиотеки мы считываем эти данные в Arduino в последовательном формате.
#define DHT11_PIN 7 //выход датчика подсоединен к контакту 7 dht DHT; //даем имя датчику — DHT void Read_DHT11() { int chk = DHT.read11(DHT11_PIN); } |
В данном проекте мы подключили выходной контакт датчика DHT11 к контакту 7 платы Arduino, однако вы можете использовать любой другой контакт, поддерживаемый библиотекой последовательной связи (Software Serial Library). Функция DHT.read(pin number); считывает значения температуры и влажности и сохраняет их в переменных DHT.temperature и DHT.Humidity соответственно. Более подробно об этом вы можете прочитать в статье про подключение датчика DHT11 к плате Arduino.
3. Инициализация модуля чтения SD карт
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void Initialize_SDcard() { // смотрим на месте ли карта и можно ли ее инициализировать if (!SD.begin(chipSelect)) { Serial.println(«Card failed, or not present»); // больше ничего не делаем поскольку работа с картой невозможна return; } // открываем файл. Примечание: только один файл может быть открыт в один момент времени // поэтому вам необходимо закрыть этот файл перед тем как открывать следующий File dataFile = SD.open(«LoggerCD.txt», FILE_WRITE); // если файл доступен, записываем в него if (dataFile) { dataFile.println(«Date,Time,Temperature,Humidity»); //записываем первую строку excel файла dataFile.close(); } } |
Работа с SD картами так проста потому что в Arduino IDE по умолчанию присутствует библиотека для работы с SD картами. В рассмотренной функции инициализации SD карты мы создали текстовый файл с именем “LoggerCD.txt” и записали туда первую строку нашего контента (содержимого). Мы будем разделять данные с помощью символа “,” – запятая будет выступать в качестве разделителя. То есть запятая будет обозначать переход к следующей ячейке в листе Excel.
4. Запись данных на SD карту
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 |
void Write_SDcard() { // открываем файл. Примечание: только один файл может быть открыт в один момент времени // поэтому вам необходимо закрыть этот файл перед тем как открывать следующий File dataFile = SD.open(«LoggerCD.txt», FILE_WRITE); // если файл доступен, записываем в него if (dataFile) { dataFile.print(rtc.getDateStr()); //сохраняем дату на SD карту dataFile.print(«,»); //переходим к следующей ячейке (столбцу) с помощью «,» dataFile.print(rtc.getTimeStr()); // сохраняем время на SD карту dataFile.print(«,»); //переходим к следующей ячейке (столбцу) с помощью «,» dataFile.print(DHT.temperature); // сохраняем температуру на SD карту dataFile.print(«,»); //переходим к следующей ячейке (столбцу) с помощью «,» dataFile.print(DHT.humidity); // сохраняем влажность на SD карту dataFile.print(«,»); //переходим к следующей ячейке (столбцу) с помощью «,» dataFile.println(); //конец строки, переходим к следующей строке dataFile.close(); //закрываем файл } else Serial.println(«OOPS!! SD card writing failed»); } |
Мы сохраняем значения даты, времени, температуры и влажности на SD карту с помощью библиотек для DS3231 и DHT11. Операторы (переменные) для получения этих данных представлены в следующей таблице:
Date (дата) | rtc.getDateStr()); |
Time (время) | rtc.getTimeStr()); |
Temperature (температура) | DHT.temperature |
Humidity (влажность) | DHT.humidity |
Для сохранения этих данных на SD карту мы используем оператор вида:
dataFile.print(parameter); |
Вы могли заметить что каждый параметр разделяется с помощью запятой чтобы сделать его удобочитаемым, а функция dataFile.println(); используется для обозначения конца строки.
5. Запись данных в PLX-DAQ
PLX-DAQ представляет собой специальный плагин для приложения Microsoft Excel, который помогает нам записывать данные от Arduino непосредственно в Excel файл на вашем компьютере. Мы выбрали этот плагин исходя из следующих причин:
- Вы можете записывать и просматривать данные одновременно, также их можно построить в виде графа.
- С использованием данного плагина у вас нет необходимости задействовать модуль часов реального времени DS3231 чтобы отслеживать дату и время – в этом случае вы можете непосредственно считывать их из вашего компьютера и сохранять их в Excel.
Для использования данного плагина вы с помощью Arduino должны передавать данные последовательно по специальному образцу (подобно отображению данных в окне монитора последовательной связи).
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 |
void Initialize_PlxDaq() { Serial.println(«CLEARDATA»); //очищаем все данные оставшиеся от предыдущих проектов Serial.println(«LABEL,Date,Time,Temperature,Humidity»); //всегда записывайте LABEL, чтобы индицировать что это первая строка } void Write_PlxDaq() { Serial.print(«DATA»); //всегда записывайте «DATA» чтобы индицировать что будете записывать данные Serial.print(«,»); //переход к следующей ячейке (столбцу) с использованием «,» Serial.print(«DATE»); //сохраняем данные в Excel Serial.print(«,»); // переход к следующей ячейке (столбцу) с использованием «,» Serial.print(«TIME»); // сохраняем данные в Excel Serial.print(«,»); // переход к следующей ячейке (столбцу) с использованием «,» Serial.print(DHT.temperature); // сохраняем данные в Excel Serial.print(«,»); // переход к следующей ячейке (столбцу) с использованием «,» Serial.print(DHT.humidity); // сохраняем данные в Excel Serial.print(«,»); // переход к следующей ячейке (столбцу) с использованием «,» Serial.println(); //конец строки, переходим к следующей строке } |
Программа PLX_DAQ может распознавать такие слова как LABEL, DATA, TIME, DATE и т.д. Как показано в приведенном фрагменте кода мы используем слово “LABEL” чтобы начать первую строку на листе Excel. Далее мы используем слово “DATA” чтобы дать понять программе что затем мы будем передавать ей данные. Для перехода к следующему столбцу мы используем запятую (“,”). Для обозначения конца строки мы используем Serial.println();.
Для получения данных о дате и времени с вашего компьютера мы используем слова “DATE” и “TIME”.
Примечание: не используйте монитор последовательной связи во время использования программного обеспечения PLX_DAQ.
Объяснение работы проекта
Работа нашего регистратора данных (логгера) на Arduino достаточно проста. После того как вы соберете всю схему и загрузите программу в плату Arduino значения даты, времени, температуры и влажности начнут сохраняться в файл на SD карте. Для того, чтобы задействовать PLX-DAQ для записи данных в лист Excel на вашем компьютере, вы должны выполнить следующую последовательность действий.
Шаг 1: Откройте файл “Plx-Daq Spreadsheet” который был создан на вашем рабочем столе во время установки этого программного обеспечения.
Шаг 2: Если Excel показывает вам ограничение на запись данных, то кликните Options->Enable the content -> Finish -> OK чтобы получить следующий экран.
Шаг 3: Выберите бодовую скорость “9600” на том последовательном порту, к которому подключена плата Arduino и нажмите на Connect. Ваши данные должны начать записываться как показано на следующем рисунке.
Вы можете оставить этот лист Excel открытым и смотреть как записываются данные. Те же самые данные в это же время записываются и на SD карту. Чтобы проверить это извлеките SD карту из собранного устройства и вставьте ее в ваш компьютер. Вы должны найти на ней файл “LoggerCD.txt”. Когда вы откроете его, он будет выглядеть примерно так, как показано на следующем рисунке:
Но в таком виде их трудно будет анализировать. Поэтому мы можем открыть этот файл в Excel в формате CSV (Comma separated values – данные, разделенные запятыми) чтобы сделать анализ этот данных более удобным. Чтобы открыть его в Excel выполните следующую последовательность действий:
- Откройте Excel. Кликните на File->Open и выберите “All file” в правом нижнем углу, затем выберите файл “LoggerCD” на вашей SD карте. Запустится мастер импорта текста.
- Кликните на “Next” и выберите запятую (comma) в качестве разделителя. Кликните на “Next” снова, затем на Finish.
- После этого ваши данные будут открыты в Excel файле как показано на следующем рисунке:
В этом проекте мы записываем данные каждые 5 секунд – но вы можете изменить это время на любое необходимое вам внеся небольшие изменения в программу.
Беспроводная регистрация данных (лог) с помощью Arduino
Если у вас все получилось, то вы можете внести ряд усовершенствований в этот проект. Просто подсоедините к плате Arduino Bluetooth устройство (например, модуль HC-05) и передавайте данные в программу PLX-DAQ при помощи технологии Bluetooth, а не по последовательному порту. В этом случае в программе вам необходимо заменить Serial.print(parameter); на BluetoothName.print(parameter); и соединить ваш компьютер/лэптоп к HC-05 по Bluetooth – для этого необходимо будет выбрать COM порт, к которому подсоединен Bluetooth на вашем компьютере/лэптопе. И все – ваш беспроводной логгер (регистратор) данных на основе Arduino будет готов.
Исходный код программы
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
/* * Program to demonstrate Data Logging/Visualisation using Arduino * * ###Connection with SD card module### * Vcc->5V * Gnd->Gnd * MISO->pin 12 * MOSI->pin 11 * SCK-> pin 13 * CS-> pin 4 * * ###Connection with DS3231### * Vcc->5V * Gns->Gnd * SCL->pin A5 * SDA-> pin A4 * * ###Connection with DT11### * Vcc->5V * Gnd->Gnd * Out-> pin 7 * * */ #include <DS3231.h> //Library for RTC module (Download from Link in article) #include <SPI.h> //Library for SPI communication (Pre-Loaded into Arduino) #include <SD.h> //Library for SD card (Pre-Loaded into Arduino) #include <dht.h> //Library for dht11 Temperature and Humidity sensor (Download from Link in article) #define DHT11_PIN 7 //Sensor output pin is connected to pin 7 dht DHT; //Sensor object named as DHT const int chipSelect = 4; //SD card CS pin connected to pin 4 of Arduino // Init the DS3231 using the hardware interface DS3231 rtc(SDA, SCL); void setup() { // Setup Serial connection Serial.begin(9600); Initialize_SDcard(); Initialize_RTC(); Initialize_PlxDaq(); } void loop() { Read_DHT11(); Write_SDcard(); Write_PlxDaq(); delay(5000); //Wait for 5 seconds before writing the next data } void Write_PlxDaq() { Serial.print(«DATA»); //always write «DATA» to Indicate the following as Data Serial.print(«,»); //Move to next column using a «,» Serial.print(«DATE»); //Store date on Excel Serial.print(«,»); //Move to next column using a «,» Serial.print(«TIME»); //Store date on Excel Serial.print(«,»); //Move to next column using a «,» Serial.print(DHT.temperature); //Store date on Excel Serial.print(«,»); //Move to next column using a «,» Serial.print(DHT.humidity); //Store date on Excel Serial.print(«,»); //Move to next column using a «,» Serial.println(); //End of Row move to next row } void Initialize_PlxDaq() { Serial.println(«CLEARDATA»); //clears up any data left from previous projects Serial.println(«LABEL,Date,Time,Temperature,Humidity»); //always write LABEL, to indicate it as first line } void Write_SDcard() { // open the file. note that only one file can be open at a time, // so you have to close this one before opening another. File dataFile = SD.open(«LoggerCD.txt», FILE_WRITE); // if the file is available, write to it: if (dataFile) { dataFile.print(rtc.getDateStr()); //Store date on SD card dataFile.print(«,»); //Move to next column using a «,» dataFile.print(rtc.getTimeStr()); //Store date on SD card dataFile.print(«,»); //Move to next column using a «,» dataFile.print(DHT.temperature); //Store date on SD card dataFile.print(«,»); //Move to next column using a «,» dataFile.print(DHT.humidity); //Store date on SD card dataFile.print(«,»); //Move to next column using a «,» dataFile.println(); //End of Row move to next row dataFile.close(); //Close the file } else Serial.println(«OOPS!! SD card writing failed»); } void Initialize_SDcard() { // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println(«Card failed, or not present»); // don’t do anything more: return; } // open the file. note that only one file can be open at a time, // so you have to close this one before opening another. File dataFile = SD.open(«LoggerCD.txt», FILE_WRITE); // if the file is available, write to it: if (dataFile) { dataFile.println(«Date,Time,Temperature,Humidity»); //Write the first row of the excel file dataFile.close(); } } void Initialize_RTC() { // Initialize the rtc object rtc.begin(); //#### The following lines can be uncommented to set the date and time for the first time### /* rtc.setDOW(FRIDAY); // Set Day-of-Week to SUNDAY rtc.setTime(18, 46, 45); // Set the time to 12:00:00 (24hr format) rtc.setDate(6, 30, 2017); // Set the date to January 1st, 2014 */ } void Read_DHT11() { int chk = DHT.read11(DHT11_PIN); } /*void Read_DateTime() { // Send date Serial.print(rtc.getDateStr()); Serial.print(» — «); // Send time Serial.println(rtc.getTimeStr()); }*/ /*void Read_TempHum() { Serial.print(«Temperature = «); Serial.println(DHT.temperature); Serial.print(«Humidity = «); Serial.println(DHT.humidity); // delay(1000); }*/ |
Видео, демонстрирующее работу логгера данных
Загрузка…
12 949 просмотров
Data logging is very important in projects involving collection, analysis and interpretation of data. For example if we know the temperature, humidity, pressure and other weather conditions of a given area over a given period of time, we can easily plan for different seasons and prepare for any disasters if they are to occur.
In this tutorial I want to show you how make a simple Arduino based Data logger using a micro SD card and how we can also do real time data analysis using Microsoft Excel with the help of the PLX-DAX tool.
This data logger is going to save the date, time, temperature, light intensity and an analog reading on a micro SD card. At the same time I will also be able to observe this data on an Excel spreadsheet on my computer through serial communication with the help of the PLX-DAX tool.
Setting up of the Arduino Data logger with SD Card.
The data logger consists of a DS3231 RTC module, a light dependent resistor, LM35 temperature sensor, a potentiometer and a micro SD card module all attached to Arduino as shown below.
The connections for the DS3231 RTC and SD Card modules to Arduino can be a bit confusing so I will simplify them using the table below.
The DS3231 RTC module is interfaced with Arduino using the I2C communication (SCL, SDA). The SD card module works with standard micro SD cards whose operating voltage is 3.3 V. However the module has a voltage regulator and a level shifter which enables it to use the 5V pins of the Arduino board.
The SD Card Module have six pins, two for powering the module, the VCC and the GND pins, and four more pins for the SPI communication (MISO, MOSI, SCK, CS). I have used pin 10 as the ChipSelect (CS) pin but this can be changed to any other available digital pin.
The potentiometer, light dependent resistor and LM35 temperature sensor signal pins are connected to analog pins A0, A1 and A2 respectively. These devices give outputs in analog form which are converted using Arduino’s in built ADC to the required parameters like temperature and light intensity.
If you are not very familiar with the working of sensors and modules with Arduino you can make reference from my previous posts using these links;
Code for running the Data logger
To use the SD card with Arduino we need to have the SD.h and SPI.h libraries which are part of the Arduino IDE by default.
#include <DS3231.h>
#include <SPI.h>
#include <SD.h>
int temp_sensor = A2;
int ldr_sensor = A1;
int pot = A0;
File dataFile;
float temperature;
int light_percentage;
int pot_percentage;
const int chipSelect = 10; //SD card CS pin connected to pin 10 of Arduino
// Init the DS3231 using the hardware interface
DS3231 rtc(SDA, SCL);
void setup()
{
rtc.begin();
Serial.begin(9600);
// setup for the SD card
Serial.print("Initializing SD card...");
if(!SD.begin(chipSelect)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
//open file
dataFile = SD.open("LOGDATA.txt", FILE_WRITE);
// if the file opened ok, write to it:
if (dataFile) {
Serial.println("File opened ok");
// print the headings for our data
dataFile.println("Date,Time,Temperature,Light Intensity%,POT%");
}
dataFile.close();
Serial.println("CLEARDATA"); //clears up any data left from previous projects
Serial.println("LABEL,Date,Logging Time,Time,Temperature,Light Intensity %, POT %"); //always write LABEL, to indicate it as first line
Serial.println("RESETTIMER");
}
void loop()
{
int temp_sensor_val = analogRead(temp_sensor);
int ldr_sensor_val = analogRead(ldr_sensor);
int pot_val = analogRead(pot);
int light_percentage = map(ldr_sensor_val, 0, 1023, 0, 100);
int pot_percentage = map(pot_val, 0,
1023, 0, 100);
float millivolts = (temp_sensor_val / 1024.0) * 5000;
float temperature = millivolts / 10; // temperature in degrees celcius
dataFile = SD.open("LOGDATA.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.print(rtc.getDateStr()); //Store date on SD card
dataFile.print(","); //Move to next column using a ","
dataFile.print(rtc.getTimeStr()); //Store date on SD card
dataFile.print(","); //Move to next column using a ","
dataFile.print(temperature);
//Store date on SD card
dataFile.print(","); //Move to next column using a ","
dataFile.print(light_percentage); //Store date on SD card
dataFile.print(","); //Move to next column using a ","
dataFile.print(pot_percentage); //Store date on SD card
dataFile.print(","); //Move to next column using a ","
dataFile.println(); //End of Row move to next row
dataFile.close(); //Close the file
}
else
Serial.println("OOPS!! SD card writing failed");
//write to plx-dax
Serial.print("DATA, DATE, TIMER, TIME,"); //always write "DATA" to Indicate the following as Data
Serial.print(temperature); //Store date on Excel
Serial.print(","); //Move to next column using a ","
Serial.print(light_percentage); //Store date on Excel
Serial.print(","); //Move to next column using a ","
Serial.print(pot_percentage); //Store date on Excel
Serial.print(","); //Move to next column using a ","
Serial.println(); //End of Row move to next row
delay(3000); //Wait for 3 seconds before writing the next data
}
First, we need to create a ‘File’ object. Then we initialize the SD card by using the SD.open()
function to create a new text file named “LOGDATA.txt”, including the FILE_WRITE argument meaning that we can both read and write to the file. The content to enter in the first row is also written in initializing the SD card.
i).The file name you choose to use must be of the 8.3 format, that is, the part before the dot must be a maximum 8 character string and “.txt” is the 3 character extension. Writing to the SD card will not be possible if you use a file name longer than this format.
ii). If the file already exists the SD.open() function will just open it.
Writing Data to SD card
The DS3231 RTC module gives us the time and date and the other sensors we attached to the Arduino can provide us with temperature and light intensity values. These parameters can be stored in the SD card using the line dataFile.print();
The end of a row is given by dataFile.println();
When saving the values in the SD card, each parameter is separated the by a comma “,” which acts as a delimiter. This is very important when it comes to entering the data in an Excel sheet as will be seen later on.
Connecting Arduino to PLX-DAQ
The PLX-DAX software is a Microsoft Excel add-on tool that enables us to write values from Arduino to Excel in real time via serial communication with a computer. This makes it easy to write and analyze the incoming data.
When using PLX-DAX with Arduino there is no need for using the DS3231 RTC module to keep track of date and time. The tool makes it possible to use the date and time running on your computer and save them directly in Excel.
I have explained the working of PLX-DAX with Arduino in detail in a previous tutorial. If you want to know more about the functions and keywords used in coding for this interfacing you can check out the post using the link below.
Note: Do not use serial monitor when using PLX_DAQ software.
How the Arduino Data Logger using SD card works
After uploading the code into the Arduino board, data logging will begin and the date, time, temperature, light intensity and percentage of potentiometer values will be stored on the SD card.
At the same time you can open the PLX-DAX Excel spreadsheet on your computer and observe the values being logged in real time. You can even do some analysis of the values like shown below.
Getting Data from the SD card
The SD card can be removed from the SD card module after logging data for a required period of time and the data can be accessed from a computer. In my case I can find the data from the text file I named ‘LOGDATA.txt’ which can be opened using any text editor like notepad.
In order to analyze this data we need to open it in Excel as a CSV (Comma Separated Value) file. To do this open Excel ;
1. Click on, Data > From Text. Then select the “LOGDATA.txt” file from the SD card. This will open a Text Import Wizard.
2. Click on “Next” and select comma as a delimiter. Click on “Next” again. Then Finish.
3. Now your values will be opened in a Excel file as shown below
The way the values are displayed in Excel corresponds to the way they were written in the SD card. From the notepad file, every comma denotes move to the next column. After entering the data in the Excel spreadsheet you can then do analysis using the different capabilities of Microsoft excel.
Регистратор данных — это электронное устройство или прибор, который записывает данные в течение некоторого периода. Это устройство позволяет записывать данные с меткой о времени или местоположении, которые можно будет посмотреть позже или в реальном времени.
Независимо от природы и типа записываемых данных, регистратор обычно состоит из двух главных частей: сенсорный блок и блок хранения или передачи данных.
Сенсорный блок может включать в себя как внешние измерительные средства, так и датчики, встроенные в устройство.
Всё чаще (но всё же не всегда) устройства регистрации строят на основе микропроцессоров и микроконтроллеров, которые позволили вывести сбор и хранение данных на новый уровень.
Независимо от природы и типа записываемых данных, регистратор обычно состоит из двух главных частей: сенсорный блок и блок хранения или передачи данных. Сенсорный блок может включать в себя как внешние измерительные средства, так и датчики, встроенные в устройство.
Всё чаще (но всё же не всегда) устройства регистрации строят на основе микропроцессоров и микроконтроллеров, которые позволили вывести сбор и хранение данных на новый уровень.
В этом руководстве мы займёмся созданием регистратора на основе платформы Arduino, который каждые несколько минут считывает показатели температуры окружающей среды и сохраняет их на карте MicroSD.
В проекте используются плата Arduino Nano и модуль DS3231, который содержит часы реального времени и датчик температуры.
Для проекта нам понадобятся следующие компоненты:
Схема сборки модуля регистратора данных
Соедините элементы, как показано на нижеследующей схеме, созданной с помощью программы Fritzing (полный обзор программы по ссылке).
Регистратор данных состоит из платы Arduino Nano, модуля часов реального времени DS3231 и модуля для карты MicroSD. Модуль карты MicroSD обменивается данными с платой Arduino через интерфейс SPI, а модуль DS3231 — через интерфейс I²C. Подробное руководство для модуля DS3231 можно найти здесь.
Для удобства ниже приведены схемы соединения выводов платы и модулей.
Соединение выводов платы Arduino и модуля MicroSD:
SD | Arduino |
GND | GND |
VCC | VCC |
MISO | D12 |
MOSI | D11 |
SCK | D13 |
CS | D10 |
Соединение выводов платы Arduino и модуля DS32316:
DS3231 | Arduino |
VCC | 5 В |
GND | GND |
SDA | A4 |
SCL | A5 |
После подключения всех элементов, мы можем приступить к написанию кода для этого проекта.
Код для модуля регистратора данных
Перед тем как приступить к написанию кода, важно ясно понимать, какими функциями вы хотите его наделить. В рамках этого проекта мы станем измерять температуру и сохранять в текстовом файле на карте SD эти данные и (через запятую) время их получения.
Целью будет извлечение карты спустя некоторое время, копирование данных на компьютер и импорт их в таблицу Microsoft Excel, чтобы составить диаграмму и произвести анализ данных.
Как обычно, первое, что мы делаем в нашем коде, это включаем библиотеки, которые будем использовать. В этом проекте мы используем библиотеку rtc_ds3231, которая доступна по ссылке, а также библиотеки, включаемые заголовочными файлами wire.h, SD.h и SPI.h.
///////////////////////////////////////////////////////////////// // Arduino Simple Data Logger v1.03 // // Get the latest version of the code here: // // http://educ8s.tv/arduino-data-logger-project // ///////////////////////////////////////////////////////////////// #include «Wire.h» #include «ds3231.h» #include «SD.h» #include «SPI.h» |
Далее мы объявляем переменные. Вначале определяем максимальный размер буфера BUFF_MAX, равный 128, затем определяем вывод платы Arduino (вывод D10), который будет подключен к выводу Chipselect (CS, выбор микросхемы) карты SD. Затем создаём объект файла, объявляем переменные для хранения температуры, времени и даты и объявляем целочисленную переменную для идентификатора элементов данных.
#define BUFF_MAX 128 int CS_PIN = 10; File file; String temperature; String timeString; String dateString; int entryId = 0; |
Объявляем массив для хранения времени и устанавливаем время (в миллисекундах), которое устройство должно прождать перед тем, как регистрировать следующие данные. Это может пригодиться, кроме всего прочего, для экономии заряда батареи во время долгой автономной работы.
uint8_t time[8]; char recv[BUFF_MAX]; unsigned int recv_size = 0; unsigned long prev, interval = 1000; |
Далее переходим к этапу запуска. Сначала запускаем последовательный интерфейс SPI и шину I²C, после чего инициализируем модуль для карты SD и модуль DS3231.
void setup() { Serial.begin(9600); Wire.begin(); initializeSD(); DS3231_init(DS3231_INTCN); memset(recv, 0, BUFF_MAX); |
Затем при первом запуске программы нам будет необходимо установить время. Следующая строка кода используется для установки времени. Оно вводится в следующем порядке:
T”секунды””минуты””часы””день_недели””день_месяца””месяц””год”.
parse_cmd(«T302410426032015»,16); //Set time} |
Обратите внимание, что кавычки для каждого элемента не включаются, они приведены только для описания.
После первого запуска программы, строка должны быть закомментирована перед загрузкой для развёртывания системы.
После запуска переходим к функции loop(). Эта главная функция, которая содержит команды для получения температуры и даты и для их сохранения на карте SD.
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 |
void loop() { String logEntry; char in; char buff[BUFF_MAX]; unsigned long now = millis(); // Log data once in a while if ((now — prev > interval) && (Serial.available() <= 0)) { getTime(); getTemperature(); logEntry = createLogEntry(); writeEntryToFile(logEntry); prev = now; } if (Serial.available() > 0) { in = Serial.read(); if ((in == 10 || in == 13) && (recv_size > 0)) { parse_cmd(recv, recv_size); recv_size = 0; recv[0] = 0; } else if (in < 48 || in > 122) {; // ignore ~[0-9A-Za-z] } else if (recv_size > BUFF_MAX — 2) { // drop lines that are too long // drop recv_size = 0; recv[0] = 0; } else if (recv_size < BUFF_MAX — 2) { recv[recv_size] = in; recv[recv_size + 1] = 0; recv_size += 1; } } } |
Остальные функции, содержащиеся в коде, мы вызываем из этой главной функции loop().
Полный код для проекта можно скачать по ссылке.
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 |
///////////////////////////////////////////////////////////////// // Arduino Simple Data Logger v1.03 // // Get the latest version of the code here: // // http://educ8s.tv/arduino-data-logger-project // ///////////////////////////////////////////////////////////////// #include #include «ds3231.h» #include #include #define BUFF_MAX 128 int CS_PIN = 10; File file; String temperature; String timeString; String dateString; int entryId = 0; uint8_t time[8]; char recv[BUFF_MAX]; unsigned int recv_size = 0; unsigned long prev, interval = 1000; void setup() { Serial.begin(9600); Wire.begin(); initializeSD(); DS3231_init(DS3231_INTCN); memset(recv, 0, BUFF_MAX); //parse_cmd(«T302410426032015»,16); //Set time } void loop() { String logEntry; char in; char buff[BUFF_MAX]; unsigned long now = millis(); // Log data once in a while if ((now — prev > interval) && (Serial.available() <= 0)) { getTime(); getTemperature(); logEntry = createLogEntry(); writeEntryToFile(logEntry); prev = now; } if (Serial.available() > 0) { in = Serial.read(); if ((in == 10 || in == 13) && (recv_size > 0)) { parse_cmd(recv, recv_size); recv_size = 0; recv[0] = 0; } else if (in < 48 || in > 122) {; // ignore ~[0-9A-Za-z] } else if (recv_size > BUFF_MAX — 2) { // drop lines that are too long // drop recv_size = 0; recv[0] = 0; } else if (recv_size < BUFF_MAX — 2) { recv[recv_size] = in; recv[recv_size + 1] = 0; recv_size += 1; } } } void parse_cmd(char *cmd, int cmdsize) { uint8_t i; uint8_t reg_val; char buff[BUFF_MAX]; struct ts t; // TssmmhhWDDMMYYYY aka set time if (cmd[0] == 84 && cmdsize == 16) { //T355720619112011 t.sec = inp2toi(cmd, 1); t.min = inp2toi(cmd, 3); t.hour = inp2toi(cmd, 5); t.wday = inp2toi(cmd, 7); t.mday = inp2toi(cmd, 8); t.mon = inp2toi(cmd, 10); t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14); DS3231_set(t); //Serial.println(«OK»); } else if (cmd[0] == 49 && cmdsize == 1) { // «1» get alarm 1 DS3231_get_a1(&buff[0], 59); //Serial.println(buff); } else if (cmd[0] == 50 && cmdsize == 1) { // «2» get alarm 1 DS3231_get_a2(&buff[0], 59); // Serial.println(buff); } else if (cmd[0] == 51 && cmdsize == 1) { // «3» get aging register //Serial.print(«aging reg is «); //Serial.println(DS3231_get_aging(), DEC); } else if (cmd[0] == 65 && cmdsize == 9) { // «A» set alarm 1 DS3231_set_creg(DS3231_INTCN | DS3231_A1IE); //ASSMMHHDD for (i = 0; i < 4; i++) { time[i] = (cmd[2 * i + 1] — 48) * 10 + cmd[2 * i + 2] — 48; // ss, mm, hh, dd } byte flags[5] = { 0, 0, 0, 0, 0 }; DS3231_set_a1(time[0], time[1], time[2], time[3], flags); DS3231_get_a1(&buff[0], 59); // Serial.println(buff); } else if (cmd[0] == 66 && cmdsize == 7) { // «B» Set Alarm 2 DS3231_set_creg(DS3231_INTCN | DS3231_A2IE); //BMMHHDD for (i = 0; i < 4; i++) { time[i] = (cmd[2 * i + 1] — 48) * 10 + cmd[2 * i + 2] — 48; // mm, hh, dd } byte flags[5] = { 0, 0, 0, 0 }; DS3231_set_a2(time[0], time[1], time[2], flags); DS3231_get_a2(&buff[0], 59); //Serial.println(buff); } else if (cmd[0] == 67 && cmdsize == 1) { // «C» — get temperature register //Serial.print(«temperature reg is «); //Serial.println(DS3231_get_treg(), DEC); } else if (cmd[0] == 68 && cmdsize == 1) { // «D» — reset status register alarm flags reg_val = DS3231_get_sreg(); reg_val &= B11111100; DS3231_set_sreg(reg_val); } else if (cmd[0] == 70 && cmdsize == 1) { // «F» — custom fct reg_val = DS3231_get_addr(0x5); // Serial.print(«orig «); //Serial.print(reg_val,DEC); //Serial.print(«month is «); //Serial.println(bcdtodec(reg_val & 0x1F),DEC); } else if (cmd[0] == 71 && cmdsize == 1) { // «G» — set aging status register DS3231_set_aging(0); } } void getTemperature() { parse_cmd(«C»,1); temperature = String(DS3231_get_treg()); } void getTime() { String minute; String hour; struct ts t; DS3231_get(&t); if(t.min<10) { minute = «0»+String(t.min); }else { minute = String(t.min); } timeString = String(t.hour)+«:»+minute; dateString = String(t.mon)+«/»+t.mday; } String createLogEntry() { String logEntry; entryId ++; logEntry = String(entryId)+«,»+dateString+«,»+timeString+«,»+temperature; return logEntry; } void writeEntryToFile(String entry) { openFileToWrite(«log.txt»); Serial.println(entry); writeToFile(entry); closeFile(); } void initializeSD() { pinMode(CS_PIN, OUTPUT); if (SD.begin()) { } else { return; } } int openFileToWrite(char filename[]) { file = SD.open(filename, FILE_WRITE); if (file) { return 1; } else { return 0; } } int writeToFile(String text) { if (file) { file.println(text); return 1; } else { return 0; } } void closeFile() { if (file) { file.close(); } } |
Демонстрация работы регистратора данных
Скопируйте вышеприведённый код в среду Arduino, подключите библиотеки и нажмите кнопку Upload («Загрузить»). Не забудьте установить время, когда будете запускать код в первый раз.
После выполнения всех шагов подождите несколько минут и извлеките карту SD. Если всё сделали верно, вы должны получить на мониторе компьютера при открытии файла на карте примерно то же, что показано на рисунке.
Объём сохранённых данных зависит от того, сколько времени вы отвели на регистрацию данных перед тем как извлечь карту. Например, для этого проекта мы запустили устройство на один день и регистровали данных каждые 5 минут.
По прошествии 24 часов было сделано боле 300 записей (см. рисунок ниже).
Просмотр записанных данных в Excel
ПО Excel значительно облегчает построение диаграмм и анализ данных.
Для построения графика зависимости температуры от времени откройте новую электронную таблицу, в меню «Данные» (Data) выберите пункт «Из текста» (From text), выберите файл на карте SD и нажмите «Импорт» (кнопка OK). ПО Excel запросит подробную информацию о файле.
Выберите вариант «с разделителями»(delimited), а далее — «запятая» (by commas), после чего будет автоматически произведён импорт данных в таблицу.
Чтобы построить график на основе импортированных данных, выберите две колонки времени и температуры (удерживая кнопку Ctrl), затем перейдите на вкладку «Вставка» (Insert) и нажмите «График» (Insert chart). Вы должны увидеть график как на рисунке.
На этом всё на сегодня. Надеюсь, вы узнали что-то полезное из этой статьи. Как обычно, вы можете свободно задавать вопросы и внести свой вклад в раскрытие темы в разделе комментариев под статьёй.
Вольтик — это слаженная команда амбициозных и заядлых инженеров. Мы создали этот проект с целью вовлечения вас, талантливых и начинающих профессионалов, в увлекательный мир мейкерской микроэлектроники!
SD-карта довольно распространённый тип носителя в наше время. Каждый разработчик рано или поздно сталкивается с необходимостью хранить большой объём данных иили использовать для каких-либо долгосрочных целей энергонезависимый носитель информации. На рынке существует огромное множество модулей для подключения SD-карт к Arduino или любому другому микроконтроллеру.
Практическое использование одного из таких модулей с разбором кода и схемотехнике предлагаю рассмотреть вам в этой статье.
На днях мне пришёл заказанный модуль для работы с SD-картами. В этом посте я расскажу, как усовершенствовать, сделанный нами в прошлом, датчик для измерения температуры, а именно – мы избавим себя от надобности копирования данных из консоли вывода в Excel для дальнейшего анализа, заставив Arduino сохранять данные на SD-карту в виде csv-файла. Данные будут записываться в файл в два столбца – в первом будут единицы времени (или просто номер строки), а во втором значение напряжения на термисторе или ином датчике, которое, как Вы помните, пропорционально температуре.
- Необходимые компоненты здесь те же, что и в посте про измеритель температуры
- Модуль для работы с SD-картами
Описывать схему сборки измерителя температуры я не буду, если Вы забыли или не знаете как его собирать – обратитесь к посту, ссылка на который указана выше.
Схема подключения модуля SD-карт к Arduino
Рассмотрим схему подключения SD модуля. Каждый модуль имеет следующие контакты: GND, 5V, 3V (3.3V), CS, MOSI, SCLK (SCK), MISO, GND. Подключим некоторые из этих контактов к следующим контактам Arduino:
- GND – к земле с Arduino;
- 5V разъём к 5 вольтовому разъёму Arduino. (Аналогично 3.3V) Подключать оба разъёма одновременно – бессмысленно, я подключаю только 5V;
- CS – к 4 разъёму;
- MOSI – к 11 разъёму;
- SCLK (SCK) – к 13 разъёму;
- MISO – к 12 разъёму.
На этом наше подключение окончено. Для подключения можете использовать макетную плату – просто втыкаете туда SD модуль и в правильном порядке протягиваете провода от соответствующих дорожек к нужным разъёмам.
SD модуль работает только с SD картами, отформатированными под файловую систему FAT16 или FAT32. Карту необходимо заранее отформатировать на компьютере. БУДЬТЕ ВНИМАТЕЛЬНЫ! При форматировании все данные, находящиеся на носителе, будут уничтожены! Не забудьте переписать их в другое место перед форматированием!
// Подключаем библиотеку для работы с шиной SPI (необходима для работы библиотеки SD) #include <SPI.h> // Подключаем библиотеку для работы с SD-картами #include <SD.h> File myFile; // Задаём начальное время (точку отсчёта) int time = 0; // Указываем номер аналогового разъёма для считывания данны int tempPin = 0; void setup() { // Открываем serial порт Serial.begin(9600); // Выдаём сообщение о том, что начинается инициализация SD-карты Serial.print("Initializing SD card..."); pinMode(10, OUTPUT); // Проверяем готовность SD модуля. Если модуль не готов - выдаём сообщение if (!SD.begin(4)) { Serial.println("initialization failed!"); return; } // Проверяем, существует ли на карте файл data.csv, если существует, то удаляем его. if(SD.exists("data.csv")) { SD.remove("data.csv"); } // Выводим сообщение о том, что инициализация прошла успешно Serial.println("initialization done."); } void loop() { // Считываем данные (напряжение) с нулевого аналогового разъёма. int temp = analogRead(tempPin); // Увеличиваем значение времени (номер строки) на единицу. Если вы будете записывать данные раз в минуту, но хотите чтобы время записывалось в секундах - прибавляйте не единицу, а 60. time = time + 1; // Открываем файл data.csv для записи myFile = SD.open("data.csv", FILE_WRITE); // Если удалось открыть файл для записи, то записываем данные if (myFile) { // Выводим данные на экран Serial.print(time); Serial.print("; "); Serial.println(temp); // Записываем время myFile.print(time); // Добавляем точку с запятой myFile.print(";"); // Добавляем температуру и добавляем перенос строки myFile.println(temp); // закрываем файл myFile.close(); } else { // Выводим сооб щение о том, что открыть файл не удалось Serial.println("error opening data.csv"); } // Повторяем считывание данных с датчика и запись на флэш-карту через одну секунду delay(1000); }
Загружаем наш скетч в Arduino, запускаем консоль (ctrl+shift+M) в среде Arduino и видим на экране каждую секунду две пары значений – номер строки (или же время) и значение напряжение, соответствующее данной температуре. Подождите, например, 10 секунд и отключите питание от Arduino. Извлеките карточку и вставьте её в компьютер. На карте у вас будет файл data.csv, открыв который в Excel вы увидите 2 столбика значений, что и в консоли Arduino. Теперь вы можете построить график или рассчитать среднее значение температуры в вашей комнате за какой-то промежуток времени.
ВНИМАНИЕ! Флэш-память имеет ограниченный ресурс записи, поэтому для увеличения срока жизни флэшки, оптимизируйте количество записей в память. Например, в нашем случае, сделайте массив и таймер. Массив будет хранить, допустим, 10 значений и затем записывать их на флэш, либо когда будет накоплено 10 значений, либо когда таймер отсчитает 1 минуту.Таким образом количество записей во флэш будет уменьшено до 10 раз.
На этом всё, задавайте свои вопросы мне в комментариях к этому посту, до скорых встреч!
In this Arduino Tutorial we will learn how to use an SD Card module with the Arduino Board. Also in combination with the DS3231 Real Time Clock module we will make a data logging example where we will store the data of a temperature sensor to the SD Card and import it into Excel to make a chart out of it. You can watch the following video or read the written tutorial below.
How It Works
First let’s take a look at the SD Card Module. It works with standard MicroSD Cards which operating voltage is 3.3 V. Therefore, the module has a voltage regulator and a level shifter so that we can use it with the 5 V pins of the Arduino Board.
The SD Card Module have six pins, two for powering the module, the VCC and the GND pins, and four more pins for the SPI communication. Here’s how we need to connect it to the Arduino Board.
Note that each Arduino Board have different SPI pins which should be connected accordingly.
You can get the components needed for this Arduino Tutorial from the links below:
- Micro SD Card Module……………….. Amazon / Banggood / AliExpress
- Arduino Board …………………………… Amazon / Banggood / AliExpress
- Breadboard and Jump Wires ……… Amazon / Banggood / AliExpress
Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.
Arduino SD Card Module Code
Next we need to program the Arduino. Here’s a simple code:
/*
* Arduino SD Card Tutorial Example
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <SD.h>
#include <SPI.h>
File myFile;
int pinCS = 53; // Pin 10 on Arduino Uno
void setup() {
Serial.begin(9600);
pinMode(pinCS, OUTPUT);
// SD Card Initialization
if (SD.begin())
{
Serial.println("SD card is ready to use.");
} else
{
Serial.println("SD card initialization failed");
return;
}
// Create/Open file
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.println("Writing to file...");
// Write to file
myFile.println("Testing text 1, 2 ,3...");
myFile.close(); // close the file
Serial.println("Done.");
}
// if the file didn't open, print an error:
else {
Serial.println("error opening test.txt");
}
// Reading the file
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("Read:");
// Reading the whole file
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("error opening test.txt");
}
}
void loop() {
// empty
}
Code language: Arduino (arduino)
Code description: So first we need to include the standard SD and SPI libraries, create a “File” object and define the ChipSelect pin of the SPI bus, the pin 53 in my case for the Arduino Mega Board. For this example we want our code to be executed only once, so all the code will be placed in the “setup” section, while the “loop” section will remain empty.
So first we need to start the serial communication and define the ChipSelect pin as output. We have to do this because the ChipSelect pin needs to be “Low” so that the SPI communication between the module and the Arduino works.
Next, using the SD.begin() function we will initialize the SD card and if initialization is successful the “if” statement will become true and the String “SD card is ready to use.” will be printed on the serial monitor, else the string “SD card initialization failed” will be printed and also the program will be terminated.
Next, using the SD.open() function we will create a new file named “test.txt”, including the FILE_WRITE argument meaning that we can both read and write to the file. If the file already exist the SD.open() function will just open it.
So if the file has been successfully created first we will print the string “Writing to file” on the serial monitor and then using the myFile.println() function we will print the text “Testing text 1, 2 ,3…” into the file. After that we need to use close() function to ensure that the previous data written to the file is physically saved to the SD Card.
Next, we will see how we can read from the file. So again we will the same function, SD.open(), but this time as the file “test.txt” has already been created, the function will just open the file. Then using the myFile.read() function we will read from the file and print it on the serial monitor. The read() function actually reads just one character at a time, so therefore we need to use the “while” loop and the function myFile.available() to read all characters or the whole previously written data. At the end we need to close the file.
Now after uploading the code to the Arduino, if everything is ok, the following will appear on the serial monitor.
As we can see, the SD card has been successfully initialized, the writing to it has been successful as well, and also reading the written data or the string “Testing text 1, 2 ,3…” has been successful read. If we open the SD card on our computer we can see the created “test.txt” file and the written text in it.
Arduino SD Card Data Logging
Now let’s make another more interesting example of data logging a temperature sensor. For that purpose we will use the DS3231 Real Time Clock module which has a built-in temperature sensor as well. You can find more details about how to connect and use this module in my previous tutorial.
So after connecting the two modules to the Arduino let’s take a look at the code for this example.
/*
* Arduino Temperature Data Logging
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <SD.h>
#include <SPI.h>
#include <DS3231.h>
File myFile;
DS3231 rtc(SDA, SCL);
int pinCS = 53; // Pin 10 on Arduino Uno
void setup() {
Serial.begin(9600);
pinMode(pinCS, OUTPUT);
// SD Card Initialization
if (SD.begin())
{
Serial.println("SD card is ready to use.");
} else
{
Serial.println("SD card initialization failed");
return;
}
rtc.begin();
}
void loop() {
Serial.print(rtc.getTimeStr());
Serial.print(",");
Serial.println(int(rtc.getTemp()));
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
myFile.print(rtc.getTimeStr());
myFile.print(",");
myFile.println(int(rtc.getTemp()));
myFile.close(); // close the file
}
// if the file didn't open, print an error:
else {
Serial.println("error opening test.txt");
}
delay(3000);
}
Code language: Arduino (arduino)
Code Description: First we need to include the libraries needed for both modules, then create the two objects and in the setup section initialize them.
In the loop section using the Serial.print() funtion we will print the time and the temperature values on the serial monitor, with a “comma” character between them and a new line after the temperature value. We need this form of the lines so that we can easily import them and make a chart in Excel. Also note that the temperature values are converted into integers.
So these same values will also be written into the newly created “test.txt” file and at the end we just need to add a delay which will represent the interval of recording the temperature data.
After uploading the code the Arduino will start storing the temperature values each 3 seconds.After a while we can open the SD card on our computer to see the results.
For creating a chart in Excel we need to import this file and here’s how we will do that:
From the data menu we need to click “Get Data From Text” button and select the text file. Here we will choose “Delimited” and click next, and in the second step, select the comma as delimiter and then finish the wizard.
So this process will insert the time and the temperature values into separate columns. Now we just need to select both columns and from the insert menu select “Insert line chart”. This will create the chart where we can see the temperature values each 3 seconds.
That’s all for this tutorial, feel free to ask any question in the comments section below.