Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Борьба с DS18B20

Форум самогонщиков Приборы и электр(он)ика
1 2 3 3
mjStоrm Академик Аджибей 3.2K 2.9K
Отв.40  16 Дек. 10, 21:16
Аналогичная проблема, которую пытаюсь разрулить здесь.
androsa Научный сотрудник Прибалтика 522 70
Отв.41  18 Дек. 10, 17:36
Вопрос снят, всё удалось.
Игорь Академик - 7.4K 3.7K
Отв.42  19 Дек. 10, 03:27
androsa,
1. если наисать спциальную прогу, можно перезапрн=граммировать разрешабельность датиков.
2. Можно попробовать подключить их в ТемпКонтроле, вроде там оно лечится.ъ
3. В ТемипКипере вроде есть такая возможность, но нирЭна оно не помогает.
4. Если датчик стоил меньше 2=х долларов, то это не даллас, а чайна. Спасибо, хоть вообще работает.
androsa Научный сотрудник Прибалтика 522 70
Отв.43  19 Дек. 10, 16:02
Игорь, датчики нормальные. В темпконтроле нашел "высокое разрешение", а стояло "среднее". Не выключая темпконтрола, только остановил,  включил темпкипер - и всё пошло! Все датчики кажут с шагом 0,1*, а не 0,5*, что и требовалось доказать.  В ТемипКипере вроде есть такая возможность, но нирЭна оно не помогает.  Воистину, не помогает, а  темпконтроль рулит. Спасибо форумчанам, просветили!
Abettor Научный сотрудник Екатеринбург 2.6K 2.5K
Отв.44  21 Сент. 11, 21:33
Вот, нашёл на сайте "Киппром" кошерные гильзы промышленного изготовления для термометров: http://www.kipprom.ru/datchiki-temperatury/228
Pavel Vorobev Магистр Мончегорск 236 51
Отв.45  21 Сент. 11, 21:54, через 21 мин
Вот, нашёл на сайте "Киппром" кошерные гильзы промышленного изготовления для термометров: http://www.kipprom.ru/datchiki-temperatury/228
Abettor, 21 Сент. 11, 21:33
чето диаметры того не очень подходящие
Abettor Научный сотрудник Екатеринбург 2.6K 2.5K
Отв.46  21 Сент. 11, 22:11, через 17 мин
Диаметр датчика 5 мм, а гильзы 7,5; 8 и 10 мм. Разве это не то, что доктор прописал?
Pavel Vorobev Магистр Мончегорск 236 51
Отв.47  21 Сент. 11, 23:08, через 58 мин
Диаметр датчика 5 мм, а гильзы 7,5; 8 и 10 мм. Разве это не то, что доктор прописал?
Abettor, 21 Сент. 11, 22:11
еле нашел читани все там немного....[Вопрос по D18B20] ..... 7.5 просто полено.. хотя у кождого свой вкус - сказал собак облизывая ...шорстку
Abettor Научный сотрудник Екатеринбург 2.6K 2.5K
Отв.48  29 Сент. 11, 05:36
Как проявляет себя явление выхода из строя датчика? У меня после перепайки программа BM1707.exe выдаёт сообщение "Ни одного сенсора не найдено.", хотя припаяно целых 3 сенсора. Может быть выход из строя одного из них блокирует обнаружение двух других?
alekslug Научный сотрудник винокур, Лобня. 5.2K 1.7K
Отв.49  29 Сент. 11, 09:05
Подключай датчики по одному, так найдешь неисправный. У меня Был случай 4 датчика DS18B20 прибор их регистрирует  НО, три работают а один глючит.Проверяю по одному, работают все. Купил новый датчик,заменил подозрительный, работают все!
Pavel Vorobev Магистр Мончегорск 236 51
Отв.50  29 Сент. 11, 15:32
Как проявляет себя явление выхода из строя датчика? У меня после перепайки программа BM1707.exe выдаёт сообщение "Ни одного сенсора не найдено.", хотя припаяно целых 3 сенсора. Может быть выход из строя одного из них блокирует обнаружение двух других?
Abettor, 29 Сент. 11, 05:36


уменя прибор не такой и вместо слов умных он прочерки точки рисует но думаю суть неменяется так вот когда прочерки это значит ситирую:  обрыв. короткое замыкание. испорченный датчик. НЕПРАВИЛЬНАЯ (скорее всего)подключенного датчика полярность на индикаторе появляются три черточки (по твоему: ни одного сенсора не найдено)
kirej Кандидат наук Москва 380 52
Отв.51  17 Окт. 13, 19:31
1.Возьмите у Игоря 223 в качестве образца и сделайте сколько нужно.
2.Из телескопической антенны.
3. Подберите медную трубку.
Подпаиваете к датчику провода (лучше тонким МГТФ), на контакты или тонкую ПВХ или термоусадку, вставляете в гильзу(намазав термопастой), кончик герметик и термоусадкой.
koldyn158 Специалист Орел 191 9
Отв.52  21 Окт. 13, 18:46
ребят,сделал датчики дs18b20,засунул их в тонкие нержавеющие трубки по верху 6мм,внутри 5,5мм с термопастой,засунул их в кипяшую воду,а они показывают 95 градусов,почему так?
Брагин Магистр Краснодар 278 76
Отв.53  21 Окт. 13, 18:50, через 4 мин
ребят,сделал датчики дs18b20,засунул их в тонкие нержавеющие трубки по верху 6мм,внутри 5,5мм с термопастой,засунул их в кипяшую воду,а они показывают 95 градусов,почему так?
koldyn158, 21 Окт. 13, 18:46
на краях диапазона врут демоны до 2 градусов по паспорту да плюс атмосферное не 960 мм.
но в нашем деле часто нужна не абсалютная точность а относительная, так что забей
fz009 Новичок ufa 9
Отв.54  02 Янв. 14, 22:20
Кто-нибудь пробовал выточить защитную гильзу для дs18b20 из фторопласта? Если обточить пластмассовый корпус датчика для уменьшения переходного сопротивления температуре ,применить при закладке термопасту,а стенки гильзы сделать достаточно тонкими может получиться экологичная и плотно вставляемая деталь с приемлемой тепловой инерцией.
Borshin Доктор наук Воронеж 583 173
Отв.55  08 Дек. 15, 14:58
Итоги моей борьбы с ds18b20 (может пригодится кому...):
Один датчик подключить проблем нет:
-нашли адрес
-отправили запрос на начало преобразования
-подождали 750мс
-считали данные
примерно так (стандартный пример из библиотеки OneWire):
Скрытый текст#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, 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 = ds.read();
    Serial.print(data, HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, Крутой, 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] << Крутой | 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");
}
В примере поочередно будет идти опрос сначала первого, через секунду второго и тд.
В примере реализация через задержку delay(1000). Обходится это ограничение легко, ставится флаг после отправки запроса на обработку и запоминается время millis(), а по разнице millis() и запомненного времени со сработавшим флагом выполняется чтение результата преобразования.
Но датчики опрашиваются так же через секунду, по очереди.

Как я видел себе решение этой проблемы:
-находим адреса всех датчиков на шине
-затем отправляем запрос на преобразование на каждый по адресу
-ждём 750 мс
-читаем каждый датчик по адресу
-profit

Не тут то было... Проблему так и не нашел, копал пилил, даташит на ds18b20 и описание шины толком не читал (а в этом то судя по всему и проблема)
Вот один из вариантов который так и не заработал (был бы признателен если бы кто, проходя мимо, ткнул носом в ошибку):
Скрытый текст#include <OneWire.h>
int numT=0;
bool zapros =false;
float t[4];
long time=0,dat_time=0;
OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
byte type_s[4];
byte addr[4][8]=
{
0x10, 0x1D, 0x9A, 0xD7, 0x1 , 0x8 , 0   , 0xBA,
0x28, 0x9C, 0x87, 0xD7, 0x2 , 0x0 , 0x0 , 0x80,
0x28, 0xFF, 0x8 , 0x31, 0x65, 0x15, 0x2 , 0x8E,
0x28, 0xFF, 0xE , 0x6A, 0x65, 0x15, 0x2 , 0x5E
};

void setup(void) {
  Serial.begin(9600);

for(int i=0;i<4;i++)
  switch (addr
  • ) {
    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;
  }

}

void loop(void) {
  byte i;


  byte data[12];
//  byte addr[8];
  float celsius, fahrenheit;
  time=millis();

if(!zapros)
{
 
  //ds.reset();
  for(i=0;i<1;i++)
  {
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  }

  zapros=true;
  Serial.println("Zapros");
  dat_time=millis();



if(zapros&&(time-dat_time>750))
{
  Serial.println();
  Serial.println();
  Serial.println("obrabotka");
 
  dat_time=millis(); 
   
  for(numT=0;numT<1;numT++)

  ds.reset();
  ds.select(addr[numT]);   
  ds.write(0xBE);         // Read Scratchpad


  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data = ds.read();

  }

  int16_t raw = (data[1] << Крутой | data[0];
  if (type_s[numT]) {
    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
  }
  t[numT]=celsius = (float)raw / 16.0;


}
zapros=false;
  for(i=0;i<4;i++)
Serial.println(t);

}//if dat_time

}
В итоге, получил что хотел, но не понял почему оно работает. Запрос по адресу для всех датчиков не веду, они кстати у меня по двухпроводной схеме подключены, отсюда и нашел решение, просматривая один из чьих то примеров или даллосовскую библиотеку увидел строку ds.write(0xCC,1);// start conversion, with parasite power on at the end, увидев знакомое слово "паразитное питание", вставил себе в скетч и о чудо заработало.
Готовый рабочий вариант, без delay() и без использования далласовской библиотеки:
Скрытый текст#include <OneWire.h>
int numT=0;
bool zapros =false;
float t[4];
long time=0,dat_time=0;
OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
byte type_s[4];
byte addr[4][8]=
{
0x10, 0x1D, 0x9A, 0xD7, 0x1 , 0x8 , 0   , 0xBA,
0x28, 0x9C, 0x87, 0xD7, 0x2 , 0x0 , 0x0 , 0x80,
0x28, 0xFF, 0x8 , 0x31, 0x65, 0x15, 0x2 , 0x8E,
0x28, 0xFF, 0xE , 0x6A, 0x65, 0x15, 0x2 , 0x5E
};

void setup(void) {
  Serial.begin(9600);

for(int i=0;i<4;i++)
  switch (addr
  • ) {
    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;
  }


}

void loop(void) {
  byte i;


  byte data[12];

  float celsius, fahrenheit;
  time=millis();



if(!zapros)
{
 
  ds.reset();

  //for(i=0;i<4;i++)
  {
   
// ds.select(addr);
  ds.write(0xCC,1);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  }
  zapros=true;
  dat_time=millis();



if(zapros&&(time-dat_time>750))
{
  dat_time=millis(); 
 
  for(numT=0;numT<4;numT++)


  ds.reset();
  ds.select(addr[numT]);   

  ds.write(0xBE);         // Read Scratchpad


  for ( i = 0; i < 9; i++)            // we need 9 bytes
    data = ds.read();
 

  int16_t raw = (data[1] << Крутой | data[0];
  if (type_s[numT]) {
    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
  }
  t[numT]=(float)raw / 16.0;;
}
zapros=false;
Serial.println();
  for(i=0;i<4;i++)
Serial.println(t);

}//if dat_time
}