| Ваш IP: 3.235.74.184 | Online(45) - гости: 23, боты: 22 | Загрузка сервера: 0.84 ::::::::::::


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

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

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

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

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

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

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

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

  • Подключение LCD1602 по I2C к Ардуино

    Подключение LCD1602 по I2C к Ардуино

    I2C модуль на базе микросхем PCF8574 позволяют подключить символьный дисплей 1602 к плате Arduino всего по двум проводам SDA и SCL (А4 и А5), что дает возможность не использовать цифровые выходы Arduino при подключении дисплея. Подключение  I2C модуля к дисплею 1602 очень простое, установите модуль как показано на фото и …Подробнее...
  • Регуляторы мощности

    Регуляторы мощности

    Cхема первого варианта регулятора позволяет регулировать мощность в нагрузке рассчитанной на сетевое напряжение 220В, от 5 до 97..99% номинальной мощности. КПД уст-ва не менее 98%. Регулирующие элементы 2-а тиристора включенных последовательно нагрузке, изменение мощности происходит изменением угла открывания тиристоров. Изменение угла открывания тиристоров обеспечивается однопереходным транзистором V4. С1 соединен с …Подробнее...
  • Три простых УМЗЧ

    Три простых УМЗЧ

    1. Усилитель при Uпит = 12В развивает мощность до 3 Вт при Rн=4 Ом. Чувствительность 50 мВ, диапазон при неравномерности 6 дБ 50…16000кГц, КНИ не более 1% при номинальной выходной мощности. 2. Усилитель при питании 12В развивает мощность до 5Вт, при этом КНИ не более 0,35%, а диапазон рабочих частот …Подробнее...
  • Чувствительный индикатор скрытой проводки на микросхемах

    Прибор состоит из двух узлов: усилителя напряжения переменного тока на DA1 и генератора колебаний звуковой частоты на DD1.1. При расположении антенны WA1 вблизи от токонесущего провода наводка промышленной частоты усиливается DA1, в результате чего зажигается светодиод HL1. Это же выходное напряжение DA1, пульсирующее с частотой 50 Гц, запускает генератор звуковой …Подробнее...
  • Импульсный стабилизатор напряжения на L4960

    Импульсный стабилизатор напряжения на L4960

    На ИМС L4960 можно собрать простой но достаточно мощный импульсный стабилизатор напряжения. Выходное напряжение может находится в пределах от 5,1 В до 40В при выходном токе до 2,5 А. Входное напряжение может достигать 50 В. ИМС L4960 имеет встроенную защиту по току и перегреву, КПД до 90%. Мощность рассеивания с радиатором — 15 …Подробнее...