1

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

1 скетч

//    Подключение
 
//  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(DateTime.day/10);myFile.print(DateTime.day%10);myFile.print("-");
   myFile.print(DateTime.month/10);myFile.print(DateTime.month%10);myFile.print("-");
   myFile.print(DateTime.year);myFile.print(" ");

   myFile.print(DateTime.hour/10);myFile.print(DateTime.hour%10);myFile.print("-");
   myFile.print(DateTime.minute/10);myFile.print(DateTime.minute%10);myFile.print("-");
   myFile.print(DateTime.second/10);myFile.print(DateTime.second%10);
   
   myFile.print(" ");// запись
   myFile.println(temp);// запись
   myFile.close();// закрываем файл
}

2 скетч

//    Подключение
 
//  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 <EEPROM.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(DateTime.day/10);myFile.print(DateTime.day%10);myFile.print("-");
   myFile.print(DateTime.month/10);myFile.print(DateTime.month%10);myFile.print("-");
   myFile.print(DateTime.year);myFile.print(" ");

   myFile.print(DateTime.hour/10);myFile.print(DateTime.hour%10);myFile.print("-");
   myFile.print(DateTime.minute/10);myFile.print(DateTime.minute%10);myFile.print("-");
   myFile.print(DateTime.second/10);myFile.print(DateTime.second%10);
   
   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);}
}

2

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

Спасибо за новый скетч. Установил, на SD стал писать показания. Но вот время почему то через этот скетч не устанавливается. Брал пример устанавливал время потом прошивал Вашим скетчем.
И еще, почему единицы минут и секунд пишет так: 15:1:2, как сделать, что бы записывалось так: 15:01:02
И как сделать, чтобы дата записывалась один раз в начале суток.

3

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

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

//    Подключение
 
//  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;
int data_old;
 
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(" ");// запись
if(data_old!=DateTime.day){
   myFile.print(DateTime.day/10);myFile.print(DateTime.day%10);myFile.print("-");
   myFile.print(DateTime.month/10);myFile.print(DateTime.month%10);myFile.print("-");
   myFile.print(DateTime.year);myFile.print(" ");}
data_old = DateTime.day;
   myFile.print(DateTime.hour/10);myFile.print(DateTime.hour%10);myFile.print("-");
   myFile.print(DateTime.minute/10);myFile.print(DateTime.minute%10);myFile.print("-");
   myFile.print(DateTime.second/10);myFile.print(DateTime.second%10);
   
   myFile.print(" ");// запись
   myFile.println(temp);// запись
   myFile.close();// закрываем файл
}

4

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

Я несколько раз пробовал так. Но время оставалось тоже, что я до этого прошивал. Потом установил из примера. Ну это то ладно  не мытьем так катаньем, все работает. А как насчет минут сейчас 3 ,надо бы 03. И дата один раз в начале суток, можно так сделать?

5

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

Загрузите новый скетч.

6

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

Спасибо, в понедельник попробую ( все на работе оставил).

7

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

Спасибо большое!!! Теперь дата и время записывает в привычном формате. Для полного счастья осталось, чтобы дата записывалась один раз в начале суток. Или подскажите какими командами это сделать? Может сам попробую.

8

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

Я же внес изменения в скетч, должно работать

if(data_old!=DateTime.day){
   myFile.print(DateTime.day/10);myFile.print(DateTime.day%10);myFile.print("-");
   myFile.print(DateTime.month/10);myFile.print(DateTime.month%10);myFile.print("-");
   myFile.print(DateTime.year);myFile.print(" ");}
data_old = DateTime.day;

9

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

Спасибо большущее!!! Извините за невнимательность. Загрузил самый первый скетч. Да, сейчас дату не пишет. Оставлю логгер на ночь. Утром посмотрю.

10

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

Спасибо огромное. Это лучший регистратор ( для меня).

11

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

Заметил такую проблему в этом коде. При установке записывать каждые 15 мин., получается вот  так:
16:18  27.00°C
16:33  26.80°C
17:18  26.20°C
17:33  26.10°C
19:18  25.90°C
19:33  25.80°C
И потом запись прекращается совсем.
При 10 минутном опрашивание все идет гладко.

12

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

Я даже предположить не могу почему так получается, попробуйте перенести
delay(5000);// записывать данные на CD каждые 5 сек
в самый конец цикла loop()

13

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

Спасибо попробую.

14

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

Точного ответа я не нашел, но в delay есть проблема в работе при больших значениях, укажите лучше delay 2 раза
delay(600000);
delay(300000);

для 15 минут

15 (2021-03-17 04:26:10 отредактировано S_Sergey_G)

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

Не увидел Ваше сообщение. Сегодня прошло трое суток тестирования. Результат печальный.
13-03-2021  23:06  16.30°C   23:36  17.10°C  // не перенес строчку
00:21  14.90°C
02:51  14.50°C
пропуски по 2-3 часа, потом такое:
19:22  17.6 0���ȸ���4(�����܀��ظ��
� ���и���4(��������Ը��
� ���Ը���4(�����̀�Ĭ�C
и все закончилось этим:
15-03-2021  00:08  17.80°C
00:23  17.10°C
00:38  16.50°C
00:53  16.00°C
0�

Теперь попробую как Вы предложили delay 2 раза
delay(600000);
delay(300000);

Ставить так же в конце?

16

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

Ставить так же в конце?

Да, можно в конце.

17

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

Прошло трое суток. Совсем практически не писал.

15-03-2021  00:08  17.80°C
00:23  17.10°C
00:38  16.50°C
00:53  16.00°C
0� 16-03-2021  19:40  27.00°C
20:10  27.50°C
20:25  27.80°C
20:40  28.00°C  21PТ#�SR#�� +2#R�PТ#�#�� +2#2�cPТ#�#R#�� +2#B�PТ#�C#�� +2#B�CPТ#�SR#�� +2#B�sPТ##�#�� +2#B�PТ##�#R#�� +2#R�PТ##�C#�� +2#R�#PТ##�SR#�� +2#R�#PТ#3

18

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

Пока у меня нет вариантов решения проблемы, попробуйте пока вернутся к 10 минутам если этот вариант работает.

19

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

Возможно микроконтроллер дает сбой из-за внешних факторов, например помеха по питанию, стоит поставить по цепи питания конденсаторы 0,1 мкФ, так же причиной может быть источник питания, ардуино иногда не очень хорошо работают от импульсных источников питания.

20

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

Спасибо, перепроверю все. Напаяю. Но каждые 10 мин. записи, без сбоя пишет 3 дня с таким же питанием. Надо на недельку оставить.

21

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

Еще маленький момент. Возможно ли запись делать без сотых, только с десятыми после запятой? Без дробей у меня получается.

22

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

Попробуйте так
myFile.println(temp,1);// запись

23

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

Спасибо большое, то, что надо!!! Теперь на неделю тест с записью каждые 10мин.

24 (2021-03-29 00:06:53 отредактировано S_Sergey_G)

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

Вот неделька прошла. Запись на SD каждые 10 мин. В принципе все прошло успешно. Все дни писал. Но бывали какие то вылеты типа такого:

01:44  27.7 1:54  27.7°C
02:04  27.8°C
02:14  27.9°C
02:24  27.8°C
34  27.8°C
02:54  27.9°2 Т3�B�ܸ�
� �4(�����Ѐ��ܸ�
� �4(�����Ѐ�°C
03:34  27.9°C
04 22-03-2021 14:59  26.7°C
15:09  26.9°C

Дальше все нормально. И еще не понятно почему такое бывает?

  06:03  28.4°C
06:13  28.4°C
  06:23  28.4°C

22:30  28.6°C
22:40  28.
22:50  28.7°C

А вот с 15 мин. проблема не хочет больше суток писать.