как получить флаг конвертации ds18b20

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

Всем привет.
В даташите на ds18b20  сказано, что после отправления запроса на измерение температуры, он начинает преобразование и в это время выдает в линию 0. Это если питание от внешнего источника.
У меня не получается отловить этот ноль. Датчик всегда выдает единицу. В чем может быть причина?
На самом деле при нескольких первых попытках датчик отвечал нулем, а потом менял его на единицу, но время конвертации было странным: от 650 до 800 мс при 12-битном  преобразовании, а при 9-битном 150 мс. После перестал выдавать нули.
Датчик из Китая в герметичном корпусе с метровым проводом. Между Vdd и DQ резистор 4,7 КОм, Vdd берет +5 В. Провода определил так: черный GND, красный Vdd, желтый DQ.

#include <OneWire.h>
#include <DallasTemperature.h>

OneWire  ds18b20(2);
DallasTemperature sensors(&ds18b20);

byte i;
byte addr[8];
byte data[8];
int16_t Temp;
int a = 1;
int reading = 0;
unsigned int startTime;
unsigned int stopTime;

void setup(void) {
  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(12);
  if (!ds18b20.search(addr)) {
  ds18b20.reset_search();
  delay(250);
  }
}

void loop() {
  if (reading == 0) {
    startTime = millis();
    ds18b20.reset(); 
    ds18b20.select(addr); 
    ds18b20.write(0x44, 0);
    reading = 1;
  }
  Serial.println(ds18b20.read_bit());
  delay(500); 

// для измерения времени конвертации часть кода менял на это
if (ds18b20.read_bit()) {
    ds18b20.reset();
    ds18b20.select(addr);
    ds18b20.write(0xBE);
    for ( i = 0; i < 9; i++) {
      data[i] = ds18b20.read();
    }
    Temp = (data[1] << 8) | data[0];
     stopTime = millis();
     reading = 0;
     Serial.print(a);
     Serial.print(" ");
     Serial.println(stopTime - startTime);
     a++;
    delay(500); 
  }
}  

Библиотеку Dallas Temperature использовал для задания разрядности по привычке. У нее есть встроенная функция проверки готовности конвертации, но она работает нам тоже read_bit и результат такой же.

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

Ivan_sel_naDivan пишет:

  Serial.println(ds18b20.read_bit());
  delay(500); 

Делэй появился по ошибке, когда правил код при вставке сюда. его не было при тестировании.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Я чот нипонял, чо нужно. Всю жись делал так: дал им всем команду конвертации, поделал чёнить в течении 1 секунды, опросил всех адресно и дал им команду опять. Проблем пока небыло (года 4) тфу...блеее...

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

Ivan_sel_naDivan пишет:

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

75 мс на 9 битах 100% работает!!!

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

а как вы можете доказать?

-NMi-
Offline
Зарегистрирован: 20.08.2018

ПИД регулятор 2-х зонный со скважностью в 75 мс уж лет ПЯТЬ как работает и не "жужЖжит" )))

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

без флага время измерения я проверял так. в setup считывал температуру, сохранял как preTemp, потом в loop один раз отправлял запрос и по кругу читал результаты, пока не появится температура Temp != preTemp.  измерял время. отправлял новый запрос и тд. для надежности совал датчик под лампу, чтоб за время конвертации температура успела измениться. для 12 бит время получалось около 650 мс. 
для 9 бит этот способ не годится, т.к. заявленное время конвертации меньше 100 мс, а чувствительность всего 0,5 градуса. это надо успевать каждые 100 мс нагревать датчик на полградуса. пять градусов в секунду. вряд ли такое возможно

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

-NMi- пишет:

ПИД регулятор 2-х зонный со скважностью в 75 мс уж лет ПЯТЬ как работает и не "жужЖжит" )))

у вас не жужжит, а у меня не отлавливается ноль. есть у вас соображения по этому поводу?

-NMi-
Offline
Зарегистрирован: 20.08.2018

Ivan_sel_naDivan пишет:

есть у вас соображения по этому поводу?

Конечно. Написать самому обработчик датчика по даташиту и не парить мозг.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ivan_sel_naDivan пишет:

мне нужно измерять время как можно быстрее

а зачем ты температурным даччиком время мериишь?

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

температуру конечно. ошибся

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Нельзя так его использовать.
Во время запроса и преобразования, возрастает энергопотребление датчика.
Ну и соответственно, оно рассеивается на корпусе.
Если слишком часто опрашивать датчик, то он начинает грется и безбожно врать.
Если время опроса критично возьмите термистор.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

хорошо, тогда используй аналоговый даччик (LM35) и не завись от времени конвертации далласа.  с какой скоростью сможешь его читать, с такой и читай. 

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

Kakmyc пишет:
Нельзя так его использовать.

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

Кстати, можете посоветовать термистор в герметичном корпусе?

b707
Offline
Зарегистрирован: 26.05.2017

Ivan_sel_naDivan пишет:

Кстати, можете посоветовать термистор в герметичном корпусе?

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

Что касается готовых - например NTC по-моему, на Али только герметичные и попадаются, других не видел

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

А теперь серьезно - неужто у Вас настолько быстрые процессы, что их надо мерить с максимальной частотой? Огромная энергия или очень малый объем? Если это так, то забудьте про китайские (и иже с ними датчики) - это серьезная задача, которая требует дорогих решений. А если Вас устроит замер раз в 1/3 секунды, так и не заморачивайтесь, DS обеспечит.

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

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

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

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

mykaida пишет:

А теперь серьезно - неужто у Вас настолько быстрые процессы, что их надо мерить с максимальной частотой?

если серьезно, то мне хватит и 100 мс на измерение или даже больше

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Ivan_sel_naDivan пишет:

если серьезно, то мне хватит и 100 мс на измерение или даже больше

А зачем Вы вообще создали эту тему? Честно - я не понял. Вам не нравится библиотека, так почитайте даташит и напишите свою программу под ДС (я так и делаю - мне не нравится).

 

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

после отправления запроса на измерение температуры, датчик начинает преобразование и в это время выдает в линию 0. когда преобразование закончено, датчик выдаст в линию 1. это из даташита.
мой датчик всегда выдает в линию 1. вернее, сначала он слал нули во время преобразования, но время получалось сильно различным от замера к замеру, а потом перестал делать и это.
библиотека 1-wire нормальная, насколько я понимаю.
ваша библиотека может же отправить запрос на измерение температуры, а затем слушать линию? попробуйте

Гриша
Offline
Зарегистрирован: 27.04.2014

Ivan_sel_naDivan пишет:

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

встречный вопрос - А зачем???? 

хотите посмеяться (по теме)? прочитайте 100++ постов этой темы - настроение обеспечено будет

1) если датчик до окончания конвертации будет держать "0" он не сможет работать от питания даташины. Не помню  команду перевода датчика в трехпроводный режим - проверьте.  

2) если датчик будет держать лог 0 на даташине он будет подогреваться протекающим током ключа (выше уже писали), не смогут работать несколько датчиков на одной линии, (ИМХО) это нарушает идею самой шины   OneWire - никто не может монополизировать шину ИМХО

3) используйте термосопротивление и внешний АЦП, ИОН (или образцовый источник тока так правильнее).... короче говоря соберите устройство под задачу сами и перечитайте тему по ссылке выше в этом посте :)))))))))) 

Ivan_sel_naDivan
Offline
Зарегистрирован: 29.11.2019

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

Green
Offline
Зарегистрирован: 01.10.2015

Странно. Я не экспериментировал, но, если в ДШ расписана эта ситуация, то должно выполняться... И крайне редко встречается обратное.

Гриша
Offline
Зарегистрирован: 27.04.2014

Действительно... если трехпроводное питание есть такая функция, осталось разобраться как датчик определяет тип подключения 3х или 2х проводное...

нашел такое в описании: 

 If the DS18B20 is
powered by an external supply, the master can issue read
time slots after the Convert T command and the DS18B20
will respond by transmitting a 0 while the temperature
conversion is in progress and a 1 when the conversion is
done. In parasite power mode this notification technique
cannot be used since the bus is pulled high by the strong
pullup during the conversion.
 
-NMi-
Offline
Зарегистрирован: 20.08.2018

Гриша пишет:

осталось разобраться как датчик определяет тип подключения 3х или 2х проводное...

[B4h] Команда позволяет определить режим питания любого датчика. После передачи команды, ведущее устройство выполняет тайм-слот чтения. Термодатчик с ”паразитным питанием” установит выход в низкое состояние, в то время как, датчик с внешним питанием будет держать шину в высоком состоянии.

 

[44h] Команда инициализирует одно преобразование температуры. После нее значение температуры оказывается в 2-байтном регистре температуры оперативной памяти и датчик переходит в неактивное, низкопотребляющее состояние. Для режима  ”паразитного питания” необходимо выполнить требования по подключению шины к источнику питания на время преобразования из раздела ПИТАНИЕ DS18B20. В режиме внешнего питания ведущее устройство может определить состояние операции преобразования с помощью слота чтения. При не законченной операции состояние шины будет низкого уровня, по завершению преобразования на шине будет высокий уровень. При ”паразитном питании” такой способ отслеживания процесса  преобразования не возможен.

vlad072
Offline
Зарегистрирован: 01.08.2017

Не нужно никаких delay'ев. Просто в цикле выставляем слот чтения и когда конвертация закончится датчики отдадут в него "1":

//...
  ds.reset(); ds.write(0xCC); ds.write(0x44);        // total conversion start
  for (uint32_t _t = millis(); millis() - _t < 1000ul;)
    if (ds.read_bit()) break;  // wait for complete conversion (1000ms max)
  // reding info
//...

Как оказалось время конвертации 9-bit значения ~66..67ms, против документированных 93.75ms ну и дальше кратно.

Гриша
Offline
Зарегистрирован: 27.04.2014

vlad072 пишет:

Как оказалось время конвертации 9-bit значения ~66..67ms, против документированных 93.75ms ну и дальше кратно.

в каком диапазоне температур?  93.75ms - гарантированный интервал во всем диапазоне, для любой партии т.к. осцилляторы не кварцы и точность значительно ниже.