ds18b20 и китайцы

DIGIUS
Offline
Зарегистрирован: 17.09.2015

В общем заказывал себе давно 2 датчика ds18b20 и они пришли. Недавно начал их подключать в проект самодельной приборки и столкнулся с весёлым нюансом. 
Я как лалка решил что эти датчки все по большей части одинаковые, поэтому вооружившись первой же схемой из интернета начал собирать схему:

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

Оказалось что на моём датчике плюс то находиться в лева а маркировку он имеет DS18B20 1541C4 и по идее (именно по идее так как даташита я на этот датчик я не нашёл) схема подключения выглядит так:

+ резистор на 4.7 Ком между сигналом и плюсом.

Удостоверился в том что пины соблюдены правильно (на примере уно и моей про мини)
На картинке выше используеться 2 пин на уне:

И моя про мини (т.к. она китайская я надеюсь что пины раскидали они аналогично):

В итоге датчик перестал греться и я радостный залил скетч ниже и уже обрадовался что до триумфа осталось чуть чуть. В результате меня ждал облом и в сериал вместо температуры полилось струйкой сообщение: No more addresses.

#include <OneWire.h>

// пример использования библиотеки OneWire DS18S20, DS18B20, DS1822

OneWire ds(2); // на пине 10 (нужен резистор 4.7 КОм)

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();

// первый байт определяет чип

switch (addr[0]) {

case 0x10:

Serial.println(" Chip = DS18S20"); // или более старый 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); // начинаем преобразование, используя ds.write(0x44,1) с "паразитным" питанием

delay(1000); // 750 может быть достаточно, а может быть и не хватит

// мы могли бы использовать тут ds.depower(), но reset позаботится об этом

present = ds.reset();

ds.select(addr);

ds.write(0xBE);

Serial.print(" Data = ");

Serial.print(present, HEX);

Serial.print(" ");

for ( i = 0; i < 9; i++) { // нам необходимо 9 байт

data[i] = ds.read();

Serial.print(data[i], HEX);

Serial.print(" ");

}

Serial.print(" CRC=");

Serial.print(OneWire::crc8(data, 8), HEX);

Serial.println();

// конвертируем данный в фактическую температуру

// так как результат является 16 битным целым, его надо хранить в

// переменной с типом данных "int16_t", которая всегда равна 16 битам,

// даже если мы проводим компиляцию на 32-х битном процессоре

int16_t raw = (data[1] << 8) | data[0];

if (type_s) {

raw = raw << 3; // разрешение 9 бит по умолчанию

if (data[7] == 0x10) {

raw = (raw & 0xFFF0) + 12 - data[6];

}

} else {

byte cfg = (data[4] & 0x60);

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

if (cfg == 0x00) raw = raw & ~7; // разрешение 9 бит, 93.75 мс

else if (cfg == 0x20) raw = raw & ~3; // разрешение 10 бит, 187.5 мс

else if (cfg == 0x40) raw = raw & ~1; // разрешение 11 бит, 375 мс

//// разрешение по умолчанию равно 12 бит, время преобразования - 750 мс

}

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");

}

Так как с подобным датчиком я связался в первый раз и не знаю нюансов подскажите как подружить его с про мини. (Есть вероятность что я его сжёг но максимум по ощущениям он нагревался до 100 градусов и работал он так не долго максимум 5 секунд).
Заранее спасибо.

evgta
Offline
Зарегистрирован: 02.09.2016

Я подключал наоборот. Ну грелся, да . Но потом нормально работал. Для проверки залить тестовые скетчи библиотек из иде. У меня датчики не со всеми библиотеками работали.

DIGIUS
Offline
Зарегистрирован: 17.09.2015

вся проблема в том что при подключении по стандартной схеме датчик нагревается примерно до 100 градусов, а на ардуине горит зелёная лампочка весьма тускло что свиделетьствует о неплохой перегрузке. И да со старым подключением она тоже не считывала. Датчики покупал тут:
https://ru.aliexpress.com/item/DS18B20-TO-92/32740712782.html?spm=2114.13010708.0.0.HxlDvJ

Только что припаял как в мануалах, и от датчика пошёл дым...

evgta
Offline
Зарегистрирован: 02.09.2016

Внимательней даташит смотрите. Несмотря что на самом датчике у ноги символ "плюс" в реальности и по даташиту там минус

DIGIUS
Offline
Зарегистрирован: 17.09.2015

Я бы сюда не писал если бы нашёл даташит...

evgta
Offline
Зарегистрирован: 02.09.2016

Вторая ссылка по поиску
https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

DIGIUS
Offline
Зарегистрирован: 17.09.2015

Мда, резистор в цепи 4.27 Ком. Видимо в магазине дали чуть чуть нето что требовалось, подобный резистор кретичен или нет?

evgta
Offline
Зарегистрирован: 02.09.2016

Критичен. От слова критика. Этот резистор подойдет

DIGIUS
Offline
Зарегистрирован: 17.09.2015

В моём случае от слова кретин, т.е. я.

DIGIUS
Offline
Зарегистрирован: 17.09.2015

https://forum.arduino.cc/index.php?topic=397240.0
​Форум где была подобная проблема, в результате простой вывод:
датчик подделка.

С адекватными датчиками всё нормально работает.
Как вернусь данному продавцу глаз на известное место натяну.

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

DIGIUS пишет:

вооружившись первой же схемой из интернета начал собирать схему:

Нормальная схема.

DIGIUS пишет:

 (именно по идее так как даташита я на этот датчик я не нашёл) схема подключения выглядит так:

Эта катринка противоречит схеме выше. Ошибка в нижней картинке. 

Держите даташит и больше так не делайте :)

 

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

он больше не будет у него больше датчиков нет

evgta
Offline
Зарегистрирован: 02.09.2016

незнаю паленые датчики или нет, за 30р у китайцев с значком + у ноги минуса , у меня работают правда шаг температуры толи 0,25 толи 0,125(сейчас непомню) и точнее не сделать,

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

я в чип-дип брал, на плате нарисован профиль, по нему распаял, всё работает, где у него +- понятия не имею )))

 

Logik
Offline
Зарегистрирован: 05.08.2014

Пачитал.

Тема "ds18b20 и китайцы" раскрыта полностью )))

ПС. У него ж всего 3 (три!!) вывода. А если бы было 8|

 

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

Logik пишет:

Пачитал.

Тема "ds18b20 и китайцы" раскрыта полностью )))

ПС. У него ж всего 3 (три!!) вывода. А если бы было 8|

 

тут иногда в двух выводах путаешься )))

DIGIUS
Offline
Зарегистрирован: 17.09.2015

Я описал как я подключил что-бы  работало и не грелось. А по первой схеме он нагревался до состояния что от него дым шёл. 
А даташит на 18b20 я несколько раз читал и в соответствии подключал. Даташита на DS18B20 1541C4 не существует так как датчик поршивая подделка с несуществующим индексом.
Короче я пойду на днях и куплю у нас за 100 рубликов за штуку, не о чём но обидно.
 

DIGIUS
Offline
Зарегистрирован: 17.09.2015

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