Измерение температуры (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);}
}

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

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

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

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

Comments

  1. Здравствуйте. Повторяю Ваш проект. Но к сожалению не могу разобраться (новичок я). В коде отмечает строку «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()’

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

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

  3. Доброго дня, уважаемый Liman.
    Пытаюсь на основе вашего скетча сделать измеритель температуры и влажности на девяти датчиках DHT11.
    Но поскольку я профан в области программирован, то не очень-то у меня и получается.
    Взял за основу рабочий скетч для 9-ти датчиков. И попробовал скрестить с вашим.
    Помогите, пожалуйста, его доделать…

    #include
    #include
    #include
    #include
    // Подключение
    // CD MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
    // DS3231 SDA A4, SCL A5, VCC +5V
    DS3231 clock;
    RTCDateTime DateTime;

    File myFile;
    float h1,t1,h2,t2,h3,t3,h4,t4,h5,t5,h6,t6,h7,t7,h8,t8,h9,t9

    #define DHTTYPE DHT11
    DHT dht1 (1, DHTTYPE);
    DHT dht2 (2, DHTTYPE);
    DHT dht3 (3, DHTTYPE);
    DHT dht4 (4, DHTTYPE);
    DHT dht5 (5, DHTTYPE);
    DHT dht6 (6, DHTTYPE);
    DHT dht7 (7, DHTTYPE);
    DHT dht8 (8, DHTTYPE);
    DHT dht9 (9, DHTTYPE);

    #define DHTPIN 1
    #define DHTPIN 2
    #define DHTPIN 3
    #define DHTPIN 4
    #define DHTPIN 5
    #define DHTPIN 6
    #define DHTPIN 7
    #define DHTPIN 8
    #define DHTPIN 9

    void setup() {
    Serial.begin(9600);
    Serial.print(«Initializing SD card…»);
    if (!SD.begin(4)) {Serial.println(» Error!!!»);}
    else{Serial.println(» OK»);}// проверка подключения
    dht1.begin();
    dht2.begin();
    dht3.begin();
    dht4.begin();
    dht5.begin();
    dht6.begin();
    dht7.begin();
    dht8.begin();
    dht9.begin();

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

    }

    void loop() {
    DateTime = clock.getDateTime();
    Serial.print(clock.dateFormat(«d-m-Y H:i:s», DateTime));

    float h1 = dht1.readHumidity();
    float t1 = dht1.readTemperature();
    Serial.print(«H1: «);
    Serial.print(h1);
    Serial.print(» %\t»);
    Serial.print(«T1: «);
    Serial.print(t1);
    Serial.print(» *C «);
    float h2 = dht2.readHumidity();
    float t2 = dht2.readTemperature();
    Serial.print(«H2: «);
    Serial.print(h2);
    Serial.print(» %\t»);
    Serial.print(«T2: «);
    Serial.print(t2);
    Serial.println(» *C»);
    float h3 = dht3.readHumidity();
    float t3 = dht3.readTemperature();
    Serial.print(«H3: «);
    Serial.print(h3);
    Serial.print(» %\t»);
    Serial.print(«T3: «);
    Serial.print(t3);
    Serial.print(» *C «);
    float h4 = dht4.readHumidity();
    float t4 = dht4.readTemperature();
    Serial.print(«H4: «);
    Serial.print(h4);
    Serial.print(» %\t»);
    Serial.print(«T4: «);
    Serial.print(t4);
    Serial.print(» *C «);
    float h5 = dht5.readHumidity();
    float t5 = dht5.readTemperature();
    Serial.print(«H5: «);
    Serial.print(h5);
    Serial.print(» %\t»);
    Serial.print(«T5: «);
    Serial.print(t5);
    Serial.print(» *C «);
    float h6 = dht6.readHumidity();
    float t6 = dht6.readTemperature();
    Serial.print(«H6: «);
    Serial.print(h6);
    Serial.print(» %\t»);
    Serial.print(«T6: «);
    Serial.print(t6);
    Serial.print(» *C «);
    float h7 = dht7.readHumidity();
    float t7 = dht7.readTemperature();
    Serial.print(«H7: «);
    Serial.print(h7);
    Serial.print(» %\t»);
    Serial.print(«T7: «);
    Serial.print(t7);
    Serial.print(» *C «);
    float h8 = dht8.readHumidity();
    float t8 = dht8.readTemperature();
    Serial.print(«H8: «);
    Serial.print(h8);
    Serial.print(» %\t»);
    Serial.print(«T8: «);
    Serial.print(t8);
    Serial.print(» *C «);
    float h9 = dht9.readHumidity();
    float t9 = dht9.readTemperature();
    Serial.print(«H9: «);
    Serial.print(h9);
    Serial.print(» %\t»);
    Serial.print(«T9: «);
    Serial.print(t9);
    Serial.print(» *C «);
    delay (1000);
    }

    //////////////////////// запись 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(» t2 = «);// запись
    myFile.print(temp2);// запись

    myFile.close();// закрываем файл
    time=millis();
    }

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

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