DS18B20 1-wire - больше 1 не работает

У меня несколько датчиков длинной “гирляндой”. Тоже к витой паре подключены. Нормально заработаели только после того как на каждый припаял конденсатор между землей и питанием на 0.1 mF и на крайнем (самом дальнем) подтянул провод данных к питанию через (не помню точно, могу померить) 4.7 Ком.
И да, у меня одна пара (два провода) - это земля, а вторая пара - питание и данные. На фото вижу подключение данных в одной паре с землей. Советую поменять. В свое время перед тем как делать много экспериментировал.

Попробую по вашей схеме сделать. У меня коричневый и белокоричневый это питание, оранжевый данные. Так что по сути 2 отдешьные пары (бело-оранжевый я на экран посадил).

И да, если провод экранированный - то соединяем экран с чем-то (в нашем случае с землей) только с одной стороны. Со стороны контроллера.

а каким кабелем вообще рекомендуете наращивать кабеля датчиков ds18b20? кроме витой пары?
в оригинале что за кабель идёт? или он безбожно дорогой и лучше витой парой?

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


Не помогло.

Наьткнулся на тему -> (не реклама).
Сделал как написано по схеме с возвратом.


Обрадовался и побежал паять. Спаял провода и все… минутка радости кончилась. Датчики снова отвалились.

Вобщем ситуация следующая:

  • заменил 3 датчика;
  • датчики определились и работают целый день;
  • все спаял и закрыл термоусадкой.

Остается вопрос в 3х предыдущих датчиках… Что с ними может быть не так? Покупались 15 датчиков разом.

Может замыкать на саму гильзу какой-то провод. Я как-то читал про такое. Ну или пайка китайская.
Можно аккуратно вытащить и глянуть. Если не вытягиваются - гильзу погреть зажигалкой без фанатизма.
Рад что получилось!

Да я сам рад что получилось))) Но мне предстоит такие же датчики (из 15 купленных) похоронить в плиточном клее вместе с теплым полом…и вот если там начнется такая же фигня как-то через недельку…
Вот это реально беспокоит.

У меня тоже датчики в теплом полу. Часть - выведены раздельно и соединяются “звездой”. Но есть и гирлянды. Лежат уже больше пяти лет, пока работают.
Вообще - можно провод основной пустить вдоль стены, а датчики к нему подключать - тогда хоть ясно где искать.

А можете рассказать как укладывали в пол датчики? Делали штробу в бетоне или просто на нагревательный мат между проводником? Сверху клей и плитка или просто ламинат? Увиливали ли места соединений контактов дополнительной термоусадкой и вместе входа провода в гильзу? Защищали ли гильзу датчика дополнительно чем-то (доп. гильза)?

Пол у меня водяной. Соответственно после укладки трубы и до заливки стяжки был размотан провод. и припаяны датчики. Провод - витая пара, две пары, не 4.
Собственно мне нужны были датчики “вот прямо сейчас” и ждать заказанное не стал. Взял медную трубку “кондерку” на 6,35 мм, нарезал кусками миллиметров по 50, один конец сплющил. миллиметра на 3. Витуху в нужном месте кусал-зачищал, следя чтоб наружнюю изоляцию слишком не снять. Провода припаивал к ногам датчика+ конденсатор 0,1 на каждый датчик. Потом в “гильзу” выдавливал обильно герметика и вставлял туда датчик . И наружняя изоляция витухи - тоже заходила в трубку. Двухпарная тонкая, хорошо. На другой день на место входа витухи в трубку посадил термоусадку, сантиметра 3, 1 см - на трубку, остальное на витуху.
Все, в процессе заливки стяжки следил чтоб датчики были в середине слоя.
А, самое главное!
Все время в процессе заливки и до нее дня 3 линии были подключены к “тестеру”. Просто ардуинка-прошка и экранчик.
Вот с таким скетчем:
#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(3); // on pin (a 4.7K resistor is necessary)

#include <OLED_I2C.h>
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
OLED myOLED(8, 9, 8);

extern uint8_t SmallFont[];

#define Max1w 5 //

void setup(void) {
Serial.begin(9600);
Serial.println(“Program started”);
pinMode(2, OUTPUT); //Питание 1W
digitalWrite(2,HIGH);//Питание 1W
myOLED.begin();
myOLED.setFont(SmallFont);
myOLED.print(“1wire tester”,CENTER,20); //выводим на него строку
myOLED.update();
delay(600);

}

void loop(void) {
byte present = 0;
byte type_s;
byte data[12];
byte addr[Max1w][8];//Двумерный массив 10 строк по 8 значений
for (byte i=0;i<Max1w;i++)
{
for (byte ii=0;ii<8;ii++)
{
addr[i][ii]=0;
}
}

byte taddr[8];//по 8 значений для адреса
float celsius;
myOLED.clrScr();
//myOLED.setFont(SmallFont);
myOLED.update();

//for (byte i=0;i<Max1w;i++)//Опрашиваем все утройства, адреса найденные запихиваем в массив addr

byte i=0;
while ( ds.search(taddr)) //Опрашиваем все утройства, адреса найденные запихиваем в массив addr
{
//byte *uptr=&addr[i][0]; //Указатель на Нулевой элемент массива addr
//if ( !ds.search(taddr))
Serial.println(“Found!”);
//Serial.println(“Found1!”);
for (byte ii=0;ii<8;ii++)
{
addr[i][ii]=taddr[ii];
}
i++;
delay(22);
}
Serial.println(“No more addresses.”);
myOLED.print(“Chip NOT more”,LEFT,0); //выводим на него строку
myOLED.print(“Chip count”,LEFT,15); //выводим на него строку

myOLED.printNumI(i,66,15); //выводим на него строку
//Serial.println();
//Serial.println();
//Serial.println();
//ds.reset_search();
myOLED.update();

delay(800);
//return;
ds.reset_search();
delay(300);
//Serial.println(“Step_1”);

myOLED.clrScr();
for (byte i=0;i<Max1w;i++)
{
if (addr[i][0])
{
Serial.print(“Chip”);
myOLED.print(“Ch:”,LEFT,i10); //выводим на него строку
for (byte ii=0;ii<8;ii++)
{
Serial.print(addr[i][ii]);
Serial.print(" ");
myOLED.print( String(addr[i][ii], HEX) ,18+(ii
14), i*10) ;
}
}
Serial.println();
}
myOLED.update();
delay(2000);

for(byte i = 0; i < Max1w; i++)
{
myOLED.clrScr();
for (byte ii=0;ii<8;ii++)
{
taddr[ii]=addr[i][ii];
}
Serial.print(“ROM =”);
for(byte ii = 0; ii < 8; ii++)
{
Serial.write(’ ');
Serial.print(taddr[ii], HEX);

 // char charVar[sizeof(addr[i])];
 // addr[i].toCharArray(charVar, sizeof(charVar));
 //char* ptr1=&addr[i];
 //char ttt=ptr1;
  myOLED.printNumI(i,LEFT,0); //выводим на него  строку
}

//Serial.println(“Step_1”);

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

// the first ROM byte indicates which chip

switch (taddr[0])
{
case 0x10:
Serial.println(" Chip = DS18S20"); // or old DS1820
myOLED.print(“18S20”,LEFT, 14); //выводим на него строку
type_s = 1;
break;
case 0x28:
Serial.println(" Chip = DS18B20");
myOLED.print(“18B20”,LEFT,14); //выводим на него строку
type_s = 0;
break;
case 0x22:
Serial.println(" Chip = DS1822 ");
myOLED.print(“1822”,LEFT,14); //выводим на него строку
type_s = 0;
break;
default:
Serial.println(“Device is not a DS18x20 family device.”);
myOLED.print(“NOT28!!!”,LEFT,14); //выводим на него строку
return;
}

ds.reset();
ds.select(taddr);
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(taddr);
ds.write(0xBE); // Read Scratchpad

Serial.print(“present=”);
Serial.print(present, HEX);
Serial.print(" ");

Serial.print(" Data = “);
for ( byte i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(” “);
// lcd.setCursor(i*2, 1); //устанавливаем курсор
// lcd.print(“Found”); //выводим на него строку
}
Serial.println();
Serial.print(” TLSB=");
Serial.print(data[0], HEX);

Serial.print(" TMSB=");
Serial.println(data[1], HEX);

Serial.print(" CRC=");
Serial.println(OneWire::crc8(data, 8), HEX);

// 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;
Serial.print(" Temperature = “);
Serial.print(celsius);
Serial.print(” Celsius, ");
Serial.println();

myOLED.printNumF(celsius,4,RIGHT,20); //выводим на него  строку
myOLED.update();
delay(2000);

}

}

Он просто постоянно опрашивает датчики и показывает их количество. И можно быть уверенным что гирлянда работает.

PS За код не пинать, писалось наскоро и как "“временное”. Сейчас благо что в архивах нашел.

Думаю не надо ее защищать. На нее, обычную китайскую, наступить в ботинке можно и не давится.

Рекомендуется не прямо в пол замуровывать, а в гладкостенную трубу с достаточным радиусом поворота, чтобы можно было вынуть/вставить датчик при необходимости замены.

4 лайка

4 сообщения были перенесены в новую тему: У некоторых датчиков пропал type temperature

И да, у меня одна пара (два провода) - это земля, а вторая пара - питание и данные. На фото вижу подключение данных в одной паре с землей. Советую поменять. В свое время перед тем как делать много экспериментировал.

Добрый день.
Как в итоге делать нужно?
В документации на сайте сказано, что одна пара должна быть “данные земля”, вторая “питание земля”.
Вы пишете, что это неверно, и нужно “питание + данные” и земля отдельно.

Тут я неверно выразился. Сейчас открыл шкаф глянул
В основном у меня как раз так:
Пара: Оранж +VCC
БелОранж - земля
Пара: Зелен - Data
БелЗелен - земля.
Это для двупарного кабеля.

Вообще надо осциллогафом пощупать, благо дальний конц шины доступен.

Спасибо, понятно!
У меня правда обычная 5cat, с 4мя парами - 2 пары туда будет и 2 обратно, чтобы некое подобие шины организовать.