несколько DS18B20 на длинном кабеле
- Войдите на сайт для отправки комментариев
Пытаюсь повесить много датчиков ds18b20 на одну линию. Каждый размещен в телефонной розетке с резистором от 1,5 до 10 ком. Питание идет отдельными проводами, не паразитное. Кабель - витая пара 5е. Длина линии порядка 60м.
Проблема в том, что не могу заставить работать более 4 датчиков. Стоит подключить пятый, как скетч застревает на sensors.getDeviceCount(); Причем иногда выдает, что на линии найдено 170-200 датчиков и начинает их опрашивать. Почему так происходит? Отражение сигнала?
4 сенсора работают стабильно и без ошибок. Есть соседняя линия аж на 130м, там такие же проблемы, но начиная с 6-ти сенсоров. Ферритовый фильтр пробовал - не помогает.
Скетч из примера, который шел с библиотекой
001 | #include <OneWire.h> |
002 | #include <DallasTemperature.h> |
003 |
004 | // Data wire is plugged into port 2 on the Arduino |
005 | #define ONE_WIRE_BUS 8 |
006 | #define TEMPERATURE_PRECISION 12 |
007 |
008 | // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) |
009 | OneWire oneWire(ONE_WIRE_BUS); |
010 |
011 | // Pass our oneWire reference to Dallas Temperature. |
012 | DallasTemperature sensors(&oneWire); |
013 |
014 | int numberOfDevices; // Number of temperature devices found |
015 |
016 | DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address |
017 |
018 | void setup ( void ) |
019 | { |
020 | // start serial port |
021 | Serial .begin(9600); |
022 | Serial .println( "Dallas Temperature IC Control Library Demo" ); |
023 |
024 | // Start up the library |
025 | sensors.begin(); |
026 | delay(2000); |
027 | // Grab a count of devices on the wire |
028 | numberOfDevices = sensors.getDeviceCount(); |
029 | |
030 | // locate devices on the bus |
031 | Serial .print( "Locating devices..." ); |
032 | |
033 | Serial .print( "Found " ); |
034 | Serial .print(numberOfDevices, DEC); |
035 | Serial .println( " devices." ); |
036 |
037 | // report parasite power requirements |
038 | Serial .print( "Parasite power is: " ); |
039 | if (sensors.isParasitePowerMode()) Serial .println( "ON" ); |
040 | else Serial .println( "OFF" ); |
041 | |
042 | // Loop through each device, print out address |
043 | for ( int i=0;i<numberOfDevices; i++) |
044 | { |
045 | // Search the wire for address |
046 | if (sensors.getAddress(tempDeviceAddress, i)) |
047 | { |
048 | Serial .print( "Found device " ); |
049 | Serial .print(i, DEC); |
050 | Serial .print( " with address: " ); |
051 | printAddress(tempDeviceAddress); |
052 | Serial .println(); |
053 | |
054 | Serial .print( "Setting resolution to " ); |
055 | Serial .println(TEMPERATURE_PRECISION, DEC); |
056 | |
057 | // set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions) |
058 | sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION); |
059 | |
060 | Serial .print( "Resolution actually set to: " ); |
061 | Serial .print(sensors.getResolution(tempDeviceAddress), DEC); |
062 | Serial .println(); |
063 | } else { |
064 | Serial .print( "Found ghost device at " ); |
065 | Serial .print(i, DEC); |
066 | Serial .print( " but could not detect address. Check power and cabling" ); |
067 | } |
068 | } |
069 |
070 | } |
071 |
072 | // function to print the temperature for a device |
073 | void printTemperature(DeviceAddress deviceAddress) |
074 | { |
075 | // method 1 - slower |
076 | //Serial.print("Temp C: "); |
077 | //Serial.print(sensors.getTempC(deviceAddress)); |
078 | //Serial.print(" Temp F: "); |
079 | //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit |
080 |
081 | // method 2 - faster |
082 | float tempC = sensors.getTempC(deviceAddress); |
083 | delay(500); |
084 | Serial .print( " Temp C: " ); |
085 | Serial .println(tempC); |
086 | // Serial.print(" Temp F: "); |
087 | // Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit |
088 | } |
089 |
090 | void loop ( void ) |
091 | { |
092 | // call sensors.requestTemperatures() to issue a global temperature |
093 | // request to all devices on the bus |
094 | Serial .print( "Requesting temperatures..." ); |
095 | sensors.requestTemperatures(); // Send the command to get temperatures |
096 | Serial .println( "DONE" ); |
097 | |
098 | |
099 | // Loop through each device, print out temperature data |
100 | for ( int i=0;i<numberOfDevices; i++) |
101 | { |
102 | // Search the wire for address |
103 | if (sensors.getAddress(tempDeviceAddress, i)) |
104 | { |
105 | // Output the device ID |
106 | Serial .print( "Temperature for device: " ); |
107 | Serial .print(i,DEC); |
108 | |
109 | // It responds almost immediately. Let's print out the data |
110 | printTemperature(tempDeviceAddress); // Use a simple function to print out the data |
111 | } |
112 | //else ghost device! Check your power requirements and cabling |
113 | |
114 | } |
115 | } |
116 |
117 | // function to print a device address |
118 | void printAddress(DeviceAddress deviceAddress) |
119 | { |
120 | for (uint8_t i = 0; i < 8; i++) |
121 | { |
122 | if (deviceAddress[i] < 16) Serial .print( "0" ); |
123 | Serial .print(deviceAddress[i], HEX); |
124 | } |
125 | } |
Сами догадались на каждый датчик ставить по резистору или подсказал кто?
Параллельное соединение резистров.
Шина должна быть подтянута одним резистором.
и что важно - этот ежинственный резистор нужно ставить как можно ближе к МК, а не как у вас - ближе к датчику
если заработает - вам повезло, 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, придется лопатить кода много.
нарыл вот изменение задержек в библиотеке, буду пробовать
01
--- OneWire_orig.cpp 2008-05-20 02:10:54.000000000 +0200
02
+++ OneWire.cpp 2009-04-14 19:30:58.000000000 +0200
03
@@ -115,8 +115,8 @@
04
// more certain timing.
05
//
06
void
OneWire::write_bit(uint8_t v) {
07
-
static
uint8_t lowTime[] = { 55, 5 };
08
-
static
uint8_t highTime[] = { 5, 55};
09
+
static
uint8_t lowTime[] = { 60, 8 };
10
+
static
uint8_t highTime[] = { 8, 60};
11
12
v = (v&1);
13
*modeReg |= bitmask;
// make pin an output, do first since we
14
@@ -137,7 +137,7 @@
15
16
*modeReg |= bitmask;
// make pin an output, do first since we expect to be at 1
17
*outputReg &= ~bitmask;
// zero
18
- delayMicroseconds(1);
19
+ delayMicroseconds(3);
20
*modeReg &= ~bitmask;
// let pin float, pull up will raise
21
delayMicroseconds(5);
// A "read slot" is when 1mcs > t > 2mcs
22
r = ( *inputReg & bitmask) ? 1 : 0;
// check the bit
отсюда, там же пишут про два резистора, на обоих концах линии.
И чего вы тут переливаете из пустого в порожнее, я же дал работающий рецепт, в котором учтены и помехи применеием витых пар , и терминирование, и активная подтяжка, и питание.
У меня работает более 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. Попробую запитать кабелем более толстым сечением.
Скетч
001
#include <EtherCard.h>
002
#include "DHT.h"
003
#include <OneWire.h>
004
#include <DallasTemperature.h>
005
006
//Константы
007
#define DHTPIN 2 // DHT пин
008
#define DHTTYPE DHT22
009
#define ONE_WIRE_BUS 3 // One-wire пин
010
/* NTC Термистор */
011
#define THERMISTORPIN A0 // аналоговый пин
012
#define THERMISTORNOMINAL 10000 // сопротивление при 25 градусах по Цельсию
013
#define TEMPERATURENOMINAL 25 // temp. для номинального сопротивления (практически всегда равна 25 C)
014
#define NUMSAMPLES 5 // сколько показаний используем для определения среднего значения
015
#define BCOEFFICIENT 3950 // бета коэффициент термистора (обычно 3000-4000)
016
#define SERIESRESISTOR 10000 // сопротивление второго резистора
017
/* Датчик дождя */
018
#define rainSensePin A1 // аналоговый пин - вход для подключения аналогового выхода сенсора
019
020
DHT dht(DHTPIN, DHTTYPE);
021
OneWire oneWire(ONE_WIRE_BUS);
022
DallasTemperature sensors(&oneWire);
023
DeviceAddress Thermometer1 = { 0x28, 0x66, 0xAD, 0x03, 0x00, 0x00, 0x80, 0xB4 };
//IN 2866AD03000080B4
024
DeviceAddress Thermometer2 = { 0x28, 0xD5, 0xA8, 0x03, 0x00, 0x00, 0x80, 0x38 };
//OUT 28D5A80300008038
025
026
int
samples[NUMSAMPLES];
027
028
static
byte
mymac[] = { 0x74, 0x69, 0x69, 0x2D, 0x30, 0x31 };
029
static
byte
myip[] = { 192, 168, 1, 203 };
030
031
byte
Ethernet::buffer[500];
032
BufferFiller bfill;
033
034
void
setup
() {
035
Serial
.begin(9600);
036
dht.begin();
037
sensors.setResolution(Thermometer1, ONE_WIRE_BUS);
038
sensors.setResolution(Thermometer2, ONE_WIRE_BUS);
039
pinMode(rainSensePin, INPUT);
040
analogReference(EXTERNAL);
041
042
if
(ether.begin(
sizeof
Ethernet::buffer, mymac) == 0)
043
Serial
.println(F(
"Failed to access Ethernet controller"
));
044
ether.staticSetup(myip);
045
}
046
047
static
word homePage() {
048
/* DHT */
049
float
dht_t = dht.readTemperature();
050
float
dht_h = dht.readHumidity();
051
052
int
dhtt_x = floor(dht_t);
053
float
dhtt_y_f = (dht_t - dhtt_x) * 10;
054
int
dhtt_y =
int
(dhtt_y_f);
055
056
int
dhth_x = floor(dht_h);
057
float
dhth_y_f = (dht_h - dhth_x) * 10;
058
int
dhth_y =
int
(dhth_y_f);
059
060
/* DS18B20 x2 */
061
sensors.requestTemperatures();
062
float
ds_in = sensors.getTempC(Thermometer1);
063
float
ds_out = sensors.getTempC(Thermometer2);
064
065
int
ds_in_x = floor(ds_in);
066
float
ds_in_y_f = (ds_in - ds_in_x) * 10;
067
int
ds_in_y =
int
(ds_in_y_f);
068
069
int
ds_out_x = floor(ds_out);
070
float
ds_out_y_f = (ds_out - ds_out_x) * 10;
071
int
ds_out_y =
int
(ds_out_y_f);
072
073
/* NTC */
074
uint8_t i;
075
float
average;
076
077
// сводим показания в вектор с небольшой задержкой между снятием показаний
078
for
(i = 0; i < NUMSAMPLES; i++) {
079
samples[i] = analogRead(THERMISTORPIN);
080
delay(10);
081
}
082
083
// рассчитываем среднее значение
084
average = 0;
085
for
(i = 0; i < NUMSAMPLES; i++) {
086
average += samples[i];
087
}
088
average /= NUMSAMPLES;
089
090
// конвертируем значение в сопротивление
091
average = 1023 / average - 1;
092
average = SERIESRESISTOR / average;
093
094
float
steinhart;
095
steinhart = average / THERMISTORNOMINAL;
// (R/Ro)
096
steinhart = log(steinhart);
// ln(R/Ro)
097
steinhart /= BCOEFFICIENT;
// 1/B * ln(R/Ro)
098
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15);
// + (1/To)
099
steinhart = 1.0 / steinhart;
// инвертируем
100
steinhart -= 273.15;
// конвертируем в градусы по Цельсию
101
//int ntc = round(steinhart);
102
103
int
ntc_x = floor(steinhart);
104
float
ntc_y_f = (steinhart - ntc_x) * 10;
105
int
ntc_y =
int
(ntc_y_f);
106
107
/* Датчик дождя */
108
int
rainSense = analogRead(rainSensePin);
// 1023 - если нет дождя, 0 - если ливень
109
rainSense = round(abs(rainSense - 1023) * 100 / 1023);
110
111
bfill = ether.tcpOffset();
112
bfill.emit_p(PSTR(
"HTTP/1.0 200 OK\r\n"
113
"Content-Type: text/html\r\n"
114
"Pragma: no-cache\r\n"
115
"\r\n"
116
"<title>Meteo Info</title>\n"
117
"<h1>DS18B20 OUT: $D,$D *C</h1>\n"
118
"<h1>DS18B20 IN: $D,$D *C</h1>\n"
119
"<h1>NTC Termistor: $D,$D *C</h1>\n"
120
"<h1>DHT Temperature: $D,$D *C</h1>\n"
121
"<h1>DHT Humidity: $D,$D %</h1>\n"
122
"<h1>Rain Level: $D %</h1>"
),
123
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);
124
125
return
bfill.position();
126
}
127
128
void
loop
() {
129
word len = ether.packetReceive();
130
word pos = ether.packetLoop(len);
131
132
if
(pos)
// check if valid tcp data is received
133
ether.httpServerReply(homePage());
// send web page data
134
135
delay(10);
136
}
Вопрос снят. Все оказался очень просто (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 подтяжками и не используют указанный метод? От незнания или нехотения без трудностей?
Подтяжки здесь, с подписью: "И обратить внимание на нормальную схемотехнику, даже если она кажется загадочной". Точней не скажешь.
Спасибо за Ваш совет! Выглядит очень интересным, но можете, пожалуйста, объяснить "на пальцах"(или ссылку дать), как сделать такой преобразователь уровней? Или, лучше всего, ссылку на такой преобразователь на алиэкспрессе? :)