Разные показания(и точность) датчиков DS18B20

cubikrubika
Offline
Зарегистрирован: 22.03.2012

 Здравствуйте! У меня вопрос по датчиками DS18B20. У меня подключены два датчика DS18B20 один изменяет показания дискретно по 0.5 градуса, а другой на разные величины то 0.16 градуса, то по 0,05 и друге значения? Показания датчиков расходятся на 0,5 градуса (это согласно даташиту правильно). Но почему один сразу на 0,5 градуса, а второй может расти по 0,05?  Подключал датчики по отдельности и вместе.

 

Вот код, который использую для одновременной работы нескольких датчиков

001#include <U8glib.h>
002#include <Wire.h>
003#include <TimeLib.h>
004#include <DS1307RTC.h>
005#include <OneWire.h>
006#include <DallasTemperature.h>
007 
008// Data wire is plugged into pin 2 on the Arduino
009#define ONE_WIRE_BUS 3
010  
011// Setup a oneWire instance to communicate with any OneWire devices
012// (not just Maxim/Dallas temperature ICs)
013OneWire oneWire(ONE_WIRE_BUS);
014  
015// Pass our oneWire reference to Dallas Temperature.
016DallasTemperature sensors(&oneWire);
017 
018//uint8_t sensor1[8] = { 0x28, 0xED, 0x2E, 0x3C, 0x05, 0x00, 0x00, 0x48 };
019//uint8_t sensor2[8] = { 0x28, 0xB7, 0x1B, 0x3D, 0x05, 0x00, 0x00, 0x70 };
020 
021 
022U8GLIB_ST7920_128X64 u8g(22, 23, 24, U8G_PIN_NONE); // настройка пинов
023tmElements_t tm;
024 
025const char *monthName[12] = {
026  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
027  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
028};
029 
030 
031  
032void draw() {
033  u8g.setRot180();
034  u8g.setFont(u8g_font_unifont);
035 // u8g.drawStr(15, 12, "SOMEtEXT");
036 u8g.setPrintPos( 10, 12);  u8g.print(tm.Hour);
037 u8g.setPrintPos( 30, 12);  u8g.print(tm.Minute);
038 u8g.setPrintPos( 50, 12);  u8g.print(tm.Second);
039 u8g.drawLine(0, 15, 128, 15);
040 u8g.setFont(u8g_font_6x12);
041 u8g.setPrintPos( 10, 25);  u8g.print(sensors.getTempCByIndex(0));
042 u8g.setPrintPos( 50, 25);  u8g.print(sensors.getTempCByIndex(1));
043  u8g.setColorIndex(1);          
044  u8g.drawBox(0, 35, 128, 20);
045  u8g.setFont(u8g_font_unifont);
046  u8g.setColorIndex(0);
047  u8g.drawStr(35, 50, "ARDUINO");
048  u8g.setColorIndex(1);
049  u8g.setFont(u8g_font_unifont);
050  u8g.drawStr(45, 64, "HELLO");
051}
052  
053void setup() {
054  sensors.begin();
055bool parse=false;
056  bool config=false;
057 
058  // get the date and time the compiler was run
059  if (getDate(__DATE__) && getTime(__TIME__)) {
060    parse = true;
061    // and configure the RTC with this info
062    if (RTC.write(tm)) {
063      config = true;
064    }
065  }
066 
067  Serial.begin(9600);
068  while (!Serial) ; // wait for Arduino Serial Monitor
069  delay(200);
070  if (parse && config) {
071    Serial.print("DS1307 configured Time=");
072    Serial.print(__TIME__);
073    Serial.print(", Date=");
074    Serial.println(__DATE__);
075  } else if (parse) {
076    Serial.println("DS1307 Communication Error :-{");
077    Serial.println("Please check your circuitry");
078  } else {
079    Serial.print("Could not parse info from the compiler, Time=\"");
080    Serial.print(__TIME__);
081    Serial.print("\", Date=\"");
082    Serial.print(__DATE__);
083    Serial.println("\"");
084  }
085   
086 
087  Serial.println("DS1307RTC Read Test");
088  Serial.println("-------------------");
089}
090  
091void loop() {
092    //tmElements_t tm;
093  u8g.firstPage(); 
094  do {
095    draw();
096  } while( u8g.nextPage() );
097 // tmElements_t tm;
098 
099  if (RTC.read(tm)) {
100    Serial.print("Ok, Time = ");
101    print2digits(tm.Hour);
102    Serial.write(':');
103    print2digits(tm.Minute);
104    Serial.write(':');
105    print2digits(tm.Second);
106    Serial.print(", Date (D/M/Y) = ");
107    Serial.print(tm.Day);
108    Serial.write('/');
109    Serial.print(tm.Month);
110    Serial.write('/');
111    Serial.print(tmYearToCalendar(tm.Year));
112    Serial.println();
113  } else {
114    if (RTC.chipPresent()) {
115      Serial.println("The DS1307 is stopped.  Please run the SetTime");
116      Serial.println("example to initialize the time and begin running.");
117      Serial.println();
118    } else {
119      Serial.println("DS1307 read error!  Please check the circuitry.");
120      Serial.println();
121    }
122    delay(9000);
123  }
124  // call sensors.requestTemperatures() to issue a global temperature
125  // request to all devices on the bus
126  Serial.print(" Requesting temperatures...");
127  sensors.requestTemperatures(); // Send the command to get temperatures
128  Serial.println("DONE");
129 
130  Serial.print("Temperature is: ");
131  Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"?
132    // You can have more than one IC on the same bus.
133    // 0 refers to the first IC on the wire
134    Serial.print(" Requesting temperatures...");
135  // Send the command to get temperatures
136  Serial.println("DONE");
137 
138  Serial.print("Temperature is: ");
139  Serial.print(sensors.getTempCByIndex(1));
140}
141 
142void print2digits(int number) {
143  if (number >= 0 && number < 10) {
144    Serial.write('0');
145  }
146  Serial.print(number);
147}
148 
149bool getTime(const char *str)
150{
151  int Hour, Min, Sec;
152 
153  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
154  tm.Hour = Hour;
155  tm.Minute = Min;
156  tm.Second = Sec;
157  return true;
158}
159 
160bool getDate(const char *str)
161{
162  char Month[12];
163  int Day, Year;
164  uint8_t monthIndex;
165 
166  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
167  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
168    if (strcmp(Month, monthName[monthIndex]) == 0) break;
169  }
170  if (monthIndex >= 12) return false;
171  tm.Day = Day;
172  tm.Month = monthIndex + 1;
173  tm.Year = CalendarYrToTm(Year);
174  return true;
175}

 

Вот лог. 

1Temperature is: 24.50 Ok, Time = 10:58:50, Date (D/M/Y) = 10/10/2022
2 Requesting temperatures...DONE
3Temperature is: 24.87 Requesting temperatures...DONE
4Temperature is: 24.50 Ok, Time = 10:58:51, Date (D/M/Y) = 10/10/2022
5 Requesting temperatures...DONE
6Temperature is: 24.87 Requesting temperatures...DONE
7Temperature is: 24.50 Ok, Time = 10:58:52,

 

cubikrubika
Offline
Зарегистрирован: 22.03.2012

Для подключения датчиков использовал резистор 4.7 кОм

rkit
Offline
Зарегистрирован: 23.11.2016

Ты не настроил датчики.

Upper
Offline
Зарегистрирован: 23.06.2020

У датчиков есть параметр Resolution. Может быть от 9 до 12
Попробуйте установить одинаковое разрешение для всех датчиков
Например

  sensors.begin();
  sensors.setResolution(9); // Разрешение можно указывать от 9 до 12

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

cubikrubika пишет:

 один изменяет показания дискретно по 0.5 градуса, а другой на разные величины то 0.16 градуса, то по 0,05 и друге значения?

Этот датчик не умеет "по 0,05".  Может "по 0.5, по 0.25, по 0.125 и по 0.0625".  Смотрите преобразование чисел в коде.

Разрешение может быть настроено, см #2#3

cubikrubika
Offline
Зарегистрирован: 22.03.2012

Upper пишет:

У датчиков есть параметр Resolution. Может быть от 9 до 12
Попробуйте установить одинаковое разрешение для всех датчиков
Например

  sensors.begin();
  sensors.setResolution(9); // Разрешение можно указывать от 9 до 12

Лучшее решение.

Спасибо, ваш ответ решил мою ошибку.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Не лучшее, а единственное - настроить датчик, выставив нужное разрешение

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Посмотрите ещё вот эту тему просто для общего развития - https://arduino.ru/forum/obshchii/ne-pokupaite-ds18b20-na-ali-ili-ebay

olegue
Offline
Зарегистрирован: 23.09.2020

 вот так скачет , снимаю каждый 2 минуты. С ночи и до 9 утра в кабинете никого не было.

olegue
Offline
Зарегистрирован: 23.09.2020

 

а этот на радиаторе закреплен и дерганий таких уже нет.

nik182
Offline
Зарегистрирован: 04.05.2015

olegue пишет:

 

а этот на радиаторе закреплен и дерганий таких уже нет.

Ну да, конечно нету. Особенно если на шкалы глянуть. Растяните второй график до тех же значений что и на первом - очень удивитесь.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

у меня тоже скачет и тоже никого нету:

olegue
Offline
Зарегистрирован: 23.09.2020

nik182,

все уже растянуто . и первый и второй график 2час и показания каждые 2 минут.

графики эти проcто с разных транспортов, один с Esp, второй с sim800, но это к делу отношения не имеет

 

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

20.63-20.83 - колебания в 0,2 градуса. Это что, очень много? У вас кабинет - термоизолированное помещение? Почему вы так уверены, что это косяк датчика, а не реальные локальные колебания температуры?

olegue
Offline
Зарегистрирован: 23.09.2020

так я и склоняюсь к тому что это реальные колебания, потому и привел в пример второй график  с датчиком, который установлен на радиаторе.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это не "реальные колебания" и не "косяк датчика", это нормальная работа.

По этому поводу вспоминаются слова Гаусса: "Недостатки математического образования с наибольшей отчётливостью проявляются в чрезмерной точности численных расчётов".

Вот то же самое можно сказать о точности измерений.

olegue
Offline
Зарегистрирован: 23.09.2020

когда отопления нет четко видно как один скачет а второй плавно показывает практически одну и  ту же Т.

olegue
Offline
Зарегистрирован: 23.09.2020

ua6em, что за сервис, самописаный? Php?

bwn
Offline
Зарегистрирован: 25.08.2014

olegue пишет:

когда отопления нет четко видно как один скачет а второй плавно показывает практически одну и  ту же Т.

Вы сами ответили на свой вопрос - "датчик закреплен на радиаторе". А висящий свободно реагирует на любой сквознячек.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

olegue пишет:

ua6em, что за сервис, самописаный? Php?

громко сказано, ESP8266 льёт с 3-х датчиков в базу sql, через скрипт на php ну и отображение странички еще один, все самописное, самое сложное было придумать механизм шифрации, чтобы базу не взломали, аптайм - годы

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

И как «шифруешь»? Токены?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BOOM пишет:

И как «шифруешь»? Токены?

ключевая пара

olegue
Offline
Зарегистрирован: 23.09.2020

 

если курлом

http://esp.orviss.ru/forhour.php 

брать, то вот это получается.

У меня тоже самое только пока без шифрования.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

 ну да, скипт отрисовывает картинки )))
шифрация не тут, шифрация на стадии передачи данных в теле запроса

olegue
Offline
Зарегистрирован: 23.09.2020

вот оно чем Михалыч

ну я по простецки в Гугл Chart массивы скидываю

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

olegue пишет:

вот оно чем Михалыч

ну я по простецки в Гугл Chart массивы скидываю

ничего не помню, написал и забыл, даже скетч не знаю где искать )))
библиотека помоему хайчарт использовалась, но это не точно, мне главное раза два в день пилу посмотреть ...

olegue
Offline
Зарегистрирован: 23.09.2020

https://www.highcharts.com/

нормальная тема, надо взять на заметку.

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

olegue пишет:

https://www.highcharts.com/

нормальная тема, надо взять на заметку.

да, это она )))

Paruzma
Offline
Зарегистрирован: 27.06.2018

Здравствуйте, столкнулся с проблемой, датчики ds18b20 12 шт,работают в пром холодильнике 3 года, в один прекрасный момент показания у половины подскакивают на 6 градусов, то есть было 0,25 стало 6,25, меняю сопртивление на подтягивающем резисторе - все выравнивается, через три дня снова +6, кто нибудь сталкивался с такой проблемой? 

Paruzma
Offline
Зарегистрирован: 27.06.2018

проблему нашел - окислившаяся смотка, но причина мне не понятна, получается первый датчик завышает показания на 6 градусо, второй занижает на 0,25 и так все 12 датчиков через один