ds18b20 нужна рабочая библиотека

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

Перебрал уже с 2 десятка библиотек. Устанавливаю неважно откуда, оттуда же беру пример и ничего не компилируется.. Постоянно лезут какие то ошибки.

Помогите плиз! Буду очень признателен.

Radjah
Offline
Зарегистрирован: 06.08.2014
exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

что именно установить оттуда и какой код загрузить? а то там ссылка на ссылке..

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

OneWire  в составе установленной IDE.
Последнюю неделю крышу у всех на DS-ках снесло?

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

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

 

зы: вопрос все еще открыт. ткните носом в библиотеку и скетч. Очень прошу!

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

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

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

я ее уже грохнул. :)

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

Любая другая без нее не запустится. Они все оболочки для нее.

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

переустановил компилятор. установил 1.6.5 вроде. ОнеВайр там уже есть. Сэмпл не пашет. компилируется но данные не выводит. при попытке поставить ДалласТепм постоянно вылазит что не хватает файлов. подкидывание файлов из инета не дает желаемого результата..

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

Да не нужен никакой Даллас нахер. Для какого семейства датчиков у вас сэмпл? У меня для DS18S20. B20 c ним пахать не будет. Сбросьте код который запускаете.

Radjah
Offline
Зарегистрирован: 06.08.2014

exez пишет:

что именно установить оттуда и какой код загрузить? а то там ссылка на ссылке..

Code/Library

Latest

TCL 3.7.2 (works with Arduino 1.0)

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

вот что пишет монитор:

ф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();
}

 

 

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

 

эти установились, компилируются, ошибок не дают но показывают 0 цельсия и 32 фаренгейта. В половине из скетчей пишет 0 Девайсес фоунд.. не видит его ардуинка одним словом.

 

может китайцы напутали с цветами проводов на выходе? есть вариант его как то прозвонить? выходит желтый, красный, черный. желтый на onewire??

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Пошёл за попкорном

Radjah
Offline
Зарегистрирован: 06.08.2014

exez: Подключаешь датчики как? Резистор правильно поставил?

kisoft: Мне тоже зацепи :)

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

Лучше фото подключения в студию.

sirik
Offline
Зарегистрирован: 10.11.2012

А не лучше ли использовать "DallasTemperature" ?

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

sirik пишет:

А не лучше ли использовать "DallasTemperature" ?

Вторая серия, "Библиотека возвращается"

sirik
Offline
Зарегистрирован: 10.11.2012

Хз)

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

4к7 от + питания на вход данных, а у вас его не было?

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

:) небыло..

поставил 4.2 работает даллас. обычный ванвайр пишет что это не ds18b20 family..

спасибо за помощь! как это я резистор проморгал? :)

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

"DallasTemperature" это зло.

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

KVadik пишет:

"DallasTemperature" это зло.

Поддержу, причем жрущее гору памяти, ничего не предлагая взамен.

Radjah
Offline
Зарегистрирован: 06.08.2014

Свой велосипед ближе к телу, ага.

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

exez пишет:

поставил 4.2 работает даллас. обычный ванвайр пишет что это не ds18b20 family..

Я вам про это сразу написал. Там посмотрите по коду и замените 0x10 на 0x28, вроде должно заработать. Найдите даташит на DS18B20 Чернова и почитайте внимательно. Они чудесно управляются через OneWire без всяких оболочек. И здесь на форуме, Dimax правил этот пример, поищите.

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

Radjah, что такого чудесного дает этот "DallasTemperature" ? Может чего не заметил?

Radjah
Offline
Зарегистрирован: 06.08.2014

Она делает УДОБНО. Там УЖЕ есть все проверки на возможно отключенный датчик. Выставлены все задержки на преобразование с разной точностью. Просто берешь и пользуешься.

Бритва Оккама же. Зачем делать свой велосипед, когда уже всё придумано?

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

Наверно здесь все таки играют личностные предпочтения. У меня изначально пошло проще с OneWire, на ней и остался. Пускай ТС сам выбирает, лишь бы результат удовлетворял.

sirik
Offline
Зарегистрирован: 10.11.2012

DallasTemperature использует OneWire если что, точнее это обертка.

На счет всех проверок: все ровно есть 4 условия, которые надо ручками писать, для проврки датчика ;)

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Radjah пишет:

Она делает УДОБНО. Там УЖЕ есть все проверки на возможно отключенный датчик. Выставлены все задержки на преобразование с разной точностью. Просто берешь и пользуешься.

Бритва Оккама же. Зачем делать свой велосипед, когда уже всё придумано?

Заодно добавляет свои глюки. Особенно когда на шине висит ещё что-то кроме датчиков DS18B20, но даже с одним датчиком бывает лагает. Только на этом форуме была масса тем когда у народа далластемпературе не работал нормально. Голая онваре же работает гораздо устойчивее. 

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

Всем огромное спасибо за непрохождение мимо. Попробую заменить 0x10 на 0x28 и еще раз попробовать вайвайр.

Что касается использования - я его вобще не планирую использовать. :)

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

Еще раз спасибо!

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

exez пишет:

Всем огромное спасибо за непрохождение мимо. Попробую заменить 0x10 на 0x28 и еще раз попробовать вайвайр.

Что касается использования - я его вобще не планирую использовать. :)

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

Еще раз спасибо!

Так вы запустите первый пример, сэмпл почему то только под S20 сделан, в первом вроде все семейства работают.
В плане эксплуатации, на мой взгляд великая вещь. Подключил гирлянду и радуйся. Ни калибровок, ни лишних проводов. ИМХО.

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

заменил тут 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();
}

 

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

Запустите этот:

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

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();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old 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, 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("  Data = ");
  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();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  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");
}

 

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

что касается использования далласа. в моем случае для клибровки датчиков и вывода правильной формулы для каждого отдельного термистора неважно, но вобще сожрать 23% памяти имхо многовато..

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

Спасибо bwn! Ваш код работает!

Хотя голый ванвайр оказывается жрет 20%. :) Не намного меньше...

sirik
Offline
Зарегистрирован: 10.11.2012

Подождите, а что библиотека называется "я работаю с шиной ванваер и со всеми датчиками мира"?

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

 

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

Мы про какую память говорим? Ликвидация DallasTemperature у меня освобождало примерно 1,5К программной памяти. Ну а от OneWire здесь никуда не деться, если только свой ногодрыг написать. Лично я не готов)))).

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

В любом случае суперский код. Поддерживат целое семейство датчиков. Не надо будет искать адрес, как в моем случае было!

Жму руку!!

sirik
Offline
Зарегистрирован: 10.11.2012

В коде delay ;)

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

Кстати, вопрос адептам "DallasTemperature", стояла задача: Имеем два датчика, один меряет забортную температуру, второй контролируемого помещения. Датчики закреплены достаточно жестко и частый демонтаж не предусмотрен, программа с течением времени модифицируется и тестится на макетке. Для снятия проблемы смены адресов была написана функция, считывающая коды датчиков, сравнивающая с записанными в EEPROM, в случае несовпадания перезаписывающая новые и по факту нагрева датчика помещения, ставящая признак в EEPROM.
Вопрос, как это сделать средствами библиотеки DallasTemperature ?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

sirik пишет:

 почему бы не использовать безглючную библиотеку?

Это далластемпературе то безглючная? Ню-ню :)

Radjah
Offline
Зарегистрирован: 06.08.2014

Ну у меня в проекте адреса датчиков хранятся в 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.

Оптимизация ради оптимизации?

sirik
Offline
Зарегистрирован: 10.11.2012

KVadik пишет:

sirik пишет:

 почему бы не использовать безглючную библиотеку?

Это далластемпературе то безглючная? Ню-ню :)

За 2 года работы, "не было ни одного разрыва" ;)

adrusha
Offline
Зарегистрирован: 02.03.2015

sirik пишет:

KVadik пишет:

sirik пишет:

 почему бы не использовать безглючную библиотеку?

Это далластемпературе то безглючная? Ню-ню :)

За 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);
}

 

sirik
Offline
Зарегистрирован: 10.11.2012

Датчик явно не предназначен для высоких температур, для измерения температуры дома, улицы - самое то.

Тем не менее, есть ряд "температур" под которыми мы понимаем ошибку: 0.00, 85.00, -127.00, не стоит про это забывать. И еще одно дополнительное условие, сразу после  getTempC ;)

зы/ я понимаю, что тут все программисты на чистом С, и т.д., но если есть написанная библиотека, почему ее не использовать? готов поспорить, что большинство - это программисты на языках\платформах что-то типа .net или java, вы там тоже все библиотеки сами пишите xD. Поймите, человек, который захочет разобраться что и как, через некоторое время сам придёт к азам и будет юзать то, что ему нравиться.

 

 

 

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

Петушка хвалит кукуха. Поскольку DallasTemperature есть оболочка для OneWire, более безглючной и правильной, чем основа, она быть не может. Надежность либо равна, либо ниже. И причина использования самая близкая к той, что в начале привел Radjah: "Кому то она делает УДОБНО".

Alex013
Offline
Зарегистрирован: 16.12.2015

Уважаемые, никакие библиотеки из IDE 1.6.6 не удалял, а OneWare не вижу:

Где взять проверенную?

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014