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

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

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

 

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

#include <U8glib.h>
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h> 
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 3
 
// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

//uint8_t sensor1[8] = { 0x28, 0xED, 0x2E, 0x3C, 0x05, 0x00, 0x00, 0x48 };
//uint8_t sensor2[8] = { 0x28, 0xB7, 0x1B, 0x3D, 0x05, 0x00, 0x00, 0x70 };


U8GLIB_ST7920_128X64 u8g(22, 23, 24, U8G_PIN_NONE); // настройка пинов
tmElements_t tm;

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};


 
void draw() {
  u8g.setRot180();
  u8g.setFont(u8g_font_unifont);
 // u8g.drawStr(15, 12, "SOMEtEXT");
 u8g.setPrintPos( 10, 12);  u8g.print(tm.Hour);
 u8g.setPrintPos( 30, 12);  u8g.print(tm.Minute);
 u8g.setPrintPos( 50, 12);  u8g.print(tm.Second);
 u8g.drawLine(0, 15, 128, 15);
 u8g.setFont(u8g_font_6x12);
 u8g.setPrintPos( 10, 25);  u8g.print(sensors.getTempCByIndex(0));
 u8g.setPrintPos( 50, 25);  u8g.print(sensors.getTempCByIndex(1));
  u8g.setColorIndex(1);           
  u8g.drawBox(0, 35, 128, 20);
  u8g.setFont(u8g_font_unifont);
  u8g.setColorIndex(0);
  u8g.drawStr(35, 50, "ARDUINO");
  u8g.setColorIndex(1); 
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr(45, 64, "HELLO");
}
 
void setup() {
  sensors.begin();
bool parse=false;
  bool config=false;

  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }

  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor
  delay(200);
  if (parse && config) {
    Serial.print("DS1307 configured Time=");
    Serial.print(__TIME__);
    Serial.print(", Date=");
    Serial.println(__DATE__);
  } else if (parse) {
    Serial.println("DS1307 Communication Error :-{");
    Serial.println("Please check your circuitry");
  } else {
    Serial.print("Could not parse info from the compiler, Time=\"");
    Serial.print(__TIME__);
    Serial.print("\", Date=\"");
    Serial.print(__DATE__);
    Serial.println("\"");
  }
  

  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}
 
void loop() {
    //tmElements_t tm;
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
 // tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print(" Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");

  Serial.print("Temperature is: ");
  Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"? 
    // You can have more than one IC on the same bus. 
    // 0 refers to the first IC on the wire
    Serial.print(" Requesting temperatures...");
  // Send the command to get temperatures
  Serial.println("DONE");

  Serial.print("Temperature is: ");
  Serial.print(sensors.getTempCByIndex(1));
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

bool getTime(const char *str)
{
  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}

 

Вот лог. 

Temperature is: 24.50 Ok, Time = 10:58:50, Date (D/M/Y) = 10/10/2022
 Requesting temperatures...DONE
Temperature is: 24.87 Requesting temperatures...DONE
Temperature is: 24.50 Ok, Time = 10:58:51, Date (D/M/Y) = 10/10/2022
 Requesting temperatures...DONE
Temperature is: 24.87 Requesting temperatures...DONE
Temperature 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 датчиков через один