ds18b20 нужна рабочая библиотека
- Войдите на сайт для отправки комментариев
Ср, 28/10/2015 - 20:21
Перебрал уже с 2 десятка библиотек. Устанавливаю неважно откуда, оттуда же беру пример и ничего не компилируется.. Постоянно лезут какие то ошибки.
Помогите плиз! Буду очень признателен.
https://milesburton.com/Dallas_Temperature_Control_Library
что именно установить оттуда и какой код загрузить? а то там ссылка на ссылке..
OneWire в составе установленной IDE.
Последнюю неделю крышу у всех на DS-ках снесло?
да заказал его блин. еще месяц назад пришел. уже кучу проектво сделал с самодельными датчиками а тут решил чтоб лучше их калибровать эту беду поставить. а она не ставится в упор. уже готов его выкинуть и не заморачиваться, да интересно решить вопрос..
зы: вопрос все еще открыт. ткните носом в библиотеку и скетч. Очень прошу!
Запускаете IDE, открываете "примеры", OneWire, там есть для этих датчиков. Подключаем на ногу, что в примере, не забываем резистор, компилируем, наслаждаемся.
я ее уже грохнул. :)
Любая другая без нее не запустится. Они все оболочки для нее.
переустановил компилятор. установил 1.6.5 вроде. ОнеВайр там уже есть. Сэмпл не пашет. компилируется но данные не выводит. при попытке поставить ДалласТепм постоянно вылазит что не хватает файлов. подкидывание файлов из инета не дает желаемого результата..
Да не нужен никакой Даллас нахер. Для какого семейства датчиков у вас сэмпл? У меня для DS18S20. B20 c ним пахать не будет. Сбросьте код который запускаете.
что именно установить оттуда и какой код загрузить? а то там ссылка на ссылке..
Code/Library
Latest
TCL 3.7.2 (works with Arduino 1.0)
вот что пишет монитор:
фNo more adresses.
No more adresses.
No more adresses.
No more adresses.
впереди мусор дает
А вот код:
#include <OneWire.h> /* DS18S20 Temperature chip i/o */ OneWire ds(10); // on pin 10 void setup(void) { // initialize inputs/outputs // start serial port Serial.begin(9600); } void loop(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds.search(addr)) { Serial.print("No more addresses.\n"); ds.reset_search(); return; } Serial.print("R="); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return; } if ( addr[0] != 0x10) { Serial.print("Device is not a DS18S20 family device.\n"); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print("P="); Serial.print(present,HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print( OneWire::crc8( data, 8), HEX); Serial.println(); }TCL 3.7.2 (works with Arduino 1.0)
эти установились, компилируются, ошибок не дают но показывают 0 цельсия и 32 фаренгейта. В половине из скетчей пишет 0 Девайсес фоунд.. не видит его ардуинка одним словом.
может китайцы напутали с цветами проводов на выходе? есть вариант его как то прозвонить? выходит желтый, красный, черный. желтый на onewire??
Пошёл за попкорном
exez: Подключаешь датчики как? Резистор правильно поставил?
kisoft: Мне тоже зацепи :)
Лучше фото подключения в студию.
А не лучше ли использовать "DallasTemperature" ?
А не лучше ли использовать "DallasTemperature" ?
Вторая серия, "Библиотека возвращается"
Хз)
Резистор??
у меня такой датчик: http://uamper.com/%D0%A1%D0%B5%D0%BD%D1%81%D0%BE%D1%80%D1%8B/%D0%92%D0%BE%D0%B4%D0%BE%D0%BD%D0%B5%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D1%86%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9-%D0%B4%D0%B0%D1%82%D1%87%D0%B8%D0%BA-%D1%82%D0%B5%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D1%8B-DS18B20
4к7 от + питания на вход данных, а у вас его не было?
:) небыло..
поставил 4.2 работает даллас. обычный ванвайр пишет что это не ds18b20 family..
спасибо за помощь! как это я резистор проморгал? :)
"DallasTemperature" это зло.
"DallasTemperature" это зло.
Поддержу, причем жрущее гору памяти, ничего не предлагая взамен.
Свой велосипед ближе к телу, ага.
поставил 4.2 работает даллас. обычный ванвайр пишет что это не ds18b20 family..
Я вам про это сразу написал. Там посмотрите по коду и замените 0x10 на 0x28, вроде должно заработать. Найдите даташит на DS18B20 Чернова и почитайте внимательно. Они чудесно управляются через OneWire без всяких оболочек. И здесь на форуме, Dimax правил этот пример, поищите.
Radjah, что такого чудесного дает этот "DallasTemperature" ? Может чего не заметил?
Она делает УДОБНО. Там УЖЕ есть все проверки на возможно отключенный датчик. Выставлены все задержки на преобразование с разной точностью. Просто берешь и пользуешься.
Бритва Оккама же. Зачем делать свой велосипед, когда уже всё придумано?
Наверно здесь все таки играют личностные предпочтения. У меня изначально пошло проще с OneWire, на ней и остался. Пускай ТС сам выбирает, лишь бы результат удовлетворял.
DallasTemperature использует OneWire если что, точнее это обертка.
На счет всех проверок: все ровно есть 4 условия, которые надо ручками писать, для проврки датчика ;)
Она делает УДОБНО. Там УЖЕ есть все проверки на возможно отключенный датчик. Выставлены все задержки на преобразование с разной точностью. Просто берешь и пользуешься.
Бритва Оккама же. Зачем делать свой велосипед, когда уже всё придумано?
Заодно добавляет свои глюки. Особенно когда на шине висит ещё что-то кроме датчиков DS18B20, но даже с одним датчиком бывает лагает. Только на этом форуме была масса тем когда у народа далластемпературе не работал нормально. Голая онваре же работает гораздо устойчивее.
Всем огромное спасибо за непрохождение мимо. Попробую заменить 0x10 на 0x28 и еще раз попробовать вайвайр.
Что касается использования - я его вобще не планирую использовать. :)
Сам делаю датчики. Заказал на али термисторы и из них делаю. Просто для калибровки нужен цифровой термометр, а то аналоговым получается очень примерно..
Еще раз спасибо!
Всем огромное спасибо за непрохождение мимо. Попробую заменить 0x10 на 0x28 и еще раз попробовать вайвайр.
Что касается использования - я его вобще не планирую использовать. :)
Сам делаю датчики. Заказал на али термисторы и из них делаю. Просто для калибровки нужен цифровой термометр, а то аналоговым получается очень примерно..
Еще раз спасибо!
Так вы запустите первый пример, сэмпл почему то только под S20 сделан, в первом вроде все семейства работают.
В плане эксплуатации, на мой взгляд великая вещь. Подключил гирлянду и радуйся. Ни калибровок, ни лишних проводов. ИМХО.
заменил тут 0х10 на 0х28. не помогло:
#include <OneWire.h> /* DS18S20 Temperature chip i/o */ OneWire ds(10); // on pin 10 void setup(void) { // initialize inputs/outputs // start serial port Serial.begin(9600); } void loop(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; if ( !ds.search(addr)) { Serial.print("No more addresses.\n"); ds.reset_search(); return; } Serial.print("R="); for( i = 0; i < 8; i++) { Serial.print(addr[i], HEX); Serial.print(" "); } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.print("CRC is not valid!\n"); return; } if ( addr[0] != 0x28) { Serial.print("Device is not a DS18S20 family device.\n"); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print("P="); Serial.print(present,HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print( OneWire::crc8( data, 8), HEX); Serial.println(); }Запустите этот:
что касается использования далласа. в моем случае для клибровки датчиков и вывода правильной формулы для каждого отдельного термистора неважно, но вобще сожрать 23% памяти имхо многовато..
Спасибо bwn! Ваш код работает!
Хотя голый ванвайр оказывается жрет 20%. :) Не намного меньше...
Подождите, а что библиотека называется "я работаю с шиной ванваер и со всеми датчиками мира"?
Не хотите, не юзайте, это Ваше дело. Я просто хотел сказать, что если топикстартер новичок, и надо мерить только температуру, то почему бы не использовать безглючную библиотеку?
Мы про какую память говорим? Ликвидация DallasTemperature у меня освобождало примерно 1,5К программной памяти. Ну а от OneWire здесь никуда не деться, если только свой ногодрыг написать. Лично я не готов)))).
В любом случае суперский код. Поддерживат целое семейство датчиков. Не надо будет искать адрес, как в моем случае было!
Жму руку!!
В коде delay ;)
Кстати, вопрос адептам "DallasTemperature", стояла задача: Имеем два датчика, один меряет забортную температуру, второй контролируемого помещения. Датчики закреплены достаточно жестко и частый демонтаж не предусмотрен, программа с течением времени модифицируется и тестится на макетке. Для снятия проблемы смены адресов была написана функция, считывающая коды датчиков, сравнивающая с записанными в EEPROM, в случае несовпадания перезаписывающая новые и по факту нагрева датчика помещения, ставящая признак в EEPROM.
Вопрос, как это сделать средствами библиотеки DallasTemperature ?
почему бы не использовать безглючную библиотеку?
Это далластемпературе то безглючная? Ню-ню :)
Ну у меня в проекте адреса датчиков хранятся в EEPROM и записываются в память при замыкании на землю определнного выхода. Есть проверка на обрыв датчика. Работает уже наверное месяц, если не больше. В чем проблема?
> Sketch uses 16,582 bytes (51%) of program storage space. Maximum is 32,256 bytes.
> Global variables use 527 bytes (25%) of dynamic memory, leaving 1,521 bytes for local variables. Maximum is 2,048 bytes.
Оптимизация ради оптимизации?
почему бы не использовать безглючную библиотеку?
Это далластемпературе то безглючная? Ню-ню :)
За 2 года работы, "не было ни одного разрыва" ;)
почему бы не использовать безглючную библиотеку?
Это далластемпературе то безглючная? Ню-ню :)
За 2 года работы, "не было ни одного разрыва" ;)
"ни единого" — если вдаваться в цитаты.
А вообще, Dallas самая лучшая библиотека. Кстати на ней DS18B20 заработала сразу, без глюков работает и сейчас. Однако сам датчик не надежен. Имел неаккуратность его перегреть выше 150 градусов. Так он потом выше 50 градусов не опередял, как температура была выше 50, сразу датчик показывал -127.
Библиотека, если кто будет искать:
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 2 #define TEMPERATURE_PRECISION 9 // 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); // arrays to hold device addresses DeviceAddress insideThermometer, outsideThermometer; void setup(void) { // start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // Start up the library sensors.begin(); // locate devices on the bus Serial.print("Locating devices..."); Serial.print("Found "); Serial.print(sensors.getDeviceCount(), DEC); Serial.println(" devices."); // report parasite power requirements Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); // assign address manually. the addresses below will beed to be changed // to valid device addresses on your bus. device address can be retrieved // by using either oneWire.search(deviceAddress) or individually via // sensors.getAddress(deviceAddress, index) //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }; //outsideThermometer = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 }; // search for devices on the bus and assign based on an index. ideally, // you would do this to initially discover addresses on the bus and then // use those addresses and manually assign them (see above) once you know // the devices on your bus (and assuming they don't change). // // method 1: by index if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1"); // method 2: search() // search() looks for the next device. Returns 1 if a new address has been // returned. A zero might mean that the bus is shorted, there are no devices, // or you have already retrieved all of them. It might be a good idea to // check the CRC to make sure you didn't get garbage. The order is // deterministic. You will always get the same devices in the same order // // Must be called before search() //oneWire.reset_search(); // assigns the first address found to insideThermometer //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer"); // assigns the seconds address found to outsideThermometer //if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer"); // show the addresses we found on the bus Serial.print("Device 0 Address: "); printAddress(insideThermometer); Serial.println(); Serial.print("Device 1 Address: "); printAddress(outsideThermometer); Serial.println(); // set the resolution to 9 bit sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION); sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION); Serial.print("Device 0 Resolution: "); Serial.print(sensors.getResolution(insideThermometer), DEC); Serial.println(); Serial.print("Device 1 Resolution: "); Serial.print(sensors.getResolution(outsideThermometer), DEC); Serial.println(); } // function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } // function to print the temperature for a device void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.print(tempC); Serial.print(" Temp F: "); Serial.print(DallasTemperature::toFahrenheit(tempC)); } // function to print a device's resolution void printResolution(DeviceAddress deviceAddress) { Serial.print("Resolution: "); Serial.print(sensors.getResolution(deviceAddress)); Serial.println(); } // main function to print information about a device void printData(DeviceAddress deviceAddress) { Serial.print("Device Address: "); printAddress(deviceAddress); Serial.print(" "); printTemperature(deviceAddress); Serial.println(); } void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); Serial.println("DONE"); // print the device information printData(insideThermometer); printData(outsideThermometer); }Датчик явно не предназначен для высоких температур, для измерения температуры дома, улицы - самое то.
Тем не менее, есть ряд "температур" под которыми мы понимаем ошибку: 0.00, 85.00, -127.00, не стоит про это забывать. И еще одно дополнительное условие, сразу после getTempC ;)
зы/ я понимаю, что тут все программисты на чистом С, и т.д., но если есть написанная библиотека, почему ее не использовать? готов поспорить, что большинство - это программисты на языках\платформах что-то типа .net или java, вы там тоже все библиотеки сами пишите xD. Поймите, человек, который захочет разобраться что и как, через некоторое время сам придёт к азам и будет юзать то, что ему нравиться.
Петушка хвалит кукуха. Поскольку DallasTemperature есть оболочка для OneWire, более безглючной и правильной, чем основа, она быть не может. Надежность либо равна, либо ниже. И причина использования самая близкая к той, что в начале привел Radjah: "Кому то она делает УДОБНО".
Уважаемые, никакие библиотеки из IDE 1.6.6 не удалял, а OneWare не вижу:

Где взять проверенную?
На офсайте