несколько DS18B20 на длинном кабеле
- Войдите на сайт для отправки комментариев
Пытаюсь повесить много датчиков 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); } }
Сами догадались на каждый датчик ставить по резистору или подсказал кто?
Параллельное соединение резистров.
Шина должна быть подтянута одним резистором.
и что важно - этот ежинственный резистор нужно ставить как можно ближе к МК, а не как у вас - ближе к датчику
если заработает - вам повезло, one wire не рассчитан на такие длинные провода
и что важно - этот ежинственный резистор нужно ставить как можно ближе к МК, а не как у вас - ближе к датчику
А вот с этим можно поспорил. Я бы установил резистор на середине линии.
У меня работает более 60 датчиков на витом четырехпарнике длиной около 100 метров.
1 - паразитное питание исключено
2 - питание - пара и сигнал - пара с землей ТО ЕСТЬ НАПРИМЕР питание +/- з/бз и синал/земля о/бо
3 - подтяжка в конце линии 4.7 кОм
4 - в конце линии емкость 100 мкФ и керамика 0.1мкФ на питании
применяется активный покупной адаптор ( синий свисток http://www.ronsek.com/onewire.htm)
Предполагается мощный USB по питанию, в противном случае USB HUB с внешним питанием.
если заработает - вам повезло, one wire не рассчитан на такие длинные провода
Не пишите глупостей без подтверждения их ссылками на первоисточник.
Так на http://www.maximintegrated.com/app-notes/index.mvp/id/148 утверждают, что таки рассчитана...
тает - вам повезло, one wire не рассчитан на такие длинные провода
почему многие так любят ярлыки вешать? в первом параграфе по вашей ссылке написано подтвердение моих слов. Вы привыкли выдергивать слова из контекста? В первом параграфе написано, что изначально 1-wire разрабатывался для коротких линий, чуть ли не для коммуникации в рамках одной платы. Это то о чем я пишу. Вот цитата:
Так на http://www.maximintegrated.com/app-notes/index.mvp/id/148 утверждают, что таки рассчитана...
прочтите внимательнее и не выдергивайте из контекста. Общий смысл статьи по вашей ссылке - "не расчитана, но при определенных условиях может применяться". Я ж не против. многое что применяется не так как изначально расчитано. Моя фраза лишь была призвана вселить долю скептического прагматизма, предупредить, что нет гарантированного решения.
А статья интересная, все весьма подробно разложено как делать как не стоит делать. Была бы необходимость так далеко разносить датчики - пригодилась бы. Думаю автору топика как раз стоит прочитать. Интересно что предлагается исключать "звезду", так же предлагается отключать не активные линии на время коммуникации
А вот с этим можно поспорил. Я бы установил резистор на середине линии.
а я не буду спорить)) по ссылке Andrey_Y_Ostanovsky все равно все куда круче расписано, чем мы в состоянии описать здесь
Шина должна быть подтянута одним резистором.
во многих перелопаченных мной ресурсах пишут, что лучше ставить резистор как можно ближе к датчику, причем номинал можно опускать до 400 Ом на дальнем конце. Более того, я пробовал с одним резистором на всех - датчики вообще не находятся. Опытным путём пришел к тому, что лучше хоть какой то резистор поставить около датчика, хотя бы 20 кОм.
и что важно - этот ежинственный резистор нужно ставить как можно ближе к МК, а не как у вас - ближе к датчику
если заработает - вам повезло, one wire не рассчитан на такие длинные провода
Dallas пишет, что до 500 метров может работать с активной подтяжкой и до 200 м с простой. Линия в 133 метра у меня работает без проблем.
У меня проблема в том, что на линии, похоже, "звон". Ардуино находит датчики, которых не существует. Пробовал поставить резистор 10 Ом на линию данных - безуспешно, вообще перестают определяться все сразу. Осциллографа пока не имею, чтобы посмотреть в линию. Вероятно, нужен какой-то терминатор на конце, я в таких вещах не силен. С питанием на дальнем конце порядок, 5,03В.
Жду защиту DS9503, но надежды мало на неё.
Вот кстати перевод рекомендаций от Dallas
dts вы выше пишите что с линией 130 м у вас тоже проблемы )) определитесь уже есть проблемы или нет
не увидел явного указания в рекоменлациях но на схемам подтяжка нарисована около МК.
10 Ом поддятжка - это слишком. Нога mega тянет 20ма, а это при 5в сопротивление не меньше 250 ом (включая конечно сопротивление линии если "на том конце")
вместо осциилографа подумайте насчет логического анализатора, китайские аналоги стоят 300р, они умеют one-wire смотреть
dts вы выше пишите что с линией 130 м у вас тоже проблемы )) определитесь уже есть проблемы или нет
не увидел явного указания в рекоменлациях но на схемам подтяжка нарисована около МК.
10 Ом поддятжка - это слишком. Нога mega тянет 20ма, а это при 5в сопротивление не меньше 250 ом (включая конечно сопротивление линии если "на том конце")
вместо осциилографа подумайте насчет логического анализатора, китайские аналоги стоят 300р, они умеют one-wire смотреть
130м в принципе-то работает, хотя много датчиков не вешаются. Это к тому, что "не расчитана на такие расстояния и не будет работать".
В нескольких местах видел про резисторы ближе к датчику, ибо линию притягивает не только avr, но и датчик. У меня с резистором ближе к контроллеру не заводится больше 1-2 датчиков, а с резисторами в каждом датчике бывало и 8 шт работали на 20-30м линии.
10 Ом не подтяжка, а в разрыв, для подавления звона. В документе AN148 есть схема, где 100 Ом в разрыв стоит.
насчет 10ом понятно, не так понял. Еще раз пролистал статью - пишется, что поиск самое сложное что происходит в сети one-wire. Разве нельзя заранее собрать все ID с сети и не делать поиск? прошить адреса в скетч и обращаться напрямую после ресета сети. Судя по статье это снимет кучу проблем
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.
прочтите внимательнее и не выдергивайте из контекста.
Вот именно, не выдергивайте! Второе предложение из Вашей же квоты дает нам уточнения, что "протокол позже был доработан так, чтобы его можно было применять в сетевых приложениях далеко за пределами размеров платы". Читайте внимательнее хотя бы то, что сами пишете. :)
130м в принципе-то работает, хотя много датчиков не вешаются.
Либо емкость провода превышаете, либо по таймингам что-то не успевает... Вот эту статью, надеюсь, читали?
Второе предложение из Вашей же квоты дает нам уточнения, что "протокол позже был доработан так, чтобы его можно было применять в сетевых приложениях далеко за пределами размеров платы".
был не прав, да здравствуют датчики на длинныз проводах! )
130м в принципе-то работает, хотя много датчиков не вешаются.
Либо емкость провода превышаете, либо по таймингам что-то не успевает... Вот эту статью, надеюсь, читали?
читали, увы нету экранированного кабеля и ферритовых фильтров, в остальном всё тоже.
Задержки где-то в недрах библиотеки заданы, копать в таких местах я не умею.
насчет 10ом понятно, не так понял. Еще раз пролистал статью - пишется, что поиск самое сложное что происходит в сети one-wire. Разве нельзя заранее собрать все ID с сети и не делать поиск? прошить адреса в скетч и обращаться напрямую после ресета сети. Судя по статье это снимет кучу проблем
как показывает практика с еще одной линией, если датчики плохо ищутся - они плохо работают в дальнейшем, при обращении по зашитым адресам где-то в 30-40% выдается ошибка чтения (-127С). Хочу наконец разобраться в чем дело.
как показывает практика с еще одной линией, если датчики плохо ищутся - они плохо работают в дальнейшем, при обращении по зашитым адресам где-то в 30-40% выдается ошибка чтения (-127С). Хочу наконец разобраться в чем дело.
в статье пишеться, что процесс поиска более чувствителен к помехам, потому, что в логике его работы могут возникать колизии между устроставами сети. По логике выходит, что у вас помех на линии так много, что чувствительным к этим помехам становится не только поиск но и обмен.
вопрос глупый. Не пробовали другую библиотеку? Везде протокол реализован програмно с програмными задержками и по моей практике разные библиотеки таки дают немного разный результат. Например первая библиотека с которой работыл был очень чувствительна к наличию прерываний по таймеру и через раз (на коротких проводах) давала код ошибки. Та, которую сейчас использую - чувствительности к прерываниям не обнаружена.
Задержки где-то в недрах библиотеки заданы, копать в таких местах я не умею.
Там полтора файла: Ищем что-то типа "delayMicroseconds(500);" в функции OneWire::reset и немного меняем в ту или иную сторону... Там три параметра задержек.Вот тут http://robocraft.ru/blog/communication/117.html - про эти тайминги расписано.
Использую библиотеку OneWire.h, других не пробовал. С другими, наверно, отвалится библиотека DallasTemperature.h, придется лопатить кода много.
нарыл вот изменение задержек в библиотеке, буду пробовать
отсюда, там же пишут про два резистора, на обоих концах линии.
И чего вы тут переливаете из пустого в порожнее, я же дал работающий рецепт, в котором учтены и помехи применеием витых пар , и терминирование, и активная подтяжка, и питание.
У меня работает более 60 датчиков на витом четырехпарнике длиной около 100 метров.
1 - паразитное питание исключено
2 - питание - пара и сигнал - пара с землей ТО ЕСТЬ НАПРИМЕР питание +/- з/бз и синал/земля о/бо
3 - подтяжка в конце линии 4.7 кОм
4 - в конце линии емкость 100 мкФ и керамика 0.1мкФ на питании
применяется активный покупной адаптор ( синий свисток http://www.ronsek.com/onewire.htm)
Предполагается мощный USB по питанию, в противном случае USB HUB с внешним питанием.
И чего вы тут переливаете из пустого в порожнее, я же дал работающий рецепт, в котором учтены и помехи применеием витых пар , и терминирование, и активная подтяжка, и питание.
вдруг пригодиться. Конденсаторы именно на дальнем конце линии или у каждого датчика?
На дальнем, хотя на одной из линий с 86 датчиками питание не тянуло и пришлось провешивать электролиты через каждые пять метров.
признак нехватки питания в момент преобразования - температура 87 грС .
применяется активный покупной адаптор ( синий свисток http://www.ronsek.com/onewire.htm)
я к ардуине подключаю, юсб адаптер не нужен. В usb адаптере, полагаю, DS2480B стоит, с активной подтяжкой.
Пока понятной схемы активной подтяжки не нашел, везде она в связке с паразитным питанием или я чето не понимаю.
dts у вас провода подсоеденены как inspiritus рекомендовал? мне кажется этио очень важно чтобы каждый провод шел в переплетении с землей, это аналог экранирования получается
у меня всего две пары в кабеле, одна пара питание и земля, вторая - две 1-wire линии, которые через 30м расходятся в разные стороны, в одном датчике есть 0,1мкф пленочный кондер между землей и 5в.
Питания хватает, если его мало, то датчик выдает 85 градусов. У меня же периодически выдается -127 градусов. Это вроде ошибка CRC или нечто подобное.
Может у кого есть пример работы ардуино с ds18b20 через драйвер линии ds2480?
у меня всего две пары в кабеле, одна пара питание и земля, вторая - две 1-wire линии, которые через 30м расходятся в разные стороны, в одном датчике есть 0,1мкф пленочный кондер между землей и 5в.
вы сами себя прочитайте )) у вас в паре две сигнальных линии! они же наводят помехи одна на другую
к тому же если я правильно понял конденсаторы нужны не для питания как такового, а для исключения просадки питания около датчика в моменты его активности. Пленочный конденсатор не замена керамическому - этот нужен для снижения помех. Так же он не замена хорошему элетролиту - этот избавит от просадки
у меня всего две пары в кабеле, одна пара питание и земля, вторая - две 1-wire линии, которые через 30м расходятся в разные стороны, в одном датчике есть 0,1мкф пленочный кондер между землей и 5в.
вы сами себя прочитайте )) у вас в паре две сигнальных линии! они же наводят помехи одна на другую
к тому же если я правильно понял конденсаторы нужны не для питания как такового, а для исключения просадки питания около датчика в моменты его активности. Пленочный конденсатор не замена керамическому - этот нужен для снижения помех. Так же он не замена хорошему элетролиту - этот избавит от просадки
2 линии работают не одновременно, более того ситуация не меняется, если одну из них отключить вообще. Так что взаимовлияние двух сигнальных проводов в паре минимально.
Просадки питания нет, 4 датчика работают, даже если все их воткнуть на конец линии. Не работает поиск устройств в линии, если их больше 4х. Измерение по зашитым адресам еще не проверял.
вот схемка active pullup от Далласа, мне только непонятно, что за slew-rate control пин и что с ним делать
2 линии работают не одновременно, более того ситуация не меняется, если одну из них отключить вообще. Так что взаимовлияние двух сигнальных проводов в паре минимально.
Вам уже дали несколько способов решения вашей проблемы, а вы их попросту игнорируете и продолжаете стоять на своем и мудрить какие-то фильтры, активные подтяжки и т.д и т.п. Ну продолжайте дальше мудрить... как говориться - если долго мучиться....
не вижу ни одного способа решения, у меня всё уже так, как написано, за исключением экранированного кабеля и земли в паре с сигналом. Хотя это вроде к волновому сопротивлению не относится. Для минимизации эффекта волнового сопртивления нужно согласовать линию. Вот я и пытаюсь выяснить как: какие резисторы ставить, или активную подтяжку для исправления формы сигнала.
я буду утрировать :)
"не вижу решения, у меня все практически так же как рекомендуют - двигатель есть, коробка передачь есть, колес правда нет. Но это ерунда, почему не едет? было у кого такое?"
... за исключением экранированного кабеля и земли в паре с сигналом. Хотя это вроде к волновому сопротивлению не относится. Для минимизации эффекта волнового сопртивления нужно согласовать линию.
А что собственно с формой сигнала, чем Вы ее смотрели ?
нечем смотреть, но полагаю ничего хорошего там нет
Ети датчики работают кажется от 3.5 и до 5 вольт питания (непаразитное только !!!)
если неопределяются и подозрения на фронты , нужно гарантированно 5 в.
пропустите по свободной паре 12в и на дальнем конце поставьте 7805 с электролитом и керамикой по входу и выходу ...
И наступит щастие ;)
Господа, а DS2482-100 для работы с DS18B20 кто-то пробовал использовать? Будет ли толк на длинной линии?
Сделал активную подтяжку по такой схеме:
На столе линия из кучи кусков разношерстных кабелей заработала (без этого не работала). На следующей неделе попробуем на объекте.
Знаменитая схема, красивая!
А не пробовали без неё, но с резистором 1 ком к питанию? Я смотрел осциллографом- там полная "грязь" но при этом куча датчиков прекрасно работает уже года 3..... Главное в "звезду" не делать длинные линии одинаковой длины. Тогда лучьше их на разные ножки процессора рассадить...
И, насколько я понимаю, резистор должен стоять не на конце линии , а на стороне контроллера
Подтягивающий резистор уменьшал, но это слабо помогает. А звезду, само собой, лучше не делать вообще.
На объекте все работает, схемой удовлетворен.
деллллл..
Аналогичная проблема:
Ради интереса собрал несколько разного типа датчиков температуры:
1. DS18B20 (2 штуки - один для улицы, второй для дома)
2. DHT22
3. NTC термистор
Все три датчика стоят на улице (на подоконнике), а второй DS18B20 дома рядом с ардуино. От всех датчиков получаю нормальную информацию, кроме уличного DS18B20. Вот схемку набросал:
Кабель витая пара 5е (экранированного кабеля к сожалению нет). Читал в теме что сигнал должен идти в паре с землей, распаял и запаял так. Все равно результата нет. В скетче адреса датчиков указаны, так что на опрос время не теряется. Но все равно в конец loop() добавил delay(10) типа может данные не успевает доходить. Все равно не помогло. Пробовал к уличному спаять еще один резистор 4,7кОм и отдельно от домашнего датчика подключить. Тоже вроде не помогло (почему вроде? уже 2 часа ночи было и пайку может нормально не сделал, в общем человеческий фактор, если это поможет при диагностики проблемы, то попробую заново конечно).
Что тут не так? Помогите пожалуйста экономисту, который не шарит в электронике.
P.S. Как тут скетч можно заспойлирить? А то слишком много строк.
P.S. Как тут скетч можно заспойлирить? А то слишком много строк.
Через кнопку CODE в редакторе, с настройках там же и спрятать (свернуть)
http://mk90.blogspot.ru/2011/04/1-wire.html - нашел интересную статью. Думаю проблема в тонкой кабели ethernet. Попробую запитать кабелем более толстым сечением.
Скетч
Вопрос снят. Все оказался очень просто (2 дня бился как же не просто). Причина - плохая пайка. Где тут смайлик который очень стесняется
Начитался страшилок о том что не работают датчики на длинных линиях. Тут собрано немного теории более простыми словами. Провел тестирование Кабель utp 0.52 мм2 - 300 м в бухте линии землю-данные и питание спаривал для увеличения сечения, датчики DS18B20 - 5 шт, мастер DS9490R. Все работает идеально. Приступил к монтажу линия 60 м и 27 датчиков, очень надеюсь что все запуститься
...Приступил к монтажу линия 60 м и 27 датчиков, очень надеюсь что все запуститься
Самое плохое это не расстояние, а помехи.
И каким боком это к ардуино?
Самое плохое это не помехи, а ёмкость кабеля.
Провел тестирование Кабель utp 0.52 мм2 - 300 м в бухте
Я, помню, тоже тестировал с бухтой - всё было нормально. Стоило размотать по помещениям с серверами (~60 м) начались глюки. Причем, на ту же ардуину приходит линия в 120 м с 4 шт DS18b20 - всё ок, а вторая с 4 шт в 2 раза короче - глючит. Решения, кроме как завести несколько линий 1-wire, я тогда не нашёл, но это не очень критично было. Поэтому так и живёт с тех пор)
Преобразователь уровней 0...5V 1-wire <--> -5...+5V RS485 >> длинный-длинный кабель >> до 30-ти преобразователей уровней -5...+5V RS485 <--> 0...5V 1-wire >> много датчиков DS18B20 на коротком кабеле возле каждого преобразователя.
Интерфейс RS485 более устойчив к помехам, дальность связи до 1200 метров. Протокол обмена данными с датчиками остаётся тот же, никакой правки кода уже работающего прибора не требуется.
Почему все тянут "чистый" 1-ware подтяжками и не используют указанный метод? От незнания или нехотения без трудностей?
Подтяжки здесь, с подписью: "И обратить внимание на нормальную схемотехнику, даже если она кажется загадочной". Точней не скажешь.
Преобразователь уровней 0...5V 1-wire <--> -5...+5V RS485 >> длинный-длинный кабель >> до 30-ти преобразователей уровней -5...+5V RS485 <--> 0...5V 1-wire >> много датчиков DS18B20 на коротком кабеле возле каждого преобразователя.
Интерфейс RS485 более устойчив к помехам, дальность связи до 1200 метров. Протокол обмена данными с датчиками остаётся тот же, никакой правки кода уже работающего прибора не требуется.
Почему все тянут "чистый" 1-ware подтяжками и не используют указанный метод? От незнания или нехотения без трудностей?
Подтяжки здесь, с подписью: "И обратить внимание на нормальную схемотехнику, даже если она кажется загадочной". Точней не скажешь.
Спасибо за Ваш совет! Выглядит очень интересным, но можете, пожалуйста, объяснить "на пальцах"(или ссылку дать), как сделать такой преобразователь уровней? Или, лучше всего, ссылку на такой преобразователь на алиэкспрессе? :)