| Ваш IP: 34.224.102.60 | Online(24) - гости: 16, боты: 8 | Загрузка сервера: 1.3 ::::::::::::

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

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

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

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

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

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

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

  • Узкополосный приемный тракт на КФ1066ХА2

    КФ1066ХА2 (аналог К174ХА26) — в данной схеме предпочтительно использовать КФ1066ХА2 так как она более приспособлена при работе на ВЧ и потребляет значительно меньший ток и может питаться от 3 до 9 В. В данной статье рассматривается приемный тракт расчитанный на частоту 27,12МГц. Характеристики: Чувствительность при отношении сигн\шум 10дБ не хуже …Подробнее...
  • Цифровой индикатор уровня воды

    Индикатор уровня, показывает цифровое значение уровня воды в резервуаре. В качестве индикатора используется 7-сегментный дисплей который выводит цифровое значение уровня воды от 0 до 9. Цифровой индикатор уровня воды работает от напряжения 5В. Основа индикатора микросхема CD4511 и 7-сегментный декодер CD4511 нагрузкой которого является 7-сегментный дисплей LTS543 и несколько дискретных …Подробнее...
  • FM-тюнер-полуавтомат

    Схема управления тюнером показана на рис.1, она обеспечивает автоматическую настройку на радиостанции в диапазоне FM2. Если в старшем разряде DD2 лог 0, то VD3 закрыт, гетеродинные катушки L1 L2 по высокой частоте включены параллельно, и выбран FM1. При лог 1 VD3 закрыт и L2 отключена. Резисторные матрицы RM1…4 и R6 …Подробнее...
  • Усилитель мощности с «нулевым» током покоя

    Усилитель мощности с «нулевым» током покоя

    Основные технические характеристики: Номинальное входное напряжение 0,5В Номинальная выходная мощность при нагрузке 8Ом 35Вт Номинальный диапазон частот 20…20000Гц Коэф. гармоник на f=1кГц не более 0,1% Входной сигнал поступает на неинвертный вход ОУ DA1, усиливает сигнал примерно в 40 раз и с его выхода сигнал подается на выходной транзистор VT3, а …Подробнее...
  • Стерео усилитель 2*5.8Вт на TA8208H

    Стерео усилитель 2*5.8Вт на TA8208H

    Микросхема TA8208H предназначена для использования в автомобильных усилителях мощности. В микросхеме имеются тепловая защита, защита от перенапряжения, защита от короткого замыкания выходов на шину питания и на корпус. Усилитель на базе TA8208H имеет следующие технические характеристики: Напряжение питания от +9 до +18В Номинальное напряжение питания 13,2В Ток покоя 80…145 мА …Подробнее...