Корректность работы DS18B20 с длинным проводом
- Войдите на сайт для отправки комментариев
Здравствуйте. Раньше работал с датчиками ds18b20, проблем никаких не возникало, однако сейчас появилась следующая особенность. К ардуино подклчен один датчик по витой паре длиной 6 метров (другого провода под рукой небыло). Залит простой скетч, взятий с какого-то сайта:
#include <OneWire.h> // пример использования библиотеки OneWire DS18S20, DS18B20, DS1822 OneWire ds(2); // на пине 10 (нужен резистор 4.7 КОм) void setup(void) { Serial.begin(9600); } void loop(void) { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius, fahrenheit; if ( !ds.search(addr)) { Serial.println("No more addresses."); Serial.println(); ds.reset_search(); delay(250); return; } Serial.print("ROM ="); for( i = 0; i < 8; i++) { Serial.write(' '); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } Serial.println(); // первый байт определяет чип switch (addr[0]) { case 0x10: Serial.println(" Chip = DS18S20"); // или более старый DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44); // начинаем преобразование, используя ds.write(0x44,1) с "паразитным" питанием delay(1000); // 750 может быть достаточно, а может быть и не хватит // мы могли бы использовать тут ds.depower(), но reset позаботится об этом present = ds.reset(); ds.select(addr); ds.write(0xBE); Serial.print(" Data = "); Serial.print(present, HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // нам необходимо 9 байт data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // конвертируем данный в фактическую температуру // так как результат является 16 битным целым, его надо хранить в // переменной с типом данных "int16_t", которая всегда равна 16 битам, // даже если мы проводим компиляцию на 32-х битном процессоре int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // разрешение 9 бит по умолчанию if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); // при маленьких значениях, малые биты не определены, давайте их обнулим if (cfg == 0x00) raw = raw & ~7; // разрешение 9 бит, 93.75 мс else if (cfg == 0x20) raw = raw & ~3; // разрешение 10 бит, 187.5 мс else if (cfg == 0x40) raw = raw & ~1; // разрешение 11 бит, 375 мс //// разрешение по умолчанию равно 12 бит, время преобразования - 750 мс } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(" Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); }
Решил параллельно подключить еще один датчик, тоже по витой паре длиной около 10 метров, но при подключении перестали находиться датчики. Заметил, что даже при подключении одного контакта DATA второго датчика уже перестают находиться датчики (Результат работы скетча - No more addresses).
После всего, попробовал просто при работающем контроллере и корректном выводе информации от первого датчика, на горячую прикоснуться жилой витой пары (без физически подключенного второго датчика) на контакт DATA. В итоге сразу же в терминале пишет No more addresses
Датчики подключаются с помощью одного резистора 4,7 кОм между VDD и DATA
Често говоря, не могу догадаться в чем может быть причина. Может быть кто сталкивался?
Подключайте датчики на шлейф из двух витых пар. Одна пара - питание/земля , вторая данные/земля. Важно именно шлейф с датчиками на нем, а не два луча разной длины от общего центра. Резистор подтяжки ставим в конце шлейфа. Также в конце шлейфа вешаем электролит на питание, порядка 47 мкФ/ 6.3 в
у меня среди кучи железа так работают шлейфы по 80 метров длиной и по 60 датчиков на каждом шлейфе.
Большое спасибо вам за ответ. Я правильно уловил вашу мысль, примерно такая схема нужна?
с таким скетчем датчики работать не будут, там автоопределение адреса, а при вашем подключении необходимо выяснить адрес каждого и руками прописать их в программе.
проще говоря , программа спрашивает кто есть на линии, а они на перебой орут одновременно.
с таким скетчем датчики работать не будут, там автоопределение адреса, а при вашем подключении необходимо выяснить адрес каждого и руками прописать их в программе.
Не будут работать при подключении датчиков по указанной схеме имеетс ввиду?
В моём рабочем варианте скетча я обращаюсь к датчикам по их адресам.
Не будут работать при подключении датчиков по указанной схеме имеетс ввиду?
В моём рабочем варианте скетча я обращаюсь к датчикам по их адресам.
по такой схеме и с таким скетчем - нет
Неправильно
линия должна быть одна, на ней как лампочки на гирлянде висят датчики ( только параллельно), в начале линии контроллер, в конце терминатор, адреса надо выяснить заранее и прописать в программе.
и учтите! Необходимо брать правильные провода в парах. Например оранж-питание белоОранж-земля, зел-данные, белозел-земля.
Неправильно...
уточните, кто из нас ошибся :)))))))
Неправильно
линия должна быть одна, на ней как лампочки на гирлянде висят датчики ( только параллельно), в начале линии контроллер, в конце терминатор, адреса надо выяснить заранее и прописать в программе.
Беда в том, что я измеряю температуру в двух находящихся на приличном расстоянии местах, а контроллер находится примерно в середине. Может в таком случае имеет смысл повесить датчик "смотрящий в другую сторону" на отдельный пин?
Беда в том, что я измеряю температуру в двух находящихся на приличном расстоянии местах, а контроллер находится примерно в середине. Может в таком случае имеет смысл повесить датчик "смотрящий в другую сторону" на отдельный пин?
объявите два ... проще скетчем...
Тогда вешайте каждую линию на свой пин, заодно и автоопределение адреса получите
Беда в том, что я измеряю температуру в двух находящихся на приличном расстоянии местах, а контроллер находится примерно в середине. Может в таком случае имеет смысл повесить датчик "смотрящий в другую сторону" на отдельный пин?
объявите два ... проще скетчем...
Тогда вешайте каждую линию на свой пин, заодно и автоопределение адреса получите
Спасибо за помощь и советы. Так и сделаю, каждую линию на свой пин.