| Ваш IP: 3.239.233.139 | Online(41) - гости: 31, боты: 9 | Загрузка сервера: 1.14 ::::::::::::


Измерение температуры (18B20) с записью данных на MicroSD

Если Вам необходимо измерять температуру в пределах от -55 до 125ºС и вести за ней длительное наблюдение, то можно воспользоватся уст-вом описанном на этой странице, которое позволяет измерять температуру каждые 5 секунд и записывать показания измерения на карту памяти MicroSD.

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

  • SPI адаптер карт MicroSD
  • Датчик температуры 18B20
  • Часы реального времени DS3231 (ZS-042)
  • Arduino NANO (UNO)

Измеритель температуры не имеет органов управления или индикатора, он начинает измерять температуру и записывать ее данные на MicroSD карту сразу после подачи питания.

//    Подключение
 
//  CD       MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
//  18B20    OUT A1, +5V VCC
//  DS3231   SDA A4, SCL A5, VCC +5V
 
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <DS3231.h>
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(clock.dateFormat("d-m-Y H:i:s", DateTime));// запись
   myFile.print(" ");// запись
   myFile.println(temp);// запись
   myFile.close();// закрываем файл
}

В монитор порта выводится следующая информация:

На карте памяти создается файл temp.txt (или данные дописываются если файл уже создан), данные заносятся построчно и содержать номер измерения, время и дата измерения, температуру.


Второй вариант уст-ва аналогичен первому, только в нем используется два датчика температуры 18B20 которые так же работают в диапазоне от -55 до 125ºС. Уст-во можно использовать как двух канальный терморегулятор, для этого добавлен четырех разрядный семисегментный индикатор на базе драйвера TM1637 (модуль TM1637) и три кнопки управления терморегулятором.

Кнопка «ВЫБОР» позволяет переходить от одного режима к другому. При подачи питания на индикаторе высвечивается показания первого датчика температуры (первый режим), при нажатии на кнопку «ВЫБОР» появляются показания второго датчика температуры (второй режим), повторное нажатие позволяет регулировать температуру первого канала (датчик 1 — третий режим), следующее нажатие позволяет регулировать температуру второго канала (датчик 2 — четвертый режим). Все значения терморегуляторов сохраняются в энергонезависимой памяти, для сохранения значений необходимо перейти в первый режим в котором отображается температура первого датчика.

Каждые 10 секунд все параметры записываются в файл temp.txt расположенный в корне MicroSD карты, данные имеют следующий вид:

29-10-2018 14:21:07 t1 = 25.00 r1 = -5 t2 = 25.50 r2 = -10
29-10-2018 14:21:17 t1 = 25.00 r1 = 5 t2 = 25.50 r2 = -15
29-10-2018 14:21:27 t1 = 25.00 r1 = 5 t2 = 25.50 r2 = 0
29-10-2018 14:21:38 t1 = 25.00 r1 = 5 t2 = 25.50 r2 = 10
29-10-2018 14:21:48 t1 = 25.00 r1 = 5 t2 = 25.50 r2 = 10
29-10-2018 14:21:58 t1 = 25.00 r1 = 5 t2 = 25.50 r2 = 10
29-10-2018 14:22:08 t1 = 25.00 r1 = 5 t2 = 25.50 r2 = 10
29-10-2018 14:22:18 t1 = 25.00 r1 = 5 t2 = 25.50 r2 = 10
29-10-2018 14:22:28 t1 = 25.00 r1 = 5 t2 = 25.50 r2 = 10

где

  • t1 и t2 — показания температуры первого и второго датчика
  • r1 и r2 — температура регулирования первого и второго канала
//    Подключение
 
//  CD       MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
//  18B20    OUT A1, +5V VCC
//  DS3231   SDA A4, SCL A5, VCC +5V
//  TM1637   CLK D7, DIO D6, VCC +5V
 
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <EEPROMex.h> //#include <EEPROM.h>// в новой версии ARDUINO IDE
#include <DS3231.h>
#include <TM1637Display.h>
OneWire oneWire(A1);
TM1637Display display(7, 6);// CLK,DIO
DallasTemperature t(&oneWire);
DS3231 clock;
RTCDateTime DateTime;
 
File myFile; 
float temp1,temp2;
int t1,t2,n,t0,reg1,reg2,w,minus_reg1,minus_reg2;
unsigned long time;
uint8_t data[]{0,0,0,0};
const int gis = 1;// гистерезис
 
void setup() {
  Serial.begin(9600);
  pinMode(A3,INPUT);// кнопка выбора
  pinMode(9,INPUT);// кнопка плюс
  pinMode(3,INPUT);// кнопка минус
  pinMode(5,OUTPUT);// выход управления реле 1 канал
  pinMode(8,OUTPUT);// выход управления реле 2 канал
  Serial.print("Initializing SD card...");
  if (!SD.begin(4)) {Serial.println(" Error!!!");}
  else{Serial.println(" OK");}// проверка подключения
 
  display.setBrightness(1);// яркость TM1637 0-7 
  t.begin(); 
  t.setResolution(10);// 10 bit 18b20
  clock.begin();
  // clock.setDateTime(__DATE__, __TIME__);// установка времени DS3231, раскомментировать и залить скетч, далее закомментировать и залить скетч повторно   
 
          reg1 = EEPROM.read(0); 
          minus_reg1 = EEPROM.read(1);
          if(minus_reg1==1){reg1=reg1-2*reg1;}
          reg2 = EEPROM.read(2); 
          minus_reg2 = EEPROM.read(3);
          if(minus_reg2==1){reg2=reg2-2*reg2;}
}
 
void loop() {
  DateTime = clock.getDateTime();
  Serial.print(clock.dateFormat("d-m-Y H:i:s", DateTime));
  t.requestTemperatures();
  Serial.print(" t1 = ");
  Serial.print(temp1 = t.getTempCByIndex(0));//считываем температуру 1 датчик
  Serial.print(" t2 = ");
  Serial.print(temp2 = t.getTempCByIndex(1));//считываем температуру 2 датчик
  Serial.println(" ");
 
  //////////////////////// запись SD /////////////////////////////////////
 if(millis()-time>10000){
   myFile = SD.open("temp.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае его
   myFile.print(clock.dateFormat("d-m-Y H:i:s", DateTime));// запись
   myFile.print(" t1 = ");// запись
   myFile.print(temp1);// запись
   myFile.print(" r1 = ");// запись
   myFile.print(reg1);// запись
   myFile.print(" t2 = ");// запись
   myFile.print(temp2);// запись
   myFile.print(" r2 = ");// запись
   myFile.println(reg2);// запись
   myFile.close();// закрываем файл
   time=millis();
  }
  ////////////////////////////////////////////////////////////////////////
 
  t1 = temp1;t2 = temp2;
 
  ///////////////////////////// кнопки управления //////////////////////
  if(analogRead(A3)>=900){n++;delay(200);if(n>3){n=0;}}// кнопка выбор
  // терморегулятор 1
  if(digitalRead(9)==HIGH && n==2){w=1;reg1++;delay(200);if(reg1>125){reg1=125;}}// плюс
  if(digitalRead(3)==HIGH && n==2){w=1;reg1--;delay(200);if(reg1<-55){reg1=-55;}}// минус
  // терморегулятор 2
  if(digitalRead(9)==HIGH && n==3){w=1;reg2++;delay(200);if(reg2>125){reg2=125;}}//плюс
  if(digitalRead(3)==HIGH && n==3){w=1;reg2--;delay(200);if(reg2<-55){reg2=-55;}}//минус
 
  if(n==0 && w==1){  EEPROM.update(0,abs(reg1));
                     if(reg1<0){minus_reg1=1;}else{minus_reg1=0;}
                     EEPROM.update(1,minus_reg1);
                     EEPROM.update(2,abs(reg2));
                     if(reg2<0){minus_reg2=1;}else{minus_reg2=0;}
                     EEPROM.update(3,minus_reg2);w=0;}
  /////////////////////////////////////////////////////////////////////
 
  ////////////////////////////// вывод на индикатор M1637 /////////////
  if(n==0){t0=t1;data[0] = 0x10;}
  if(n==1){t0=t2;data[0] = 0x14;}
  if(n==2){t0=reg1;data[0] = 0x11;}
  if(n==3){t0=reg2;data[0] = 0x15;}
 
  if(t0 > 99){data[1] = display.encodeDigit((t0/100)%10);}
  else{data[1] = 0x00;}
  if(t0 < 0){t0=abs(t0);data[1] = 0x40;}
  data[2] =  display.encodeDigit((t0/10)%10);
  data[3] =  display.encodeDigit((t0%10)%10);
  display.setSegments(data);
  ////////////////////////////////////////////////////////////////////
 
  // выходы управления реле ///
   if(reg1 >= temp1 + gis){digitalWrite(5,HIGH);}
   if(reg1 <= temp1 - gis){digitalWrite(5,LOW);}
   if(reg2 >= temp2 + gis){digitalWrite(8,HIGH);}
   if(reg2 <= temp2 - gis){digitalWrite(8,LOW);}
}

Показания первого датчика температуры 

Показания второго датчика температуры

Регулировка температуры первого канала

Регулировка температуры второго канала

Комментарии

  • S_Sergey_G:

    Здравствуйте. Повторяю Ваш проект. Но к сожалению не могу разобраться (новичок я). В коде отмечает строку «DS3231 clock;» и в низу описание ошибок:

    sketch_jan13a:15:8: error: no matching function for call to ‘DS3231::DS3231()’
    DS3231 RTC;
    ^~~
    In file included from C:\Arduino\sketch_jan13a\sketch_jan13a.ino:12:0:
    C:\Arduino\libraries\DS3231/DS3231.h:80:3: note: candidate: DS3231::DS3231(uint8_t, uint8_t)
    DS3231(uint8_t data_pin, uint8_t sclk_pin);
    ^~~~~~
    C:\Arduino\libraries\DS3231/DS3231.h:80:3: note: candidate expects 2 arguments, 0 provided
    C:\Arduino\libraries\DS3231/DS3231.h:77:7: note: candidate: constexpr DS3231::DS3231(const DS3231&)
    class DS3231
    ^~~~~~
    C:\Arduino\libraries\DS3231/DS3231.h:77:7: note: candidate expects 1 argument, 0 provided
    C:\Arduino\libraries\DS3231/DS3231.h:77:7: note: candidate: constexpr DS3231::DS3231(DS3231&&)
    C:\Arduino\libraries\DS3231/DS3231.h:77:7: note: candidate expects 1 argument, 0 provided
    sketch_jan13a:16:1: error: ‘RTCDateTime’ does not name a type
    RTCDateTime DateTime;
    ^~~~~~~~~~~
    C:\Arduino\sketch_jan13a\sketch_jan13a.ino: In function ‘void setup()’:
    sketch_jan13a:30:3: error: ‘clock’ was not declared in this scope
    clock.begin();
    ^~~~~
    C:\Arduino\sketch_jan13a\sketch_jan13a.ino:30:3: note: suggested alternative: ‘fclose’
    clock.begin();
    ^~~~~
    fclose
    C:\Arduino\sketch_jan13a\sketch_jan13a.ino: In function ‘void loop()’:
    sketch_jan13a:35:3: error: ‘DateTime’ was not declared in this scope
    DateTime = clock.getDateTime();
    ^~~~~~~~
    C:\Arduino\sketch_jan13a\sketch_jan13a.ino:35:3: note: suggested alternative: ‘Time’
    DateTime = clock.getDateTime();
    ^~~~~~~~
    Time
    sketch_jan13a:35:14: error: ‘clock’ was not declared in this scope
    DateTime = clock.getDateTime();
    ^~~~~
    C:\Arduino\sketch_jan13a\sketch_jan13a.ino:35:14: note: suggested alternative: ‘fclose’
    DateTime = clock.getDateTime();
    ^~~~~
    fclose
    exit status 1
    no matching function for call to ‘DS3231::DS3231()’

    Помогите пожалуйста разобраться.

  • S_Sergey_G:

    Все модули по отдельности подключал. Все работают. И выдают показания.

  • S_Sergey_G:

    Спасибо большое. Установил Вашу библиотеку и все заработало! Спасибо.

  • S_Sergey_G:

    Компиляция прошла без ошибок. Создается файл на SD карточке, пишется температура. А вот время не пишется. Часы устанавливал через этот скетч. Подскажите пожалуйста в чем может быть проблема?

  • S_Sergey_G:

    Спасибо. Завтра попробую.

  • S_Sergey_G:

    А возможно ли изменить структуру записи на SD. Вот в таком формате?

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

Войти с помощью: 

Случайные статьи

  • Автомобильный адаптер USB

    На рисунке показана схема универсального USB-адаптера, который питается от 12 вольтовой аккумуляторной батареи автомобиля. Выходное напряжение адаптера 5В. Адаптер может питать любое уст-во использующее для этого USB разъем с питающим напряжением 5В.  Напряжение питания на адаптер подается от гнезда прикуривателя автомобиля. Постоянное напряжение от аккумуляторной батареи автомобиля подается на стабилизатор …Подробнее...
  • Маркировка SMD компонентов

    Маркировка SMD компонентов

    Компоненты для поверхностного монтажа (SMD) очень малы и размещение на их корпусе полноценной маркировки затруднительна. Поэтому используется специальная система маркировки — на корпус SMD прибора наносится код, состоящий из двух, трех и более символов.Подробнее...
  • Простой аналоговый частотомер

    Простой аналоговый частотомер

    Простой аналоговый частотомер можно собрать по схеме, показанной на рисунке, он позволяет измерять частоту периодических сигналов напряжением 1,8… 5 В в диапазоне частот 20… 20 000 Гц. Его основой является триггер Шмитта, собранный на элементах DD1.1 и DD1.2, и ждущий мультивибратор на элементах DD1.3 и DD1.4. На вход частотомера через …Подробнее...
  • Значения ТЭДС для термопары типа R (родий / платина) ТПП

    Значения ТЭДС для термопары типа R (родий / платина) ТПП

    Термопара (термоэлектрический преобразователь) — устройство, применяемое в промышленности, научных исследованиях, медицине, в системах автоматики. Применяется в основном для измерения температуры. Принцип действия основан на эффекте Зеебека или, иначе, термоэлектрическом эффекте. Между соединёнными проводниками имеется контактная разность потенциалов; если стыки связанных в кольцо проводников находятся при одинаковой температуре, сумма таких разностей …Подробнее...
  • wi-fi модуль NodeMcu v3 с чипом ESP8266 (ESP-12e)(Умный дом)

    wi-fi модуль NodeMcu v3 с чипом ESP8266 (ESP-12e)(Умный дом)

    На базе wi-fi модуля NodeMcu v3 с чипом ESP8266 (ESP-12e) можно сделать терморегулятор с удаленным управлением (по локальной сети или Интернет), помимо терморегулятора можно управлять несколькими цифровыми выходами. Предлагаемое для повторения уст-во содержит в себе несколько компонентов: wi-fi модуль NodeMcu v3 с чипом ESP8266 (ESP-12e) 18B20 — цифровой датчик температуры, для …Подробнее...