несколько DS18B20 на длинном кабеле

dts
Offline
Зарегистрирован: 01.04.2013

Пытаюсь повесить много датчиков ds18b20 на одну линию. Каждый размещен в телефонной розетке с резистором от 1,5 до 10 ком. Питание идет отдельными проводами, не паразитное. Кабель - витая пара 5е. Длина линии порядка 60м.

Проблема в том, что не могу заставить работать более 4 датчиков. Стоит подключить пятый, как скетч застревает на sensors.getDeviceCount(); Причем иногда выдает, что на линии найдено 170-200 датчиков и начинает их опрашивать. Почему так происходит? Отражение сигнала?

4 сенсора работают стабильно и без ошибок. Есть соседняя линия аж на 130м, там такие же проблемы, но начиная с 6-ти сенсоров. Ферритовый фильтр пробовал - не помогает.

Скетч из примера, который шел с библиотекой

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 8
#define TEMPERATURE_PRECISION 12

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found

DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
  delay(2000);
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		Serial.print("Found device ");
		Serial.print(i, DEC);
		Serial.print(" with address: ");
		printAddress(tempDeviceAddress);
		Serial.println();
		
		Serial.print("Setting resolution to ");
		Serial.println(TEMPERATURE_PRECISION, DEC);
		
		// set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions)
		sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
		
		 Serial.print("Resolution actually set to: ");
		Serial.print(sensors.getResolution(tempDeviceAddress), DEC); 
		Serial.println();
	}else{
		Serial.print("Found ghost device at ");
		Serial.print(i, DEC);
		Serial.print(" but could not detect address. Check power and cabling");
	}
  }

}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  // method 1 - slower
  //Serial.print("Temp C: ");
  //Serial.print(sensors.getTempC(deviceAddress));
  //Serial.print(" Temp F: ");
  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  float tempC = sensors.getTempC(deviceAddress);
  delay(500);
  Serial.print(" Temp C: ");
  Serial.println(tempC);
 // Serial.print(" Temp F: ");
 // Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  
  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
	{
		// Output the device ID
		Serial.print("Temperature for device: ");
		Serial.print(i,DEC);
		
		// It responds almost immediately. Let's print out the data
		printTemperature(tempDeviceAddress); // Use a simple function to print out the data
	} 
	//else ghost device! Check your power requirements and cabling
	
  }
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Сами догадались на каждый датчик ставить по резистору или подсказал кто?

Параллельное соединение резистров.

Шина должна быть подтянута одним резистором.

axill
Offline
Зарегистрирован: 05.09.2011

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

если заработает - вам повезло, one wire не рассчитан на такие длинные провода

maksim
Offline
Зарегистрирован: 12.02.2012

axill пишет:

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

А вот с этим можно поспорил. Я бы установил резистор на середине линии.

inspiritus
Offline
Зарегистрирован: 17.12.2012

У меня работает более 60 датчиков на витом четырехпарнике длиной около 100 метров. 

1 - паразитное питание исключено

2 - питание - пара и сигнал - пара с землей ТО ЕСТЬ НАПРИМЕР питание +/-  з/бз и синал/земля о/бо

3 - подтяжка в конце линии 4.7 кОм

4 - в конце линии емкость 100 мкФ и керамика 0.1мкФ на питании

применяется активный  покупной адаптор ( синий свисток http://www.ronsek.com/onewire.htm)

Предполагается мощный USB по питанию, в противном случае USB HUB с внешним питанием.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

axill пишет:

если заработает - вам повезло, one wire не рассчитан на такие длинные провода

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

Так на http://www.maximintegrated.com/app-notes/index.mvp/id/148 утверждают, что таки рассчитана...

Цитата:

The network radius is limited by several factors: the timing of waveform reflections, the time delay produced by the cable, the resistance of the cable, and the degradation of signal levels. The typical signal propagation speed in a phone cable is about 2/3 of the speed of light. In a 750m cable, for example, the roundtrip delay is 7.5µs. If the master pulls the line low for 7.5µs to start a read time slot, then the end of the master's low pulse (i.e., after a roundtrip) coincides with the instant at which a near-end fast slave may stop pulling the line low. Consequently, the roundtrip delay of such a long cable makes it impossible for the master to communicate with that near-end slave.
Network weight is limited by the ability of the cable to be charged and discharged quickly enough to satisfy the 1-Wire protocol. A simple resistor pullup has a weight limitation of about 200m. Sophisticated 1-Wire master designs have overcome this limitation by using active pullups, that provide higher currents under logic control and have extended the maximum supportable weight to over 500m.
axill
Offline
Зарегистрирован: 05.09.2011

Andrey_Y_Ostanovsky пишет:

тает - вам повезло, one wire не рассчитан на такие длинные провода

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

Цитата:
Abstract: The 1-Wire® protocol was originally designed to facilitate communication with nearby devices on a short connection. 1-Wire was also a way to add auxiliary memory on a single microprocessor port pin. Methods were later developed to extend the 1-Wire protocol to network applications well beyond the size of a circuit board. This document discusses various aspects of 1-Wire networks and provides design guidelines for their reliable operation. Several appendices address fine-tuning the 1-Wire bus interface and illustrate 1-Wire communication waveforms in various conditions.

Цитата:

Так на http://www.maximintegrated.com/app-notes/index.mvp/id/148 утверждают, что таки рассчитана...

прочтите внимательнее и не выдергивайте из контекста. Общий смысл статьи по вашей ссылке - "не расчитана, но при определенных условиях может применяться". Я ж не против. многое что применяется не так как изначально расчитано. Моя фраза лишь была призвана вселить долю скептического прагматизма, предупредить, что нет гарантированного решения.

А статья интересная, все весьма подробно разложено как делать как не стоит делать. Была бы необходимость так далеко разносить датчики - пригодилась бы. Думаю автору топика как раз стоит прочитать. Интересно что предлагается исключать "звезду", так же предлагается отключать не активные линии на время коммуникации

axill
Offline
Зарегистрирован: 05.09.2011

maksim пишет:

А вот с этим можно поспорил. Я бы установил резистор на середине линии.

а я не буду спорить)) по ссылке Andrey_Y_Ostanovsky все равно все куда круче расписано, чем мы в состоянии описать здесь

dts
Offline
Зарегистрирован: 01.04.2013

maksim пишет:

Шина должна быть подтянута одним резистором.

во многих перелопаченных мной ресурсах пишут, что лучше ставить резистор как можно ближе к датчику, причем номинал можно опускать до 400 Ом на дальнем конце. Более того, я пробовал с одним резистором на всех - датчики вообще не находятся. Опытным путём пришел к тому, что лучше хоть какой то резистор поставить около датчика, хотя бы 20 кОм.

 

axill пишет:

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

если заработает - вам повезло, one wire не рассчитан на такие длинные провода

Dallas пишет, что до 500 метров может работать с активной подтяжкой и до 200 м с простой. Линия в 133 метра у меня работает без проблем.

У меня проблема в том, что на линии, похоже, "звон". Ардуино находит датчики, которых не существует. Пробовал поставить резистор 10 Ом на линию данных - безуспешно, вообще перестают определяться все сразу. Осциллографа пока не имею, чтобы посмотреть в линию. Вероятно, нужен какой-то терминатор на конце, я в таких вещах не силен. С питанием на дальнем конце порядок, 5,03В.

Жду защиту DS9503, но надежды мало на неё.

Вот кстати перевод рекомендаций от Dallas

axill
Offline
Зарегистрирован: 05.09.2011

dts вы выше пишите что с линией 130 м у вас тоже проблемы )) определитесь уже есть проблемы или нет

не увидел явного указания в рекоменлациях но на схемам подтяжка нарисована около МК.

10 Ом поддятжка - это слишком. Нога mega тянет 20ма, а это при 5в сопротивление не меньше 250 ом (включая конечно сопротивление линии если "на том конце")

вместо осциилографа подумайте насчет логического анализатора, китайские аналоги стоят 300р, они умеют one-wire смотреть

dts
Offline
Зарегистрирован: 01.04.2013

axill пишет:

dts вы выше пишите что с линией 130 м у вас тоже проблемы )) определитесь уже есть проблемы или нет

не увидел явного указания в рекоменлациях но на схемам подтяжка нарисована около МК.

10 Ом поддятжка - это слишком. Нога mega тянет 20ма, а это при 5в сопротивление не меньше 250 ом (включая конечно сопротивление линии если "на том конце")

вместо осциилографа подумайте насчет логического анализатора, китайские аналоги стоят 300р, они умеют one-wire смотреть

130м в принципе-то работает, хотя много датчиков не вешаются. Это к тому, что "не расчитана на такие расстояния и не будет работать".

В нескольких местах видел про резисторы ближе к датчику, ибо линию притягивает не только avr, но и датчик. У меня с резистором ближе к контроллеру не заводится больше 1-2 датчиков, а с резисторами в каждом датчике бывало и 8 шт работали на 20-30м линии.

10 Ом не подтяжка, а в разрыв, для подавления звона. В документе AN148 есть схема, где 100 Ом в разрыв стоит.

axill
Offline
Зарегистрирован: 05.09.2011

насчет 10ом понятно, не так понял. Еще раз пролистал статью - пишется, что поиск самое сложное что происходит в сети one-wire. Разве нельзя заранее собрать все ID с сети и не делать поиск? прошить адреса в скетч и обращаться напрямую после ресета сети. Судя по статье это снимет кучу проблем

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

axill пишет:

Цитата:

Abstract: The 1-Wire® protocol was originally designed to facilitate communication with nearby devices on a short connection. 1-Wire was also a way to add auxiliary memory on a single microprocessor port pin. Methods were later developed to extend the 1-Wire protocol to network applications well beyond the size of a circuit board.

прочтите внимательнее и не выдергивайте из контекста.

Вот именно, не выдергивайте! Второе предложение из Вашей же квоты дает нам уточнения, что "протокол позже был доработан так, чтобы его можно было применять в сетевых приложениях далеко за пределами размеров платы". Читайте внимательнее хотя бы то, что сами пишете. :)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

dts пишет:

130м в принципе-то работает, хотя много датчиков не вешаются.

Либо емкость провода превышаете, либо по таймингам что-то не успевает... Вот эту статью, надеюсь, читали?

axill
Offline
Зарегистрирован: 05.09.2011

Andrey_Y_Ostanovsky пишет:

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

был не прав, да здравствуют датчики на длинныз проводах! )

dts
Offline
Зарегистрирован: 01.04.2013

Andrey_Y_Ostanovsky пишет:

dts пишет:

130м в принципе-то работает, хотя много датчиков не вешаются.

Либо емкость провода превышаете, либо по таймингам что-то не успевает... Вот эту статью, надеюсь, читали?

читали, увы нету экранированного кабеля и ферритовых фильтров, в остальном всё тоже.

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

axill пишет:

насчет 10ом понятно, не так понял. Еще раз пролистал статью - пишется, что поиск самое сложное что происходит в сети one-wire. Разве нельзя заранее собрать все ID с сети и не делать поиск? прошить адреса в скетч и обращаться напрямую после ресета сети. Судя по статье это снимет кучу проблем

как показывает практика с еще одной линией, если датчики плохо ищутся - они плохо работают в дальнейшем, при обращении по зашитым адресам где-то в 30-40% выдается ошибка чтения (-127С). Хочу наконец разобраться в чем дело.

 

axill
Offline
Зарегистрирован: 05.09.2011

dts пишет:

как показывает практика с еще одной линией, если датчики плохо ищутся - они плохо работают в дальнейшем, при обращении по зашитым адресам где-то в 30-40% выдается ошибка чтения (-127С). Хочу наконец разобраться в чем дело.

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

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

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

dts пишет:

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

Там полтора файла: Ищем что-то типа "delayMicroseconds(500);" в функции OneWire::reset и немного меняем в ту или иную сторону... Там три параметра задержек.Вот тут http://robocraft.ru/blog/communication/117.html - про эти тайминги расписано.

dts
Offline
Зарегистрирован: 01.04.2013

Использую библиотеку OneWire.h, других не пробовал. С другими, наверно, отвалится библиотека DallasTemperature.h, придется лопатить кода много.

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







--- OneWire_orig.cpp    2008-05-20 02:10:54.000000000 +0200
+++ OneWire.cpp 2009-04-14 19:30:58.000000000 +0200
@@ -115,8 +115,8 @@
 // more certain timing.
 //
 void OneWire::write_bit(uint8_t v) {
-    static uint8_t lowTime[] = { 55, 5 };
-    static uint8_t highTime[] = { 5, 55};
+    static uint8_t lowTime[] = { 60, 8 };
+    static uint8_t highTime[] = { 8, 60};
     
     v = (v&1);
     *modeReg |= bitmask;  // make pin an output, do first since we
@@ -137,7 +137,7 @@
     
     *modeReg |= bitmask;    // make pin an output, do first since we expect to be at 1
     *outputReg &= ~bitmask; // zero
-    delayMicroseconds(1);
+    delayMicroseconds(3);
     *modeReg &= ~bitmask;     // let pin float, pull up will raise
     delayMicroseconds(5);          // A "read slot" is when 1mcs > t > 2mcs
     r = ( *inputReg & bitmask) ? 1 : 0; // check the bit

отсюда, там же пишут про два резистора, на обоих концах линии.

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

И чего вы тут переливаете из пустого в порожнее, я же дал работающий рецепт, в котором учтены и помехи применеием витых пар , и терминирование, и активная подтяжка, и питание.

inspiritus пишет:

У меня работает более 60 датчиков на витом четырехпарнике длиной около 100 метров. 

1 - паразитное питание исключено

2 - питание - пара и сигнал - пара с землей ТО ЕСТЬ НАПРИМЕР питание +/-  з/бз и синал/земля о/бо

3 - подтяжка в конце линии 4.7 кОм

4 - в конце линии емкость 100 мкФ и керамика 0.1мкФ на питании

применяется активный  покупной адаптор ( синий свисток http://www.ronsek.com/onewire.htm)

Предполагается мощный USB по питанию, в противном случае USB HUB с внешним питанием.

axill
Offline
Зарегистрирован: 05.09.2011

inspiritus пишет:

И чего вы тут переливаете из пустого в порожнее, я же дал работающий рецепт, в котором учтены и помехи применеием витых пар , и терминирование, и активная подтяжка, и питание.

вдруг пригодиться. Конденсаторы именно на дальнем конце линии или у каждого датчика?

inspiritus
Offline
Зарегистрирован: 17.12.2012

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

признак нехватки питания в момент преобразования - температура 87 грС .

dts
Offline
Зарегистрирован: 01.04.2013

inspiritus пишет:

применяется активный  покупной адаптор ( синий свисток http://www.ronsek.com/onewire.htm)

я к ардуине подключаю, юсб адаптер не нужен. В usb адаптере, полагаю, DS2480B стоит, с активной подтяжкой.

Пока понятной схемы активной подтяжки не нашел, везде она в связке с паразитным питанием или я чето не понимаю.

axill
Offline
Зарегистрирован: 05.09.2011

dts у вас провода подсоеденены как inspiritus рекомендовал? мне кажется этио очень важно чтобы каждый провод шел в переплетении с землей, это аналог экранирования получается

dts
Offline
Зарегистрирован: 01.04.2013

у меня всего две пары в кабеле, одна пара питание и земля, вторая - две 1-wire линии, которые через 30м расходятся в разные стороны, в одном датчике есть 0,1мкф пленочный кондер между землей и 5в.

Питания хватает, если его мало, то датчик выдает 85 градусов. У меня же периодически выдается -127 градусов. Это вроде ошибка CRC или нечто подобное.

Может у кого есть пример работы ардуино с ds18b20 через драйвер линии ds2480?

axill
Offline
Зарегистрирован: 05.09.2011

dts пишет:

у меня всего две пары в кабеле, одна пара питание и земля, вторая - две 1-wire линии, которые через 30м расходятся в разные стороны, в одном датчике есть 0,1мкф пленочный кондер между землей и 5в.

вы сами себя прочитайте )) у вас в паре две сигнальных линии! они же наводят помехи одна на другую

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

dts
Offline
Зарегистрирован: 01.04.2013

axill пишет:

dts пишет:

у меня всего две пары в кабеле, одна пара питание и земля, вторая - две 1-wire линии, которые через 30м расходятся в разные стороны, в одном датчике есть 0,1мкф пленочный кондер между землей и 5в.

вы сами себя прочитайте )) у вас в паре две сигнальных линии! они же наводят помехи одна на другую

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

2 линии работают не одновременно, более того ситуация не меняется, если одну из них отключить вообще. Так что взаимовлияние двух сигнальных проводов в паре минимально.

Просадки питания нет, 4 датчика работают, даже если все их воткнуть на конец линии. Не работает поиск устройств в линии, если их больше 4х. Измерение по зашитым адресам еще не проверял.

dts
Offline
Зарегистрирован: 01.04.2013

вот схемка active pullup от Далласа, мне только непонятно, что за slew-rate control пин и что с ним делать

maksim
Offline
Зарегистрирован: 12.02.2012

dts пишет:

2 линии работают не одновременно, более того ситуация не меняется, если одну из них отключить вообще. Так что взаимовлияние двух сигнальных проводов в паре минимально.

Слышали когда нибудь про волновое сопртивление

Вам уже дали несколько способов решения вашей проблемы, а вы их попросту игнорируете и продолжаете стоять на своем и мудрить какие-то фильтры, активные подтяжки и т.д и т.п. Ну продолжайте дальше мудрить... как говориться - если долго мучиться....

dts
Offline
Зарегистрирован: 01.04.2013

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

axill
Offline
Зарегистрирован: 05.09.2011

dts пишет:
не вижу ни одного способа решения, у меня всё уже так, как написано, за исключением экранированного кабеля и земли в паре с сигналом.

я буду утрировать :)

"не вижу решения, у меня все практически так же как рекомендуют - двигатель есть, коробка передачь есть, колес правда нет. Но это ерунда, почему не едет? было у кого такое?"

maksim
Offline
Зарегистрирован: 12.02.2012

dts пишет:

... за исключением экранированного кабеля и земли в паре с сигналом. Хотя это вроде к волновому сопротивлению не относится. Для минимизации эффекта волнового сопртивления нужно согласовать линию.

Вот это и игнорируете. Волновое сопротивление это не эффект. Провода и их положение друг относительно друга к волновому сопротивлению имеют самое что не на есть прямое отношение. А резисторы тут не при чем.

inspiritus
Offline
Зарегистрирован: 17.12.2012

А что собственно с формой сигнала, чем Вы ее смотрели ?

dts
Offline
Зарегистрирован: 01.04.2013

нечем смотреть, но полагаю ничего хорошего там нет

inspiritus
Offline
Зарегистрирован: 17.12.2012

Ети датчики работают кажется от 3.5 и до 5 вольт питания (непаразитное только !!!) 

если неопределяются и подозрения на фронты , нужно гарантированно 5 в.

пропустите по свободной паре 12в и на дальнем конце поставьте 7805 с электролитом и керамикой по входу и выходу ...

 И наступит щастие ;) 

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Господа, а DS2482-100 для работы с DS18B20 кто-то пробовал использовать? Будет ли толк на длинной линии?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Сделал активную подтяжку по такой схеме:

На столе линия из кучи кусков разношерстных кабелей заработала (без этого не работала). На следующей неделе попробуем на объекте.

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

Знаменитая схема, красивая!

А не пробовали без неё, но с резистором 1 ком  к питанию? Я смотрел осциллографом- там полная "грязь" но при этом куча датчиков прекрасно работает уже года 3..... Главное в "звезду" не делать длинные линии одинаковой длины. Тогда лучьше их на разные ножки процессора рассадить...

И, насколько я понимаю, резистор должен стоять не на конце линии , а на стороне контроллера

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Подтягивающий резистор уменьшал, но это слабо помогает. А звезду, само собой, лучше не делать вообще.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

На объекте все работает, схемой удовлетворен.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

деллллл..

Sherzod
Offline
Зарегистрирован: 17.04.2016

Аналогичная проблема:

Ради интереса собрал несколько разного типа датчиков температуры:
1. DS18B20 (2 штуки - один для улицы, второй для дома)
2. DHT22
3. NTC термистор

Все три датчика стоят на улице (на подоконнике), а второй DS18B20 дома рядом с ардуино. От всех датчиков получаю нормальную информацию, кроме уличного DS18B20. Вот схемку набросал:

Кабель витая пара 5е (экранированного кабеля к сожалению нет). Читал в теме что сигнал должен идти в паре с землей, распаял и запаял так. Все равно результата нет. В скетче адреса датчиков указаны, так что на опрос время не теряется. Но все равно в конец loop() добавил delay(10) типа может данные не успевает доходить. Все равно не помогло. Пробовал к уличному спаять еще один резистор 4,7кОм и отдельно от домашнего датчика подключить. Тоже вроде не помогло (почему вроде? уже 2 часа ночи было и пайку может нормально не сделал, в общем человеческий фактор, если это поможет при диагностики проблемы, то попробую заново конечно). 

Что тут не так? Помогите пожалуйста экономисту, который не шарит в электронике.

P.S. Как тут скетч можно заспойлирить? А то слишком много строк.

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

Sherzod пишет:

P.S. Как тут скетч можно заспойлирить? А то слишком много строк.

Через кнопку CODE в редакторе, с настройках там же и спрятать (свернуть)

Sherzod
Offline
Зарегистрирован: 17.04.2016

http://mk90.blogspot.ru/2011/04/1-wire.html - нашел интересную статью. Думаю проблема в тонкой кабели ethernet. Попробую запитать кабелем более толстым сечением.

Скетч

#include <EtherCard.h>
#include "DHT.h"
#include <OneWire.h>
#include <DallasTemperature.h>

//Константы
#define DHTPIN 2                  // DHT пин
#define DHTTYPE DHT22
#define ONE_WIRE_BUS 3            // One-wire пин
/* NTC Термистор */
#define THERMISTORPIN A0          // аналоговый пин
#define THERMISTORNOMINAL 10000   // сопротивление при 25 градусах по Цельсию
#define TEMPERATURENOMINAL 25     // temp. для номинального сопротивления (практически всегда равна 25 C)
#define NUMSAMPLES 5              // сколько показаний используем для определения среднего значения
#define BCOEFFICIENT 3950         // бета коэффициент термистора (обычно 3000-4000)
#define SERIESRESISTOR 10000      // сопротивление второго резистора
/* Датчик дождя */
#define rainSensePin A1        // аналоговый пин - вход для подключения аналогового выхода сенсора

DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = { 0x28, 0x66, 0xAD, 0x03, 0x00, 0x00, 0x80, 0xB4 };  //IN  2866AD03000080B4
DeviceAddress Thermometer2 = { 0x28, 0xD5, 0xA8, 0x03, 0x00, 0x00, 0x80, 0x38 };  //OUT 28D5A80300008038

int samples[NUMSAMPLES];

static byte mymac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 };
static byte myip[] = { 192, 168, 1, 203 };

byte Ethernet::buffer[500];
BufferFiller bfill;

void setup () {
  Serial.begin(9600);
  dht.begin();
  sensors.setResolution(Thermometer1, ONE_WIRE_BUS);
  sensors.setResolution(Thermometer2, ONE_WIRE_BUS);
  pinMode(rainSensePin, INPUT);
  analogReference(EXTERNAL);

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println(F("Failed to access Ethernet controller"));
  ether.staticSetup(myip);
}

static word homePage() {
  /* DHT */
  float dht_t = dht.readTemperature();
  float dht_h = dht.readHumidity();

  int dhtt_x = floor(dht_t);
  float dhtt_y_f = (dht_t - dhtt_x) * 10;
  int dhtt_y = int(dhtt_y_f);

  int dhth_x = floor(dht_h);
  float dhth_y_f = (dht_h - dhth_x) * 10;
  int dhth_y = int(dhth_y_f);

  /* DS18B20 x2 */
  sensors.requestTemperatures();
  float ds_in = sensors.getTempC(Thermometer1);
  float ds_out = sensors.getTempC(Thermometer2);

  int ds_in_x = floor(ds_in);
  float ds_in_y_f = (ds_in - ds_in_x) * 10;
  int ds_in_y = int(ds_in_y_f);

  int ds_out_x = floor(ds_out);
  float ds_out_y_f = (ds_out - ds_out_x) * 10;
  int ds_out_y = int(ds_out_y_f);

  /* NTC */
  uint8_t i;
  float average;

  // сводим показания в вектор с небольшой задержкой между снятием показаний
  for (i = 0; i < NUMSAMPLES; i++) {
    samples[i] = analogRead(THERMISTORPIN);
    delay(10);
  }

  // рассчитываем среднее значение
  average = 0;
  for (i = 0; i < NUMSAMPLES; i++) {
    average += samples[i];
  }
  average /= NUMSAMPLES;

  // конвертируем значение в сопротивление
  average = 1023 / average - 1;
  average = SERIESRESISTOR / average;

  float steinhart;
  steinhart = average / THERMISTORNOMINAL; // (R/Ro)
  steinhart = log(steinhart); // ln(R/Ro)
  steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart; // инвертируем
  steinhart -= 273.15; // конвертируем в градусы по Цельсию
  //int ntc = round(steinhart);

  int ntc_x = floor(steinhart);
  float ntc_y_f = (steinhart - ntc_x) * 10;
  int ntc_y = int(ntc_y_f);

  /* Датчик дождя */
  int rainSense = analogRead(rainSensePin); // 1023 - если нет дождя, 0 - если ливень
  rainSense = round(abs(rainSense - 1023) * 100 / 1023);

  bfill = ether.tcpOffset();
  bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
                    "Content-Type: text/html\r\n"
                    "Pragma: no-cache\r\n"
                    "\r\n"
                    "<title>Meteo Info</title>\n"
                    "<h1>DS18B20 OUT: $D,$D *C</h1>\n"
                    "<h1>DS18B20 IN: $D,$D *C</h1>\n"
                    "<h1>NTC Termistor: $D,$D *C</h1>\n"
                    "<h1>DHT Temperature: $D,$D *C</h1>\n"
                    "<h1>DHT Humidity: $D,$D %</h1>\n"
                    "<h1>Rain Level: $D %</h1>"),
               ds_out_x, ds_out_y, ds_in_x, ds_in_y, ntc_x, ntc_y, dhtt_x, dhtt_y, dhth_x, dhth_y, rainSense);

  return bfill.position();
}

void loop () {
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);

  if (pos)  // check if valid tcp data is received
    ether.httpServerReply(homePage()); // send web page data

  delay(10);
}

 

Sherzod
Offline
Зарегистрирован: 17.04.2016

Вопрос снят. Все оказался очень просто (2 дня бился как же не просто). Причина - плохая пайка. Где тут смайлик который очень стесняется

cypor
Offline
Зарегистрирован: 05.03.2018

Начитался страшилок о том что не работают датчики на длинных линиях. Тут собрано немного теории более простыми словами. Провел тестирование Кабель utp 0.52 мм2 - 300 м в бухте линии землю-данные и питание спаривал для увеличения сечения, датчики DS18B20 - 5 шт, мастер DS9490R. Все работает идеально. Приступил к монтажу линия 60 м и 27 датчиков, очень надеюсь что все запуститься

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

cypor пишет:
Провел тестирование Кабель utp 0.52 мм2 - 300 м в бухте ...

...Приступил к монтажу линия 60 м и 27 датчиков, очень надеюсь что все запуститься

Самое плохое это не расстояние, а помехи.

cypor пишет:
...мастер DS9490R...

И каким боком это к ардуино?

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

KVadik пишет:
Самое плохое это не расстояние, а помехи.

Самое плохое это не помехи, а ёмкость кабеля.

dts
Offline
Зарегистрирован: 01.04.2013

cypor пишет:

Провел тестирование Кабель utp 0.52 мм2 - 300 м в бухте

Я, помню, тоже тестировал с бухтой - всё было нормально. Стоило размотать по помещениям с серверами (~60 м) начались глюки. Причем, на ту же ардуину приходит линия в 120 м с 4 шт DS18b20 - всё ок, а вторая с 4 шт в 2 раза короче - глючит. Решения, кроме как завести несколько линий 1-wire, я тогда не нашёл, но это не очень критично было. Поэтому так и живёт с тех пор)

Technolog
Offline
Зарегистрирован: 19.11.2014

 Преобразователь уровней 0...5V 1-wire <--> -5...+5V RS485 >> длинный-длинный кабель >> до 30-ти преобразователей уровней  -5...+5V RS485 <--> 0...5V 1-wire >> много датчиков DS18B20 на коротком кабеле возле каждого преобразователя.

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

Почему все тянут "чистый" 1-ware подтяжками и не используют указанный метод? От незнания или нехотения без трудностей?

Подтяжки здесь, с подписью: "И обратить внимание на нормальную схемотехнику, даже если она кажется загадочной". Точней не скажешь.

NinoZombie
Offline
Зарегистрирован: 11.03.2018

Technolog пишет:

 Преобразователь уровней 0...5V 1-wire <--> -5...+5V RS485 >> длинный-длинный кабель >> до 30-ти преобразователей уровней  -5...+5V RS485 <--> 0...5V 1-wire >> много датчиков DS18B20 на коротком кабеле возле каждого преобразователя.

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

Почему все тянут "чистый" 1-ware подтяжками и не используют указанный метод? От незнания или нехотения без трудностей?

Подтяжки здесь, с подписью: "И обратить внимание на нормальную схемотехнику, даже если она кажется загадочной". Точней не скажешь.


Спасибо за Ваш совет! Выглядит очень интересным, но можете, пожалуйста, объяснить "на пальцах"(или ссылку дать), как сделать такой преобразователь уровней? Или, лучше всего, ссылку на такой преобразователь на алиэкспрессе? :)