DS18B20 Брак производства или неверный скетч

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Добрый день. Столкнулся со следующей проблемой:
Есть 3 датчика, все три при подключении к Ардуинке выдают температуру 87-89. При этом реагируют на температуру адекватно, погружал в холодную воду и температура опустилась, подносил горячее - повышалась. Но комнатную температуру показывает 87-89. С сотыми, все как положено.
Использовал стандартный скетч OneWire Temperature и для перепроверки скетч из библиотеки Dallas - Single.
Менял в даллосовском скетче разрядность - точность меняется, но результат нет.
Вывел в монитор порта получаемые байты - младший и старший - все сходится с даташитом, пересчитал вручную - верно, получается 87-89. Складывается ощущение, что у них у всех брак внутри чипа. Но сомнение в том, что сразу у всех трёх. Брал в одном месте.
В интернете нашел только то, что если температура 85 - значит не происходит сброса перед началом работы с датчиком, но у меня она другая и меняется. Может, кто-то сталкивался с подобным?

sadman41
Offline
Зарегистрирован: 19.10.2016

Идентификаторы чипов засветите. Может это семейство другое... Конечно пальцем в небо, но надо же с чего-то начать.

Если CRC сходится, значит с подключением/схемой проблем нет, полагаю. 5,1к между VCC и DQ?

negavoid
Offline
Зарегистрирован: 09.07.2016

87*F - это примерно около 30*C ?

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Щас доберусь до дому, скину.
Резистор 4,7. Ставил и 1к и 10к - температура меняется на 5 градусов выше/ниже и все.
87-89 градусов по Цельсию выдаёт.
CRC сходится, в том и беда.

sadman41
Offline
Зарегистрирован: 19.10.2016

Думашь, что в фаренгейтах смотрит показания? Может быть... 

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Выдержка из даташита.

Тоже проверил сначала, сходится. Но, похоже, что нет.

ROM1 =  28 AF F AE 7 0 0 CF

ROM2 = 28 FF 8E AD 7 0 0 6F
 
ROM3 = 28 12 6A AC 7 0 0 46
 
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ошибка, как всегда, в 47-ой строке кода. И ещё, зелёный провод припаян не туда, его к жёлтому надо.

sadman41
Offline
Зарегистрирован: 19.10.2016

Семейство правильное: 0x28 - DS18B20. Загадочная история... 

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

ЕвгенийП пишет:

Ошибка, как всегда, в 47-ой строке кода. И ещё, зелёный провод припаян не туда, его к жёлтому надо.

Немного вас не понял.

Про код. Вот он:

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// https://github.com/milesburton/Arduino-Temperature-Control-Library

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}

Что именно в 47 строке не так?

Или для флага type_s = 1 он как-то иначе всё считает?

sadman41
Offline
Зарегистрирован: 19.10.2016

Не вижу проверки сходимости CRC _после_ чтения Scratchpad.

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

the_matrix пишет:

Немного вас не понял.

А чего тут понимать? Это здесь так намекают на то, что Вы просите помощи по устройству схемы и кода которого никто из присутствующих не видел. Теперь код есть. Выкладывайте схему подключения.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

ЕвгенийП пишет:

the_matrix пишет:

Немного вас не понял.

А чего тут понимать? Это здесь так намекают на то, что Вы просите помощи по устройству схемы и кода которого никто из присутствующих не видел. Теперь код есть. Выкладывайте схему подключения.

ААААА! Рашн традишн! Понял вас! :)

Сейчас с товарищем нашли одну закономерность, если всё сойдётся - напишу решение.

Upd. нет, все закономерности отвалились. Придётся искать другие датчики.

SLKH
Offline
Зарегистрирован: 17.08.2015

1. "Резистор 4,7. Ставил и 1к и 10к - температура меняется на 5 градусов выше/ниже и все" - это настораживает. Питание осциллографом смотрели?

2. Подключить родную далласовскую библиотеку и запустить пример  Single.pde сложно?

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

SLKH пишет:

1. "Резистор 4,7. Ставил и 1к и 10к - температура меняется на 5 градусов выше/ниже и все" - это настораживает. Питание осциллографом смотрели?

2. Подключить родную далласовскую библиотеку и запустить пример  Single.pde сложно?

1. Нет, под рукой сейчас нет осциллографа.

2. Выше указал, что и ей проверял, результат не изменился.

sadman41
Offline
Зарегистрирован: 19.10.2016

Проверили бы вы сходимость CRC без осциллографа. 

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

sadman41 пишет:

Проверили бы вы сходимость CRC без осциллографа. 

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }

Разве вот тут она не проверяется? (строки 38-41)

SLKH
Offline
Зарегистрирован: 17.08.2015

the_matrix пишет:

SLKH пишет:

1. "Резистор 4,7. Ставил и 1к и 10к - температура меняется на 5 градусов выше/ниже и все" - это настораживает. Питание осциллографом смотрели?

2. Подключить родную далласовскую библиотеку и запустить пример  Single.pde сложно?

1. Нет, под рукой сейчас нет осциллографа.

2. Выше указал, что и ей проверял, результат не изменился.

писал про скетч, про библиотеку не писал.

 

 

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

SLKH пишет:

the_matrix пишет:

SLKH пишет:

1. "Резистор 4,7. Ставил и 1к и 10к - температура меняется на 5 градусов выше/ниже и все" - это настораживает. Питание осциллографом смотрели?

2. Подключить родную далласовскую библиотеку и запустить пример  Single.pde сложно?

1. Нет, под рукой сейчас нет осциллографа.

2. Выше указал, что и ей проверял, результат не изменился.

писал про скетч, про библиотеку не писал.

 

 

Без библиотеки вы же скетч и не запустите.

sadman41
Offline
Зарегистрирован: 19.10.2016

the_matrix пишет:

 

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }

Разве вот тут она не проверяется? (строки 38-41)

Так там же русским по белому написано, что это CRC идентификатора. Простая проверка на корректность адреса переданного в функцию.

lean_74
Offline
Зарегистрирован: 22.12.2015

the_matrix пишет:

ААААА! Рашн традишн! Понял вас! :)

 

там по моему крайние выводы это питание, а средний данные , конечно, если это не "авторское" рисование схемы.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Подскажите тогда,пожалуйста, чего надо дописать.

Про схемку - да, сам отрисовал.

sadman41
Offline
Зарегистрирован: 19.10.2016

В строке #83 есть расчет, но сравнения с CRC-байтом принятого скретчпада не производится.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Если вы считаете что вам подсунули плохие датчики:

1.Найдите и попробуйте другой пример.
Совсем другой.
Чем проще - тем лучше.
2. С другой библиотекой или даже без неё.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Пробовал другие примеры.
Простые. Просто считывал напрямую старший и младший байты. Всё сходится.
Сверил все биты. Всё тоже верно работает.
В конечном итоге взял другой датчик(совсем другой) и сравнил его показания со своими. Пришёл к выводу, что дружественный народ Китая вшил в чип подсчет сразу в Фаренгейтах, ибо если принять эту мысль, то при переводе сырых значений (считая, что это температура в Фаренгейтах) получается весьма точное значение в Цельсиях с другим датчиком. Разбег в 1 градус считаю незначительным.
Так что если у кого такое же с этим чипом проскочит - возможно, мы с вами товарищи по прошивке.

sadman41
Offline
Зарегистрирован: 19.10.2016

Нужно этот датчик сдать в поликлинику для опытов.