Уточнение по поводу много 18B20

Byte
Offline
Зарегистрирован: 28.11.2015

Хочу уточнить по поводу подключения Dallas 18B20. Если один то все понятно: три провода, датчик, резистор 4,7К. А вот если несколько 18B20: надо ОДИН резистор на всю шину или на КАЖДЫЙ датчик свой резистор 4,7К? И насколько обязателен конденсатор между проводами питания? Если да, то какой: обычный или электролит? Какой емкости?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

http://www.tweaking4all.com/wp-content/uploads/2014/03/ds18b20-normal-power.jpg

Конденсатор по питанию уже есть на плате Arduino. Но можно поставить еще один электролит, хуже не будет.

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

Я вешаю резистор и электролит на конце линии ( длина которой кстати достигает 50 метров и 80 с лишним датчиков).

Byte
Offline
Зарегистрирован: 28.11.2015

2 Tomasina. Спасибо, т.е. таки один и в начале линии судя по рисунку.

inspiritus пишет:

Я вешаю резистор и электролит на конце линии ( длина которой кстати достигает 50 метров и 80 с лишним датчиков).

И на сколько электролит, если не секрет? Кабель с экранированием? И ни один датчик не показывает -127.0?

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

Электролит 10мкф, и керамика 0.2-0.1

витая пара - одна пара : питание , вторая : сигнал и земля

резистор один и  В КОНЦЕ ЛИНИИ ! Вместе с электролитьм и керамикой.

 

Maverik
Offline
Зарегистрирован: 12.09.2012

и что, все 80 датчиков работают ? 

Byte
Offline
Зарегистрирован: 28.11.2015

2 inspiritus. Спасибо! Попробую такой способ.

bwn
Offline
Зарегистрирован: 25.08.2014

inspiritus, резистор в конце, так сложилось или был эксперимент? Т.к везде вроде рекомендуют ставить в начале шлейфа.

mike_angel
Offline
Зарегистрирован: 30.10.2015

inspiritus пишет:

Электролит 10мкф, и керамика 0.2-0.1

витая пара - одна пара : питание , вторая : сигнал и земля

резистор один и  В КОНЦЕ ЛИНИИ ! Вместе с электролитьм и керамикой.

 

А как включать электролит, керамику? Между землёй и сигналом?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

нет, по питанию.

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

Конечно по питанию

была разработка с многими апробациями

работает боевая производственная система с десятками датчиков на луче длиной более 50 м в окружении кучи железа.

были времена, когда зернет жил в коаксиале, терминатор вешали на конце линии.

mike_angel
Offline
Зарегистрирован: 30.10.2015

Tomasina пишет:

нет, по питанию.

inspiritus пишет:

Конечно по питанию

Резистор, я так понимаю, нужен для гашения отражённых сигналов, но он вешается между землёй и сигналом,

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

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

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

Piskunov
Offline
Зарегистрирован: 13.02.2014

Индуктивность у электролитов ощутимая, и внутреннее сопротивление тоже. А у керамики маленькие.

Byte
Offline
Зарегистрирован: 28.11.2015

inspiritus пишет:

Электролит 10мкф, и керамика 0.2-0.1

витая пара - одна пара : питание , вторая : сигнал и земля

резистор один и  В КОНЦЕ ЛИНИИ ! Вместе с электролитьм и керамикой.

Не совсем понятно: "витая пара - одна пара : питание , вторая: сигнал и земля". Ведь питание "минус" и "земля" - это одно и то же. Просто два провода соедененных вместе? 

Я выделил из витой пары три провода: "минус", "+5V", "сигнал". Между "минус" и "+5V" в конце линии поставил и электролит, и керамику. Между "минус" и "сигнал" в конце линии резистор на 4,7К. Для питания других датчиков выделил из витой пары другие провода. Длина всего 10м. Всего два 18В20. Один в помещении, другой на улице. Все равно, примерно в 2-5% замеров в сутки из примерно 280 замеров один из датчиков выдает либо "-127.00", либо с обоих одинаковые показания: тот, что в конце линии на улице показывает температуру точь в точь такую же, как и первый в помещении. 

Витая пара и датчики - новые. То же было и без конденсаторов на старом проводе, старых датчиках, на каждом из которых был резистор. У меня все мысли закончились как побороть. 

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

"витая пара - одна пара : питание , вторая: сигнал и земля".- две ПАРЫ проводов , которые свиты между собой, а не три раздельных проводка. И резистор - между плюсом питания и средним выводом датчика .Одна пара - это плюс и минус питания , а вторая пара - опять минус питания и сигнал с датчика. То есть : минус питания и в первой паре , переплетающийся с плюсом , и во второй паре , переплетающийся с сигнальным проводом.

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

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

Почти.

Только на каждой точке подключения датчика я подключаю gnd датчика на gnd пары питания и gnd сигнальной пары. 

Очень важно резистор 4.7 ком вешать между сигналом и питанием на самом дальнем датчике.

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

если проблема питания стоит очень остро( очень длинная линия или очень много датчиков) по паре питания запускаем 12в а питание организуем по группам дополнительной парой с применением различных стабилизаторов  на 5в ( 7805 или импульсных по желанию).

Byte
Offline
Зарегистрирован: 28.11.2015
inspiritus
Штирлиц
 
Хм... Спасибо. Я думал, что витая пара - она и в африке витая пара, т.е. многожильный UTP5 ethernet кабель. Да и по цене и доступности это самый оптимальный вариант. Вот по ней и организовал. Придется попробовать так, как на рисунке. Правда, не совсем понятно, как это реализовать? Снять оплетку с UTP5 и повытаскивать сплетенные пары?
Кстати, как только начались морозы, если температура падает ниже -16, то наружный датчик дает сплошные -127.00
Lakki
Offline
Зарегистрирован: 19.02.2015

Подскажите где можно найти описание библиотеки ONEWare на нормальном русском языке и как можно более подробное. Или может кто объяснит как напрямую обратится к датчику подключенному на конкретном пине и имеющего конкретный адрес. Потом счетать с него температуру, записать это значение какой то переменной (для последующего использования) и вывести данные на монитор. Хочу подключить каждый датчик на свой пин. 2 библиотеки я подключил, все вроде присвоил, непонятен алгоритм считывания измерения, какая последовательность и какие функции

Byte
Offline
Зарегистрирован: 28.11.2015

Lakki пишет:
Подскажите где можно найти описание библиотеки ONEWare на нормальном русском языке и как можно более подробное.

Что-то мне подсказывает, что подробнее, чем исходный код библиотеки и скетчей к ней, найти врядли удасться. Тем более, на русском. 

Если дело касается датчиков 18B20, то почему бы не использовать библиотеку DallasTemperature которая работает поверх OneWire? Имхо, с ней работать намного удобнее. 

bwn
Offline
Зарегистрирован: 25.08.2014

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

Описания такого не встречал, но на хрена адресные датчики вешать на раздельные пины? Загадкас.(((((

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

#define ONE_WIRE_BUS_WATER_PIN           A1  //  water sensor pin

OneWire oneWireWaterSensor(ONE_WIRE_BUS_WATER_PIN);

DallasTemperature waterSensor(&oneWireWaterSensor);

setup

waterSensor.begin();

waterSensor.setResolution(TEMPERATURE_PRECISION);

loop

waterTemp=waterSensor.getTempCByIndex(0);

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

 

gena
Offline
Зарегистрирован: 04.11.2012
Lakki
Offline
Зарегистрирован: 19.02.2015

Byte пишет:

Lakki пишет:
Подскажите где можно найти описание библиотеки ONEWare на нормальном русском языке и как можно более подробное.

Что-то мне подсказывает, что подробнее, чем исходный код библиотеки и скетчей к ней, найти врядли удасться. Тем более, на русском. 

Если дело касается датчиков 18B20, то почему бы не использовать библиотеку DallasTemperature которая работает поверх OneWire? Имхо, с ней работать намного удобнее. 


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

Lakki
Offline
Зарегистрирован: 19.02.2015

bwn пишет:

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

Описания такого не встречал, но на хрена адресные датчики вешать на раздельные пины? Загадкас.(((((


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

Lakki
Offline
Зарегистрирован: 19.02.2015

Спасибо, буду изучать

bwn
Offline
Зарегистрирован: 25.08.2014

Lakki пишет:
bwn пишет:

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

Описания такого не встречал, но на хрена адресные датчики вешать на раздельные пины? Загадкас.(((((

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

А причем здесь дуина и готовый девайс? Плата, пайка, нормальные разъемы и т.д. Можно нану на плату, иначе никак. ИМХО.

sav liana
Offline
Зарегистрирован: 28.11.2016

Вопрос по быстродействию! Возможно ли так запрограммировать: За 1 секунду опросить 10 датчиков (параллельно)?

Например, сперва всем раздать команду 0x44, а потом по всем 0xBE со считыванием .read_bytes(data, 9);? Как бы параллельно? У меня пока не получилось... (С использованием только #include <OneWire.h>)

bwn
Offline
Зарегистрирован: 25.08.2014

Плохо ищите. Всю тему почитайте, у ТС на WDT, но ниже и с миллис есть. Масштабируется легко, автоопределение адресов не делалось.
AVR параллельно не умеет.

sav liana
Offline
Зарегистрирован: 28.11.2016

Спасибо! Вот в чем был затык (???), при этом правильно считывался только второй датчик: 

1ds.reset();
2ds.select(ADDR[0]);
3ds.write(0x44, 1); //Команда на конвертацию
4ds.reset();
5ds.select(ADDR[1]);
6ds.write(0x44, 1); //Команда на конвертацию
7delay(1000);

Теперь, конечно, оба:

1ds.reset();
2ds.write(0xCC); //Обращение ко всем датчикам
3ds.write(0x44, 1);
4delay(1000);

  

 

bwn
Offline
Зарегистрирован: 25.08.2014

А delay(1000):, это по религиозным соображениям?

sav liana
Offline
Зарегистрирован: 28.11.2016

Нет, конечно, а типа, сосредоточился предельно на этом куске... пока не понял,почему не работает... delay ставил и между двумя 0x44 -ми "командами"..

bwn
Offline
Зарегистрирован: 25.08.2014

Работать будет и без delay(), только старую температуру отдавать.

Byte
Offline
Зарегистрирован: 28.11.2015

Год назад я жаловался в этой теме:

> Кстати, как только начались морозы, если температура падает ниже -16, то наружный датчик дает сплошные -127.00

Теперь готов сказать решение. Вернее, обходной маневр. Такое возникает если пользоваться функцией из библиотеки DallasTemperature

1sensors.getTempC(deviceAddress);

Если вместо этого взять кусок из примера работы с OneWire:

01float getTemperature(DeviceAddress deviceAddress)
02{
03  byte i;
04  byte present = 0;
05  byte type_s;
06  byte data[12];
07  float tempC;
08   
09  oneWire.reset();
10  oneWire.select(deviceAddress);
11  oneWire.write(0x44, 1);        // start conversion, with parasite power on at the end
12   
13  present = oneWire.reset();
14  oneWire.select(deviceAddress);   
15  oneWire.write(0xBE);         // Read Scratchpad
16 
17   for ( i = 0; i < 9; i++) {           // we need 9 bytes
18    data[i] = oneWire.read();
19  }
20 
21  // Convert the data to actual temperature
22  // because the result is a 16 bit signed integer, it should
23  // be stored to an "int16_t" type, which is always 16 bits
24  // even when compiled on a 32 bit processor.
25  int16_t raw = (data[1] << 8) | data[0];
26  if (type_s) {
27    raw = raw << 3; // 9 bit resolution default
28    if (data[7] == 0x10) {
29      // "count remain" gives full 12 bit resolution
30      raw = (raw & 0xFFF0) + 12 - data[6];
31    }
32  } else {
33    byte cfg = (data[4] & 0x60);
34    // at lower res, the low bits are undefined, so let's zero them
35    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
36    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
37    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
38    //// default is 12 bit resolution, 750 ms conversion time
39  }
40  tempC = (float)raw / 16.0;
41   
42  return tempC;
43}

То проблема -127.0 при падении температуры ниже -16 по Цельсию не возникает. Видать, ошибка где-то в DallasTemperature.

bwn
Offline
Зарегистрирован: 25.08.2014

DallasTemperature - фффф топку. OneWire - прожиточный и самодостаточный минимум. ИМХО.

Byte
Offline
Зарегистрирован: 28.11.2015

Прожиточный и самодостаточный минимум, тогда уж, Assembler для Atmel :) ИМХО

bwn
Offline
Зарегистрирован: 25.08.2014

Byte пишет:

Прожиточный и самодостаточный минимум, тогда уж, Assembler для Atmel :) ИМХО

Если умеете, зачем тогда Ардуина?

Byte
Offline
Зарегистрирован: 28.11.2015

bwn пишет:

Если умеете, зачем тогда Ардуина?

Не умею... :(

bwn
Offline
Зарегистрирован: 25.08.2014

Тогда OneWire. Там особо уметь не требуется. А DT - жрущая ресурсы надстройка и ничего больше. Кто к ней привык сейчас ополчаться.))))