| Ваш IP: 3.95.63.218 | Online(54) - гости: 15, боты: 39 | Загрузка сервера: 0.47 ::::::::::::

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

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

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

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

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

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

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

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

  • Преобразователь напряжения 3В в 9В

    Схема преобразователя представлена на рис.. Основа уст-ва однотактный автогенератор с трансформаторной связью и обратным включением диода. Генератор преобразователя выполнен на VT2. Германиевый транзистор имеет малое сопротивление насыщения, и это обеспечивает легкий запуск и нормальную работу преобразователя при низком напряжении питания. На VT1 собран стабилизатор базового тока транзистора VT2, предназначенный для …Подробнее...
  • Инфракрасный датчик

    Назначение: на основе предложенной схемы можно собрать уст-во которое будет считать прохожих, включать свет при проходе через дверь, охранную сигнализацию и тому подобное. Излучатель ИК VD4 на АЛ147А (он установлен в пультах ДУ ТВ типа 4-УСЦТ) излучает сигнал промодулированный импульсами 1000Гц. Генератор — источник импульсов выполнен на VT2 VT3. Частота …Подробнее...
  • Любительская паяльная станция

    Схема станции показана на рис. 1. На ОУ DA3 собран усилитель напряжения термопары ВК1. Плюсовой вывод термопары ВК1 должен быть обязательно подключен к общей точке резисторов R4 R11. На ОУ DA4 выполнен компаратор напряжения. На его не инвертирующий вход поступает напряжение, задаваемое делителем R5R7R8R9, на инвертирующий вход — напряжение с …Подробнее...
  • Обмоточные провода

    При эксплуатации и ремонте электроустановок применяются обмоточные, монтажные и установочные провода и провода специального назначения. Первые используют для изготовления обмоток электрических машин, трансформаторов, приборов и аппаратуры; при помощи вторых осуществляют соединения в различных схемах электрооборудования и электроустройства; третьи используют в качестве нагревательных элементов электроустановок. Обмоточные провода могут иметь волокнистую изоляцию, …Подробнее...
  • Аналоговый ВЧ вольтметр

    Аналоговый ВЧ вольтметр

    На рисунке показана схема простого ВЧ вольтметра. Входное напряжение вольтметра от 0 до 5В. Максимальная частота до 200 МГц. Вольтметр состоит из двух частей — зонда и усилителя которые соединены между собой коаксиальным кабелем. В качестве индикатора используется микроамперметр (100мкА) с линейной шкалой. Для калибровки вольтметра необходимо на его вход …Подробнее...