Борьба с DS18B20
mjStоrm
Академик
Аджибей
3.2K 2.9K
Отв.40 16 Дек. 10, 21:16
Аналогичная проблема, которую пытаюсь разрулить здесь.
androsa
Научный сотрудник
Прибалтика
522 70
Отв.41 18 Дек. 10, 17:36
Вопрос снят, всё удалось.
Отв.42 19 Дек. 10, 03:27
androsa,
1. если наисать спциальную прогу, можно перезапрн=граммировать разрешабельность датиков.
2. Можно попробовать подключить их в ТемпКонтроле, вроде там оно лечится.ъ
3. В ТемипКипере вроде есть такая возможность, но нирЭна оно не помогает.
4. Если датчик стоил меньше 2=х долларов, то это не даллас, а чайна. Спасибо, хоть вообще работает.
1. если наисать спциальную прогу, можно перезапрн=граммировать разрешабельность датиков.
2. Можно попробовать подключить их в ТемпКонтроле, вроде там оно лечится.ъ
3. В ТемипКипере вроде есть такая возможность, но нирЭна оно не помогает.
4. Если датчик стоил меньше 2=х долларов, то это не даллас, а чайна. Спасибо, хоть вообще работает.
androsa
Научный сотрудник
Прибалтика
522 70
Отв.43 19 Дек. 10, 16:02
Игорь, датчики нормальные. В темпконтроле нашел "высокое разрешение", а стояло "среднее". Не выключая темпконтрола, только остановил, включил темпкипер - и всё пошло! Все датчики кажут с шагом 0,1*, а не 0,5*, что и требовалось доказать. В ТемипКипере вроде есть такая возможность, но нирЭна оно не помогает. Воистину, не помогает, а темпконтроль рулит. Спасибо форумчанам, просветили!
Abettor
Научный сотрудник
Екатеринбург
2.6K 2.6K
Отв.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.6K
Отв.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 мм. Разве это не то, что доктор прописал?еле нашел читани все там немного....[Вопрос по D18B20] ..... 7.5 просто полено.. хотя у кождого свой вкус - сказал собак облизывая ...шорстку
Abettor, 21 Сент. 11, 22:11
Abettor
Научный сотрудник
Екатеринбург
2.6K 2.6K
Отв.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. Подберите медную трубку.
Подпаиваете к датчику провода (лучше тонким МГТФ), на контакты или тонкую ПВХ или термоусадку, вставляете в гильзу(намазав термопастой), кончик герметик и термоусадкой.
2.Из телескопической антенны.
3. Подберите медную трубку.
Подпаиваете к датчику провода (лучше тонким МГТФ), на контакты или тонкую ПВХ или термоусадку, вставляете в гильзу(намазав термопастой), кончик герметик и термоусадкой.
koldyn158
Специалист
Орел
195 10
Отв.52 21 Окт. 13, 18:46
ребят,сделал датчики дs18b20,засунул их в тонкие нержавеющие трубки по верху 6мм,внутри 5,5мм с термопастой,засунул их в кипяшую воду,а они показывают 95 градусов,почему так?
Брагин
Магистр
Краснодар
278 76
Отв.53 21 Окт. 13, 18:50, через 4 мин
ребят,сделал датчики дs18b20,засунул их в тонкие нержавеющие трубки по верху 6мм,внутри 5,5мм с термопастой,засунул их в кипяшую воду,а они показывают 95 градусов,почему так?на краях диапазона врут демоны до 2 градусов по паспорту да плюс атмосферное не 960 мм.
koldyn158, 21 Окт. 13, 18:46
но в нашем деле часто нужна не абсалютная точность а относительная, так что забей
fz009
Новичок
ufa
9
Отв.54 02 Янв. 14, 22:20
Кто-нибудь пробовал выточить защитную гильзу для дs18b20 из фторопласта? Если обточить пластмассовый корпус датчика для уменьшения переходного сопротивления температуре ,применить при закладке термопасту,а стенки гильзы сделать достаточно тонкими может получиться экологичная и плотно вставляемая деталь с приемлемой тепловой инерцией.
Borshin
Доктор наук
Воронеж
583 173
Отв.55 08 Дек. 15, 14:58
Итоги моей борьбы с ds18b20 (может пригодится кому...):
Один датчик подключить проблем нет:
-нашли адрес
-отправили запрос на начало преобразования
-подождали 750мс
-считали данные
примерно так (стандартный пример из библиотеки OneWire):
// 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 и описание шины толком не читал (а в этом то судя по всему и проблема)
Вот один из вариантов который так и не заработал (был бы признателен если бы кто, проходя мимо, ткнул носом в ошибку):
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
// 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() и без использования далласовской библиотеки:
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
// 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
}
Один датчик подключить проблем нет:
-нашли адрес
-отправили запрос на начало преобразования
-подождали 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
- ) {
// 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
}
Готовый рабочий вариант, без 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
- ) {
// 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
}