Запись данных на sd карту ардуино в excel

Инженеры и разработчики всегда полагаются на собранные данные для проектирования или улучшения системы. Запись данных и их анализ является обычной практикой в большинстве отраслей промышленности и в этой статье мы рассмотрим проект регистратора данных на основе платы Arduino (Arduino Data Logger), в котором мы будем регистрировать (записывать) данные через определенные интервалы времени. В этом проекте плата Arduino будет считывать определенные данные (температура, влажность, дата и время) и сохранять их на SD-карте и компьютере одновременно.

Внешний вид логгера данных на Arduino

Сохраненные данные затем можно будет легко открыть в листе Excel для дальнейшего анализа. Для получения информации о дате и времени мы будем использовать хорошо известный модуль часов реального времени DS3231 RTC (RTC — англ. Real Time Clock), а для измерения температуры и влажности – датчик DHT11.

В конце работы над проектом вы узнаете:
1. Как записать на SD-карту данные даты и времени, а также значения с датчиков.
2. Как записать данные непосредственно в лист Excel на компьютер с помощью последовательной связи.

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

  1. Плата Arduino Uno (купить на AliExpress) (или любая другая).
  2. Датчик температуры и влажности DHT11 (купить на AliExpress).
  3. Модуль часов реального времени DS3231 RTC (купить на AliExpress).
  4. Модуль для чтения SD карт (купить на AliExpress).
  5. SD карта.
  6. Макетная плата.
  7. Соединительные провода.
  8. Компьютер/ноутбук.

Внешний вид датчика температуры и влажности DHT11

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема логгера данных на ArduinoКак можно видеть, соединения на схеме достаточно простые и перечислены в следующих таблицах:

контакт 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 мы должны сделать следующие вещи:

  1. Считывать данные с датчика DTH11 (или с любого другого датчика, данные с которого мы хотим регистрировать).
  2. Инициализировать шину I2C чтобы считывать данные от часов реального времени (RTC module).
  3. Инициализировать шину SPI чтобы подключить модуль чтения SD карт к плате Arduino.
  4. Сохранить дату, время, температуру и влажность на SD карту.
  5. Сохранить дату, время, температуру и влажность в лист Excel на компьютере.

Все перечисленные вещи легко осуществить когда мы скачаем необходимые библиотеки для Arduino, которые будут делать всю работу за нас. Скачать их можно по следующим ссылкам:

  1. DHT11 Sensor Library (библиотека для работы с датчиком температуры и влажности) с GitHub.
  2. 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 файл на вашем компьютере. Мы выбрали этот плагин исходя из следующих причин:

  1. Вы можете записывать и просматривать данные одновременно, также их можно построить в виде графа.
  2. С использованием данного плагина у вас нет необходимости задействовать модуль часов реального времени 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 чтобы получить следующий экран.

Получение необходимого листа в ExcelШаг 3: Выберите бодовую скорость “9600” на том последовательном порту, к которому подключена плата Arduino и нажмите на Connect. Ваши данные должны начать записываться как показано на следующем рисунке.

Выбор скорости передачи данных

Вы можете оставить этот лист Excel открытым и смотреть как записываются данные. Те же самые данные в это же время записываются и на SD карту. Чтобы проверить это извлеките SD карту из собранного устройства и вставьте ее в ваш компьютер. Вы должны найти на ней файл “LoggerCD.txt”. Когда вы откроете его, он будет выглядеть примерно так, как показано на следующем рисунке:

Вид сохраненных данных на SD карте

Но в таком виде их трудно будет анализировать. Поэтому мы можем открыть этот файл в Excel в формате CSV (Comma separated values – данные, разделенные запятыми) чтобы сделать анализ этот данных более удобным. Чтобы открыть его в Excel выполните следующую последовательность действий:

  1. Откройте Excel. Кликните на File->Open и выберите “All file” в правом нижнем углу, затем выберите файл “LoggerCD” на вашей SD карте. Запустится мастер импорта текста.
  2. Кликните на “Next” и выберите запятую (comma) в качестве разделителя. Кликните на “Next” снова, затем на Finish.
  3. После этого ваши данные будут открыты в Excel файле как показано на следующем рисунке:

Вид сохраненных данных в 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.

arduino data logger with sd card schematic

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.

rtc and sd card connections

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;

  • How to to use a Micro SD Card module with Arduino.
  • DS3231 RTC module Interfacing with Arduino.
  • How to use the LM35 temperature sensor with Arduino.
  • Light Dependent Resistor with Arduino.
  • How to use a potentiometer with Arduino.

    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.

  • Using PLX-DAX with Arduino.

    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.

    data analysis using excel and plx-dax

    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.

    logged data 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

    logged data excel spreadsheet

    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

    Регистратор данных — это электронное устройство или прибор, который записывает данные в течение некоторого периода. Это устройство позволяет записывать данные с меткой о времени или местоположении, которые можно будет посмотреть позже или в реальном времени.

    Регистратор данных на базе Arduino

    Независимо от природы и типа записываемых данных, регистратор обычно состоит из двух главных частей: сенсорный блок и блок хранения или передачи данных.

    Сенсорный блок может включать в себя как внешние измерительные средства, так и датчики, встроенные в устройство.

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

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

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

    Регистратор данных на базе Arduino

    В этом руководстве мы займёмся созданием регистратора на основе платформы Arduino, который каждые несколько минут считывает показатели температуры окружающей среды и сохраняет их на карте MicroSD.

    В проекте используются плата Arduino Nano и модуль DS3231, который содержит часы реального времени и датчик температуры.

    Регистратор данных на базе Arduino

    Для проекта нам понадобятся следующие компоненты:

    Схема сборки модуля регистратора данных

    Соедините элементы, как показано на нижеследующей схеме, созданной с помощью программы Fritzing (полный обзор программы по ссылке).

    Регистратор данных состоит из платы Arduino Nano, модуля часов реального времени DS3231 и модуля для карты MicroSD. Модуль карты MicroSD обменивается данными с платой Arduino через интерфейс SPI, а модуль DS3231 — через интерфейс I²C. Подробное руководство для модуля DS3231 можно найти здесь.

    Для удобства ниже приведены схемы соединения выводов платы и модулей.

    Регистратор данных на базе Arduino

    Соединение выводов платы 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 записей (см. рисунок ниже).

    Регистратор данных на базе Arduino

    Просмотр записанных данных в Excel

    ПО Excel значительно облегчает построение диаграмм и анализ данных.

    Для построения графика зависимости температуры от времени откройте новую электронную таблицу, в меню «Данные» (Data) выберите пункт «Из текста» (From text), выберите файл на карте SD и нажмите «Импорт» (кнопка OK). ПО Excel запросит подробную информацию о файле.

    Выберите вариант «с разделителями»(delimited), а далее — «запятая» (by commas), после чего будет автоматически произведён импорт данных в таблицу.

    Регистратор данных на базе Arduino

    Чтобы построить график на основе импортированных данных, выберите две колонки времени и температуры (удерживая кнопку Ctrl), затем перейдите на вкладку «Вставка» (Insert) и нажмите «График» (Insert chart). Вы должны увидеть график как на рисунке.

    Регистратор данных на базе Arduino

    На этом всё на сегодня. Надеюсь, вы узнали что-то полезное из этой статьи. Как обычно, вы можете свободно задавать вопросы и внести свой вклад в раскрытие темы в разделе комментариев под статьёй.

    Вольтик — это слаженная команда амбициозных и заядлых инженеров. Мы создали этот проект с целью вовлечения вас, талантливых и начинающих профессионалов, в увлекательный мир мейкерской микроэлектроники!

    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.

    Arduino SD Card Module

    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.

    Arduino SD Card Module Circuit Schematics Tutorial

    Note that each Arduino Board have different SPI pins which should be connected accordingly.

    Arduino SPI Pins List

    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.

    SD Card Serial Monitor Results

    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.

    SD Card File Text txt

    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.

    Arduino Data Logging to Excel

    That’s all for this tutorial, feel free to ask any question in the comments section below.

    Понравилась статья? Поделить с друзьями:
  • Запись данных в таблицы word
  • Запись данных в excel файл python
  • Запись данных в excel python pandas
  • Запись в ячейки миф excel
  • Запись в ячейке excel не менялась