Как проверить датчик температуры ds18b20 мультиметром
Перейти к содержимому

Как проверить датчик температуры ds18b20 мультиметром

  • автор:

Arduino.ru

Герметичный датчик температуры DS18B20 как прозвонить?

  • Войдите на сайт для отправки комментариев

11 ответов [Последнее сообщение]
Сб, 04/06/2016 — 03:11
Зарегистрирован: 03.06.2016

Купил герметияный датчик температуры DS18B20.

Как подключать нашел.

Но с датчика выходит три провода, до самого чувствительного элемента не добраться, а провода не стандартной расцветки: красный, желтый и серый.

Можно как-то узнать (тестером прозвонить например) какой провод что означает? И чем грозит неправильное подключение?

  • Войдите на сайт для отправки комментариев

Сб, 04/06/2016 — 07:56
toxikaciya
Зарегистрирован: 11.04.2016

Посмотрите даташит, рисунок 2. Вызвоните ноль (скорее всего серый). Оставшиеся два провода коммутируете на паразитное питание и определяете линии питания и сигнала. Скорее всего красный — Vdd, желтый — DQ.

  • Войдите на сайт для отправки комментариев

Сб, 04/06/2016 — 08:45

ЕвгенийП аватар

Зарегистрирован: 25.05.2015

У него данные часто жёлтый, а питание всегда красный. У меня также, как у Вас.

  • Войдите на сайт для отправки комментариев

Сб, 04/06/2016 — 10:08
Зарегистрирован: 03.06.2016

Спасибо за ответы.

Земля на корпус колбы не прозванивается (ставил на 200 Ом и 200 кОм).

  • Войдите на сайт для отправки комментариев

Сб, 04/06/2016 — 10:45
Зарегистрирован: 09.11.2012

Земля на корпус колбы не прозванивается (ставил на 200 Ом и 200 кОм).

Так и должно быть.

  • Войдите на сайт для отправки комментариев

Сб, 04/06/2016 — 11:04
Зарегистрирован: 03.06.2016

А как тогда определить где земля? тестер показывает «обрыв» на пределе 200 кОм между всеми проводами.

Да и по схеме (я правда не очень большой специалист по электронике) там конденсатор стоит на землю (через диоды), что как я понимаю по факту разрыв в цепи, а емкость конденсатора врядли позволит заметить ток заряда конденсатора.

  • Войдите на сайт для отправки комментариев

Поддельные DS18B20: как настоящие, но не радуют

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

Недавно ко мне обратились с просьбой разобраться, почему не работает партия свежекупленных из Китая датчиков DS18B20.

Датчики в герметичных корпусах, под термоусадкой видно, что трубка надёжно залита каким-то компаундом, поэтому корпус самого датчика посмотреть не удалось. Впрочем, сомневаюсь что китайцы на нём написали 贋, скорее всего он мало чем отличается от оригинального DS18B20.

Я собрал небольшой стенд в виде микроконтроллера, написал программку, подключил датчик в непосредственной близости, в режиме паразитного питания с подтягивающим резистором 5,1кОм, и увидел что датчики-таки отвечают. Т.е. это не транзистор под видом датчика, это нечто активно притворяющееся настоящим датчиком. Только отвечали датчики как-то через раз. Осциллограмма показала причину:

(пунктирная клетка по горизонтали — 200мкс, по вертикали — 2В)
Тут показано начало опроса, длинный низкий уровень — это стартовая посылка от микроконтроллера следующий низкий уровень — это сигнал присутствия от датчика, далее — микроконтроллер посылает команду

Если так не понятно, что меня смутило, то для сравнения покажу осциллограмму точно такого же опроса, подключенного ровно в той же конфигурации но настоящего DS18B20:

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

По моим прикидкам, глядя на осциллограмму, ёмкость конденсатора находится где-то на уровне 4-5 нФ, против не более 800пФ в настоящем датчике

Оригинальные датчики постоянно потребляют с линии 5мкА (за исключением случаев когда идёт замер температуры и потребление возрастает до около 1мА), такой ток можно обнаружить и после включения или завершения команды до посылки сигнала сброса и между импульсами во время передачи команды.

На контрафактных же датчиках замеры тока показали потребление в режиме как паразитного, так и внешнего питания между импульсами на уровне 85мкА. Понятно, что чтобы компенсировать такое адское потребление тока схемой, китайцы засунули туда конденсатор повышенной ёмкости. При этом некоторые из контрафактных датчиков после завершения команды и до стартового импульса, видимо, уходят в глубокую спячку и потребляют около нуля мкА.

При всём при том, фейковые датчики вели себя и отвечали на запросы точно также, как отвечали бы настоящие DS18B20, даже в коде семейства возвращали 0x28, как то делают настоящие DS18B20.

Но нашлось одно отличие, из-за которого не удалось запустить эти датчики на настроечном стенде, и они, к счастью, не пошли в установку на объекты. А именно:

После команды перечисления (0xF0), которая позволяет перебрать адреса всех подключенных к шине датчиков, оригинальные датчики остаются в адресованном режиме — т.е. выбранный датчик продолжает отвечать на команды, как если бы он был выбран любой другой командой. А вот фейковые датчики тут сплоховали: и хотя они прекрасно проходят процедуру перечисления, выбранный датчик не отвечает на дальнейшие команды.

Дело в том, что в классических поделках с использованием этих датчиков, они, как правило, подключаются в непосредственной близости и по одной штуке — т.е. процедура перечисления не используется, вместо неё датчик адресуется командой безадресного выбора. Типичный покупатель таких датчиков даже не поймёт что его нагрели. В худшем случае будет считать что делает что-то неправильно и пенять на себя.

В нашем же случае, настроечный стенд работал следующим образом: сначала посылалась команда безадресного выбора, и передавалась команда на замер температуры, после чего включался «сильный подтягивающий резистор» — питание на линии. Таким образом все подключенные к шине датчики занимались замером температуры. А затем проходила процедура перечисления где выяснялся адрес каждого датчика и тут же посылалась команда на чтение результата замера температуры — на что фейковые датчики не обучены реагировать.

Ещё одно любопытное отличие обнаружил в ответе на команду чтения скрэтчпада (команда 0xBE)
Если прочитать скрэтчпад из оригинального датчика, то он примет вид
LL, HH, 0x4B, 0x46, 0x7F, 0xFF, 0x0C, 0x10, CRC
где LL, HH — младший и старший байты замеренной температуры (в 1/16 градусах), причём после подачи питания они принимают значение 0x50 0x05, что соответствует 85 градусам цельсия.
0x4B и 0x46 — граничные значения температуры, хранятся в EEPROM датчика
0x7F — конфигурация, младшие 5 бит — всегда 11111, старший всегда 0, биты 6 и 5 задают разрешение датчика, где 11 (по умолчанию) соответствует полному 12-битному разрешению.
Следующие байты 0xFF, 0x0C, 0x10 — зарезервированны и всегда принимают такие значения.
CRC — контрольная сумма по всему скрэтчпаду

Но вот интересная картина рисуется у фейковых датчиков. У них скрэтчпад имеет вид:
LL, HH, 0x55, 0x05, 0x7F, 0x7E, 0x81, 0x66, CRC
причём после подачи питания LL и HH содержат у каждого датчика что-то своё, у кого-то 26 градусов, у кого-то вообще отрицательное значение.
UPD 14.12.2018: Как выяснилось, значение не «какое-то», а ровно то, что было замерено в прошлый раз. То есть, видимо, из-за того что они жрут много тока, чип не может пережить импульс сброса длиной до 1мс, поэтому китайцы пошли на хитрость: они сохраняют измеренное значение в EEPROM, потом датчик перезагружается, а после сброса возвращает значение из EEPROM. Иначе говоря, после нескольких тысяч циклов вполне возможно ячейка EEPROM выйдет из строя и датчик начнёт возвращать дичь.

Я не проверял способность этих датчиков менять конфигурацию, сохранять граничные значения да и вообще реагировать на граничные значения, подозреваю что всего этого они не умеют. Но даже игнорируя первые три байта (после байт температуры), видно что последние 0x7E, 0x81, 0x66 — отличаются от 0xFF, 0x0C, 0x10 которые присутствуют у стандартных датчиков. Причём у всех фейковых датчиков эти значения были одни и те же. Почему китайцы не озаботились тем, чтобы подделать и эти значения «как у оригинала» — я не знаю. Как бы там ни было, это хорошая зацепка, чтобы отличить такую подделку от оригинала.

Резюме, как отличить подделку от оригинала
Подведу итоги, по каким признакам можно судить, что у вас подделка:
1) Датчик, даже подключенный в непосредственной близости, в режиме паразитного питания отвечает неуверенно, через раз.
2) В режиме паразитного питания высокий уровень восстанавливается слишком долго (можно замерять микроконтроллером или смотреть осциллограмму)
3) (UPD 05.07.2019) Оригинальный датчик всегда (кроме момента замера) при ожидании стартового импульса и между импульсами потребляет с шины около 5мкА. Контрафакт же перед стартовым импульсом может потреблять значительно меньше (около нуля), а между импульсами — значительно больше, десятки микроампер (GND и VCC на минус, DQ через микроамперметр на +5 вольт)
4) После процедуры перечисления (0xF0) датчики не отвечают на команду чтения скрэтчпада (0xBE)
5) Температура прочитанная из скрэтчпада после подачи питания без команды замера отличается от 85,0 градусов.
6) Значения в скрэтчпаде на позициях 5 и 7 не соответствуют 0xFF и 0x10
7) (UPD 14.12.2018) Значения температуры (на первых двух позициях скрэтчпада) прочитанные после первого включения обесточенного датчика без предварительно поданной команды на замер, возвращают предыдущее значение, а не 50 05 (85.0 градусов).

Считываем показания датчика DS18B20 (DS18S20)

Рассмотрим как при помощи Arduino считывать показания с цифрового датчика температуры DS18B20 или DS18S20. В настоящий момент м/с DS18B20 фирмы Dallas является наиболее распространенным и доступным цифровым датчиком температуры. Работает по протоколу 1-wire. Даташит датчика: DS18B20 Распиновка DS18B20Датчик может запитываться двумя способами — внешним питанием (3 провода) или паразитным (питание от шины, 2 провода). Расписывать эти режимы не буду, все есть в документации. Отмечу лишь то, что в данном проекте мы будем использовать нормальное (внешнее) питание датчика. Схема подключения датчика DS18B20 к Arduino приведена ниже. Подтягивающий Pull-Up резистор номиналом 4.7 кОм (5 кОм) включается между выводом DQ (Data) и питанием датчика Vdd. Подключение DS18B20 к ArduinoРабочий скетч представлен ниже. Необходима библиотека OneWire, последнюю версию которой можно скачать здесь. После установки библиотеки, в меню появиться рабочий пример, которым и можно воспользоваться. Данные с датчика через Serial Monitor

#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! // http://milesburton.com/Dallas_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] > 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"); >
Теги:

taliban Опубликована: 2011 г. 0 1

Вознаградить Я собрал 0 0

Оценить статью

  • Техническая грамотность

Как проверить датчик температуры ds18b20 мультиметром

Выход датчика цифровой. Нечего там мерить.

При дальнейшем нагреве показания не растут — нЕкуда.

Надеюсь достаточно показательный эксперимент?

Ошибка в протоколе обмена данными. Однозначно!

Это с DS18B20

Это с DS1820
Программа сдвигает считанные данные на 4 бита вправо. Потом BCD преобразование и индикация. Дальше объяснять надо?

miwutka, чтоб проверить датчик, нужна абсолютно рабочая, проверенная программа. На фотках Attiny15. Если есть — скину проект, но там внешний индикатор-эмулятор HT1611(простейший SPI) на Attiny2313. В смысле в программе использован. И на фотках он.
Попробуй для отладки сделать статическую индикацию, чтоб обновление индикатора не влияло на протокол обмена с датчиком. Нужно всего 3 разряда. У тебя как раз 3 планки индикаторов, выведи на каждую по 1 цифре и посмотри — что получится.

Последний раз редактировалось omercury; 16.02.2012 в 01:23 .

Меню пользователя omercury
Посмотреть профиль
Отправить личное сообщение для omercury
Найти ещё сообщения от omercury

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *