Инженеры и разработчики всегда полагаются на собранные данные для проектирования или улучшения системы. Запись данных и их анализ является обычной практикой в большинстве отраслей промышленности и в этой статье мы рассмотрим проект регистратора данных на основе платы 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 карта.
- Макетная плата.
- Соединительные провода.
- Компьютер/ноутбук.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Работа схемы
Схема устройства представлена на следующем рисунке.
Как можно видеть, соединения на схеме достаточно простые и перечислены в следующих таблицах:
контакт 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 мы должны сделать следующие вещи:
- Считывать данные с датчика 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// инициализируем модуль 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 в последовательном формате.
1 2 3 4 5 6 |
#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 карту мы используем оператор вида:
1 |
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); }*/ |
Благодаря скетчу уважаемого liman324 ,я чуть чуть посидел,подумал,подколхозил и теперь ̶с̶а̶м̶о̶л̶е̶т̶ы̶ ̶м̶о̶г̶у̶т̶ ̶с̶а̶д̶и̶т̶ь̶с̶я̶ ̶в̶ ̶т̶у̶м̶а̶н̶е̶ данные можно сохранять в Экселе.
// CD MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
// 18B20 OUT A1, +5V VCC // все датчики подключаются к одному входу
// DS1307 SDA A4, SCL A5, VCC +5V
#include
#include
#include
#include
#include
#include
OneWire oneWire(A1);
DallasTemperature t(&oneWire);
iarduino_RTC time(RTC_DS1307);
File myFile;
float temp1,temp2,temp3,temp4;//float служит для хранения чисел с плавающей запятой где зпт. Точкой , если целые то можно int.
unsigned long nomer;
int row_excel = 0; // количество строк
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);
time.begin();
// УСТАНОВКА ВРЕМЕНИ
time.settime(0,43,00,30,10,22,7); // 0 сек, 5 мин, 11 час, 30, января, 2020 года, четверг
// time.settime(-1, -1, -1, 30, 1, 20); // Установить дату 30.01.2020, а время и день недели оставить без изменений
Serial.println("CLEARDATA"); // очистка листа excel
Serial.println("LABEL,Time,temp1,temp2,temp3,temp4, Num Rows"); // заголовки столбцов
}
void loop(){
time.gettime();
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
Serial.print(" ");
t.requestTemperatures();
Serial.println(temp1 = t.getTempCByIndex(0));//считываем температуру
Serial.println(temp2 = t.getTempCByIndex(1));//считываем температуру
Serial.println(temp3 = t.getTempCByIndex(2));//считываем температуру
Serial.println(temp4 = t.getTempCByIndex(3));//считываем температуру
nomer++;
myFile = SD.open("temp.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае его
myFile.print(nomer);// запись
myFile.print(" ");// запись
myFile.print(time.day/10);myFile.print(time.day%10);myFile.print("-");
myFile.print(time.month/10);myFile.print(time.month%10);myFile.print("-");
myFile.print(time.year);myFile.print(" ");
myFile.print(time.Hours/10);myFile.print(time.Hours%10);myFile.print("-");
myFile.print(time.minutes/10);myFile.print(time.minutes%10);myFile.print("-");
myFile.print(time.seconds/10);myFile.print(time.seconds%10);
myFile.print(" t1 = ");myFile.println(temp1);
myFile.print(" t2 = ");myFile.println(temp2);
myFile.print(" t3 = ");myFile.println(temp3);
myFile.print(" t4 = ");myFile.println(temp4);
myFile.close();// закрываем файл
row_excel++; // номер строки + 1
Serial.print("DATA,TIME,"); // запись в excel текущей даты и времени
Serial.print(temp1);
Serial.print(",");
Serial.print(temp2);
Serial.print(",");
Serial.print(temp3);
Serial.print(",");
Serial.print(temp4);
Serial.print(",");
Serial.println(row_excel);
// если строк больше 50, то начинаем заполнять строки по новой
if (row_excel > 50){
row_excel = 0;
Serial.println("ROW,SET,2");
}
delay(1000); // задержка
}
А разве исходный скетч, приведенный в статье, не позволяет данные в Экселе сохранять?
Вы совершенно правы, в Вашей статье очень подробно прописан механизм сохранения данных через Эксель, чем я чрезвычайно благодарен. Но увы, что от одного датчика DHT11, а меня очень интересовал способ сохранения от 4-6 датчиков 18B20 и по нескольким входам , для чего,да чисто практический интерес, я разместил в ульях эти датчики, от ульев провел провода в избушку, тем самым во время зимовки пчел под сугробами снега была возможность мониторить состояние пчел. Найдя через гугл Вашу статью почитал коменты,один из коментаторов сослался на liman324 у которого есть скетч именно с далассовскими датчиками, вышел на него, он помог, но , к сожалению он не мог использовать PLX-DAQ, для нее требуется Windows, а он используют другую ОС.. Вот я и попытался "приколхозить" к его скетчу,через Ваши пояснения о программе PLX-DAQ. Получилось, с чем я и поделился в комментариях. Выражаю Вам огромную благодарность за опубликованную статью.
Спасибо и вам что поделились успехами своей работы таким подробным комментарием
Вот скетч. Его написал уважаемый 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();// закрываем файл
}
Спасибо, надеюсь он поможет другим посетителям нашего сайта
Попробовал закоментировать все, что связанно с DHT11, но переходит на ошибку DS3231 rtc(SDA, SCL);
Скорей всего надо подбирать библиотеки. На одном сайте мне сообщили, что в новых версиях Arduino IDE, например не корректно работают библиотеки DS3231. Переписали скетч, все заработало. Спасибо , что отозвались. Я нашел скетч логгера, подправил под себя, все работает. Будет время повожусь с этим проектом.
Рад, что у вас получилось. Со своей стороны чем мог, тем помог. Если не трудно, не могли бы вы поделиться этим работающим скетчем логгера?
Сейчас в коде выделяет эту строку "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) у вас уже выдается ошибка. Если в программе он неправильно инициализируется, то все остальные ошибки вполне понятны.
Спасибо, что ответили. Буду рад Вашей помощи, так как только "прикоснулся" к Ардуино) По отдельности все модули я подключал. Все работают правильно (показывают время, показывают температуру и влажность, запись чтение на SD происходит. Значит все библиотеки работают.
Я всем стараюсь помогать, но я пока тоже не сильно большой профессионал в Arduino, теоретических знаний достаточно, а вот с практикой проблемы - не хватает времени чтобы плотно этим заниматься
Вот список ошибок.
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 к Ардуино как я вам указал в предыдущем комментарии, а потом уже будем разбираться с этими ошибками.
Здравствуйте. Повторяю Ваш проект. Но из за ошибки не могу продвинутся вперед. Сначала была ошибка в строке "#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);
}