Регистратор (логгер) данных (температуры, влажности) на SD карту и компьютер с помощью Arduino

Инженеры и разработчики всегда полагаются на собранные данные для проектирования или улучшения системы. Запись данных и их анализ является обычной практикой в большинстве отраслей промышленности и в этой статье мы рассмотрим проект регистратора данных на основе платы 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

В программе для 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.

Примечание: когда вы используете этот модуль в первый раз вы должны установить в нем дату и время. Для этого раскоментарьте (снимите комментарий) со строк, приведенных выше (установите в них необходимые вам дату и время). После этого снова поставьте комментарии к этим строкам и заново загрузите программу в плату Arduino иначе (если вы оставите их раскомментированными), то каждый раз при запуске программы в модуль будут записываться эти дата и время. Также вы можете использовать модуль часов реального времени RTC IC DS1307 для считывания времени в плату Arduino.

2. Считывание данных с датчика DHT11

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

В данном проекте мы подключили выходной контакт датчика DHT11 к контакту 7 платы Arduino, однако вы можете использовать любой другой контакт, поддерживаемый библиотекой последовательной связи (Software Serial Library). Функция DHT.read(pin number); считывает значения температуры и влажности и сохраняет их в переменных DHT.temperature и DHT.Humidity соответственно. Более подробно об этом вы можете прочитать в статье про подключение датчика DHT11 к плате Arduino.

3. Инициализация модуля чтения SD карт

Работа с SD картами так проста потому что в Arduino IDE по умолчанию присутствует библиотека для работы с SD картами. В рассмотренной функции инициализации SD карты мы создали текстовый файл с именем “LoggerCD.txt” и записали туда первую строку нашего контента (содержимого). Мы будем разделять данные с помощью символа “,” – запятая будет выступать в качестве разделителя. То есть запятая будет обозначать переход к следующей ячейке в листе Excel.

4. Запись данных на SD карту

Мы сохраняем значения даты, времени, температуры и влажности на SD карту с помощью библиотек для DS3231 и DHT11. Операторы (переменные) для получения этих данных представлены в следующей таблице:

Date (дата) rtc.getDateStr());
Time (время) rtc.getTimeStr());
Temperature (температура) DHT.temperature
Humidity (влажность) DHT.humidity

Для сохранения этих данных на SD карту мы используем оператор вида:

Вы могли заметить что каждый параметр разделяется с помощью запятой чтобы сделать его удобочитаемым, а функция dataFile.println(); используется для обозначения конца строки.

5. Запись данных в PLX-DAQ

PLX-DAQ представляет собой специальный плагин для приложения Microsoft Excel, который помогает нам записывать данные от Arduino непосредственно в Excel файл на вашем компьютере. Мы выбрали этот плагин исходя из следующих причин:

  1. Вы можете записывать и просматривать данные одновременно, также их можно построить в виде графа.
  2. С использованием данного плагина у вас нет необходимости задействовать модуль часов реального времени DS3231 чтобы отслеживать дату и время – в этом случае вы можете непосредственно считывать их из вашего компьютера и сохранять их в Excel.

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

Программа 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 будет готов.

Исходный код программы

Видео, демонстрирующее работу логгера данных

(Проголосуй первым!)
Загрузка...
2 380 просмотров

Комментарии

Регистратор (логгер) данных (температуры, влажности) на SD карту и компьютер с помощью Arduino — 12 комментариев

  1. Вот скетч. Его написал уважаемый liman324 и поделился со мной.

    // Подключение

    // CD MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
    // 18B20 OUT A1, +5V VCC
    // DS3231 SDA A4, SCL A5, VCC +5V

    #include
    #include
    #include
    #include
    #include
    #include
    OneWire oneWire(A1);
    DallasTemperature t(&oneWire);
    DS3231 clock;
    RTCDateTime DateTime;

    File myFile;
    float temp;
    long nomer;

    void setup() {
    Serial.begin(9600);
    Serial.print("Initializing SD card...");
    if (!SD.begin(4)) {Serial.println(" Error!!!"); return;}
    else{Serial.println(" OK");}// проверка подключения

    t.begin();
    t.setResolution(12);// 12 bit 18b20
    clock.begin();
    // clock.setDateTime(__DATE__, __TIME__);// установка времени DS3231, раскомментировать и залить скетч, далее закомментировать и залить скетч повторно
    }

    void loop() {
    DateTime = clock.getDateTime();
    Serial.print(clock.dateFormat("d-m-Y H:i:s", DateTime));
    Serial.print(" ");
    t.requestTemperatures();
    Serial.println(temp = t.getTempCByIndex(0));//считываем температуру
    delay(5000);// записывать данные на CD каждые 5 сек
    nomer++;

    myFile = SD.open("temp.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае его
    myFile.print(nomer);// запись
    myFile.print(" ");// запись

    myFile.print(DateTime.day/10);myFile.print(DateTime.day%10);myFile.print("-");
    myFile.print(DateTime.month/10);myFile.print(DateTime.month%10);myFile.print("-");
    myFile.print(DateTime.year);myFile.print(" ");

    myFile.print(DateTime.hour/10);myFile.print(DateTime.hour%10);myFile.print("-");
    myFile.print(DateTime.minute/10);myFile.print(DateTime.minute%10);myFile.print("-");
    myFile.print(DateTime.second/10);myFile.print(DateTime.second%10);

    myFile.print(" ");// запись
    myFile.println(temp);// запись
    myFile.close();// закрываем файл
    }

  2. Попробовал закоментировать все, что связанно с DHT11, но переходит на ошибку DS3231 rtc(SDA, SCL);
    Скорей всего надо подбирать библиотеки. На одном сайте мне сообщили, что в новых версиях Arduino IDE, например не корректно работают библиотеки DS3231. Переписали скетч, все заработало. Спасибо , что отозвались. Я нашел скетч логгера, подправил под себя, все работает. Будет время повожусь с этим проектом.

    • Рад, что у вас получилось. Со своей стороны чем мог, тем помог. Если не трудно, не могли бы вы поделиться этим работающим скетчем логгера?

  3. Сейчас в коде выделяет эту строку "dht DHT; //Sensor object named as DHT". В описании ошибок (снизу) такие сообщения :
    Registrator:32:1: error: 'dht' does not name a type
    dht DHT; //Sensor object named as DHT
    ^~~
    C:\Arduino\Registrator\Registrator.ino: In function 'void Write_PlxDaq()':
    Registrator:67:21: error: expected primary-expression before '.' token
    Serial.print(DHT.temperature); //Store date on Excel
    ^
    Registrator:70:21: error: expected primary-expression before '.' token
    Serial.print(DHT.humidity); //Store date on Excel
    ^
    C:\Arduino\Registrator\Registrator.ino: In function 'void Write_SDcard()':
    Registrator:96:23: error: expected primary-expression before '.' token
    dataFile.print(DHT.temperature); //Store date on SD card
    ^
    Registrator:99:23: error: expected primary-expression before '.' token
    dataFile.print(DHT.humidity); //Store date on SD card
    ^
    C:\Arduino\Registrator\Registrator.ino: In function 'void Read_DHT11()':
    Registrator:142:14: error: expected primary-expression before '.' token
    int chk = DHT.read11(DHT11_PIN);
    ^
    exit status 1
    'dht' does not name a type

    • Точно сказать не могу, но есть следующие соображения. Вы говорите что у вас отдельно датчик температуры и влажности работает без проблем, но, на мой взгляд, все ваши ошибки указывают на то, что именно с ним почему то в программе возникает проблема. Попробуйте закомментарить в программе все операции с данным датчиком, а в операциях вывода данных (Serial.print, dataFile.print) замените все данные с датчика (DHT.temperature, DHT.humidity) на произвольные числа. Если программа заработает, то извлекайте из комментариев по 1-2 операции с датчиком и пробуйте снова запускать программу. Меня смущает, что уже при инициализации объекта датчика (dht DHT; //Sensor object named as DHT) у вас уже выдается ошибка. Если в программе он неправильно инициализируется, то все остальные ошибки вполне понятны.

  4. Спасибо, что ответили. Буду рад Вашей помощи, так как только "прикоснулся" к Ардуино) По отдельности все модули я подключал. Все работают правильно (показывают время, показывают температуру и влажность, запись чтение на SD происходит. Значит все библиотеки работают.

    • Я всем стараюсь помогать, но я пока тоже не сильно большой профессионал в Arduino, теоретических знаний достаточно, а вот с практикой проблемы - не хватает времени чтобы плотно этим заниматься

  5. Вот список ошибок.
    C:\Users\ХХХХХ\Documents\Arduino\Registrator\Registrator.ino: In function 'void Write_PlxDaq()':
    Registrator:67:21: error: expected primary-expression before '.' token
    Serial.print(DHT.temperature); //Store date on Excel
    ^
    Registrator:70:21: error: expected primary-expression before '.' token
    Serial.print(DHT.humidity); //Store date on Excel
    ^
    C:\Users\ХХХХХ\Documents\Arduino\Registrator\Registrator.ino: In function 'void Write_SDcard()':
    Registrator:96:23: error: expected primary-expression before '.' token
    dataFile.print(DHT.temperature); //Store date on SD card
    ^
    Registrator:99:23: error: expected primary-expression before '.' token
    dataFile.print(DHT.humidity); //Store date on SD card
    ^
    C:\Users\ХХХХХХ\Documents\Arduino\Registrator\Registrator.ino: In function 'void Read_DHT11()':
    Registrator:142:14: error: expected primary-expression before '.' token
    int chk = DHT.read11(DHT11_PIN);

    • Если сложный проект сразу не получается, то его рекомендуется разбить на ряд более простых. Давайте сначала просто попробуем подключить датчик DHT11 к Ардуино как я вам указал в предыдущем комментарии, а потом уже будем разбираться с этими ошибками.

  6. Здравствуйте. Повторяю Ваш проект. Но из за ошибки не могу продвинутся вперед. Сначала была ошибка в строке "#include " Я в ручную в Arduino IDE подключил библиотеку. Теперь ошибка в другой строке "32:1: error: 'dht' does not name a type, dht DHT; //Sensor object named as DHT". Подскажите пожалуйста как исправить?

    • Здравствуйте, к сожалению проект не мой, а переведен с сайта индийских электронщиков. Весьма талантливые ребята, но, к сожалению, иногда у них встречаются опечатки в программах. Но могу попробовать вам помочь поскольку я перевел уже достаточно много подобных статей. У вас какая библиотека не хотела подключаться? Видимо, движок сайта обрезал часть вашего комментария. Судя по всему, у вас проблемы с взаимодействием с датчиком DHT11. Попробуйте повторить более простой проект работы с данным датчиком, вместо ЖК дисплея в нем можно использовать вывод значений температуры и влажности в окно монитора последовательной связи. Умеете это делать или подсказать? И в строке 32 не должно быть никакой ошибки если у вас эта библиотека для работы с датчиком DHT11 правильно подключена.
      Также можете попробовать следующий код (в нем немного по другому подключается датчик в программе), может быть он у вас заработает:
      #include // подключаем библиотеку для датчика
      DHT dht(2, DHT11); // сообщаем на каком порту будет датчик

      void setup() {
      dht.begin(); // запускаем датчик DHT11
      Serial.begin(9600); // подключаем монитор порта
      }

      void loop() {
      // считываем температуру (t) и влажность (h)
      float h = dht.readHumidity();
      float t = dht.readTemperature();

      // выводим температуру (t) и влажность (h) на монитор порта
      Serial.print("Humidity: ");
      Serial.println(h);
      Serial.print("Temperature: ");
      Serial.println(t);
      }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *