Датчик DS18B20 и ошибка 85

Вы не поняли. Если была ошибка, то она не совпадёт. А вот если ошибки не было, а Вы просто решили прочитать температуру не запуская конверсию, то … что тут скажешь, Вы сам себе злобный буратино, но эта проблема надумана.

1 лайк

Что это реальная температура можно повысить достоверность только многократными измерениями. То, что датчик перезагрузился, вероятно можно по изменению других регистров. При штатной перезагрузке они копируются из EEPROM и если при инициализации датчика их изменить, но не записывать в EEPROM, то возврат к значению из EEPROM означает перезагрузку.

Если вас не интересует точность измерений, то термистор вам тем более подойдет

я просто рассматриваю такой вариант если температура стоит на 85 градусах ровно (реальная), допустим 10 измерений, далее будет выдаем ошибку, а температура была реальная

это придется каждый датчик калибровать, сопротивление не идеальное, с цифровыми проще

Да, не прочитается ничего если датчик перезагрузился. Чтобы что-то начало читаться надо инициализировать соединение.

И вообще нормальные люди делают это подряд: инициализация, выбор адреса, чтение.

1 лайк

Проблема надумана, я Вам уже написал.

Просто попробуйте её реально воспроизвести. Запустите, проинициализируйте, разорвите и восстановите питания датчика и прочитайте температуру. И нам расскажете.

1 лайк

Следующий вопрос будет “почему зависает МК при разрыве питания датчика?” ))

1 лайк

вы уже не в ту степь, вопрос был в другом, никаких проблем нет

При внешнем питании есть возможность контролировать процесс конвертирования темп-ры датчиком.
“after the Convert T command and
the DS18B20 will respond by transmitting 0 while the temperature conversion is in progress and 1 when the conversion is done.”
Если датчик не изменяет состояние шины в установленное время - значит данные неверны. Я думаю, если есть повышенные требования к точности, надо использовать эту возможность

вот это уже дельный ответ, спасибо, поизучаю

А если действительно нужна повышенная надёжность - ставьте два датчика в одно место, благо шина позволяет это без проблем сделать))

о таких вариантах читал

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

не надо придумывать того, чего не бывает в реальной жизни, на 12 битном разрешении этого не может быть никогда, а если отдало ровно 85 перечитай ещё раз

0000 0000 0000 0000 соответствует 0
разрешение минимальное 0,0625 градуса
1360*0,0625=85 = 0000 0101 0101 0000

вот такие биты выдает датчик когда + питание отсоеденить (он то работает то показывает 85)
0=0x50, 1=0x05, 6=0x0C
лабораторным блоком питания держа температуру 85 градусов, на 6 бите такого значения поймать ни разу не удалось

Чего нуль? Градусов? А вы уверены, что в этом случае получите сплошные нули?

bool DS1820::checkData(uint8_t *data)
{
  // проверка данных на валидность - сначала по контрольной сумме;
  // в случае отсутствия датчика data[] заполняется нулями, поэтому
  // проверка CRC ничего не даст - CRC суммы нулей равно нулю, а
  // именно нуль будет записан в ячейке CRC массива data[] в этом
  // случае; поэтому проверяем ячейку, в которой указано разрешение
  // конвертации, оно нулю равняться не должно
  bool result = sscDS18b20.crc8(data, 8) == data[8];
  if (result && data[8] == 0)
  {
    result = (!type_c && data[7] != 0x00) && (type_c && data[4] != 0x00);
  }

  return (result);
}

он вроде может и на паразитном питании работать?

1 лайк

Эксперимент некорректный и ни о чём не говорит. Вы не отсоединяете питание, а переводите на паразитное. Корректный эксперимент я Вам описывал:

  1. Проведите инициализацию
  2. Вытащите его из макетки целиком
  3. Воткните на место
  4. Прочитайте данные

Ваша проблема надумана от начала и до конца.

если её не придумать, то героически преодолевать не придётся, если уж совсем неймется - два датчика в параллель, за счет разброса параметров точно можно диагностировать неисправность