DS18b20 показывает -127

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

SU-27-16 пишет:

круто ! копирую , спасибо !

Эт я идею из dimax кода содрал))).

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

bwn пишет:

Делаешь:  while ( ds.search(addr) ), сравниваешь считанный и записанный адрес побайтово, если байт не равен, возвращаем байт с номером признака датчика - 9й. Номер признака присваешь сам - адрес+байт признака. Массив с адресами должен быть отсортирован по возрастанию. На выходе из цикла не забывать команду ds.reset_search();

вот это и не понятно было - ds.search(addr) addr перебирается от 0 до хххххх ?

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

Если память не очень лимитирована, на наброски автоопределения. Может уменьшишь))))

#include <OneWire.h>
#include <EEPROM.h>
#include <avr/wdt.h>

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
 byte flag[2];    // Флаги для обслуживания датчиков Даллас
 byte addr[9];
 int Temp [5][2]; // Массив переменных температуры
 
 const byte led=13; //Пин световой индикации
 const byte alarm=9; // Пин звуковой индикации


void setup(void) {
  wdt_disable(); //Отключить собаку
  delay(2000);
  
  wdt_enable(WDTO_2S); // Взвести собаку на 2 секунды
  
  pinMode(led, OUTPUT);
  pinMode(alarm, OUTPUT);
  digitalWrite(led, HIGH);
  digitalWrite(alarm, LOW);
  
  Serial.begin(9600);
  
  colDall();
  obnColDall();
  addrDall();
  svAddrDall();
  addrDall();
  prinDall();
}

//***Проверка количества датчиков Даллас******
void colDall(){
  Serial.println("Vhod colDall");
  while ( ds.search(addr) ){ //Цикл перебора адресов датчиков
    flag[0]++; //Увеличение переменной числа датчиков
    ledBlink(1000);
  }
  if (flag[0] > 5) { //Условие превышения максимального количества
  //Если мало, увеличить размерность массива
    Serial.println("Mnogo datchikov"); //Здесь сообщение и обработка ошибки
    delay (5000); //Задержка для перезагрузки
  }
} 
//***----------------------------------------------------------------------------------

//***Функция обновления количества датчиков Даллас*****
void obnColDall() {
  if (flag[0] != EEPROM.read(1023)){ //Количество датчиков не соответствует запомненному
    Serial.println("Rabota obnColDall");
    if (EEPROM.read(1023) == 255 || EEPROM.read(1023) == 0){ //если количество датчиков не указано
      EEPROM.write( 1023, flag[0]); //Записать количество датчиков
      flag[0] = 0; //Сбросить флаг 
      flag[1] = 1; //Установить флаг.
      ledBlink(1000);
    }
    else {
      int i;
      for (i = 1022; i > (1022-(EEPROM.read(1023)*9)); i--){ //Перебор ячеек для адресов датчиков
        EEPROM.write(i, 255); //Очистка ячейки
        flag[1] = 1; //Установить флаг
        ledBlink(1000);
      }
        EEPROM.write(1023, flag[0]); //Записать новое количество датчиков
        flag[1] = 1; //Установить флаг
        flag[0] = 0; //Сбросить флаг
      }
  }
}
//--------------------------------------------------

//****Функция обновления адресов датчиков Даллас***

void addrDall(){
  Serial.println("Vhod addrDall");
  byte i;
  addr[8]=0; //Очистка байта признака датчика
  if (flag[0] == 0){ //Проверка флага
    Serial.println("Rabota Pishem adresa");
    while ( ds.search(addr) ){ //Цикл считывания адресов датчиков
      for ( i = 0; i < 9; i++ ){ //Перебор байтов адреса
        EEPROM.write(1022-flag[0]*9-i, addr[i]); //Запись байта считанного адреса
        ledBlink(1000);
     }
      flag[0]++; //Увеличить переменную количества датчиков
    }
    flag[1] = 1; //Установить флаг
  } 
}
//--------------------------------------------------

//***Функция сверки адресов датчиков Даллас****
void svAddrDall(){
  Serial.println("Vhod svAddrDall");
  byte i;
  flag[0]=0; //Сбросить флаг
  while ( ds.search(addr) ){ //Цикл считывания адреса датчика
    for (i = 0; i < 8; i++) {
      ledBlink(1000);
      if (addr[i] != EEPROM.read(1022-flag[0]*9-i)){ //Если считанный байт не равен записанному
        Serial.println("Adres ne raven");
        flag[0] = 0; //Сбросить флаг.
        ds.reset_search(); //Обнулить счетчик адресов
        return; //Выход
      }
    }
    flag[0]++; //Увеличить переменную количества адресов
  }
}
//---------------------------------------------------

//***Функция принадлежности Даллас*****
void prinDall() {
  Serial.print("Vhod prinDall");
  Serial.print("  ");
  Serial.println(flag[1],DEC);
  byte i = 0;
  if (EEPROM.read(1014) == 0 || EEPROM.read(1014) == 255) { //Проверка записей принадлежности 
    if (flag[1] == 1) {
      Serial.println("Perezagruzka");//Здесь сообщение о перезагрузке
      delay(2500);
    }
    int prinTemp[5][2]; // Временный массив температур
    for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) {
      adresDall(flag[0]); //Считать адрес Далласа
      razrDall(0x00); //Изменить на 9 бит разрешение  
    }
    dallRead(100);//Конвертация температур
    delay(110);
    dallRead(100);//Считывание температур
    ledBlink(1000);//Мигнуть и пнуть собаку
    for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) {
      prinTemp[flag[0]][0] = Temp[flag[0]][0]; //Присвоение временной температуры
      prinTemp[flag[0]][1] = 0; //Очистка признака
    }
    flag[1] = 0; //Обнуляем, для устранения влияния 
    //от использования в функции чтения температуры
    while (flag[1] == 0) { //Цикл проверки датчиков
      ledBlink(1000);
      Serial.print("Dat "); //Здесь функция отображения номера датчика
      Serial.println(i+1,DEC);
      dallRead(100);
      for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++){ //Перебор массива температур
        if (prinTemp[flag[0]][1] == 0) { //Проверка на признак принадлежности датчика
          if(Temp[flag[0]][0] - prinTemp[flag[0]][0] > 299) { //Проверка факта нагрева датчика
            prinTemp[flag[0]][1] = i+1; //Присвоение значения признака
            i++; //Увеличиваем значение признака
          }
        }
      }
      flag[1] = 1; //Установка флага окончания цикла проверки
      for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) {
        if (prinTemp[flag[0]][1] == 0){ //Если есть датчики без признака
          flag[1] = 0; //Флаг окончания цикла сбросить
        }
      }
      if (i == (EEPROM.read(1023)-1)) { //Остался один датчик без признака
        for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) {
          if (prinTemp[flag[0]][1] == 0) { //Определяем датчик без признака
            prinTemp[flag[0]][1] = i+1; //Записываем признак
          }
        }
      }    
    }
    for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) { //Перебор количества датчиков
      EEPROM.write((1023-flag[0]*9-9), prinTemp[flag[0]][1]); //Запись байта признака 
      Temp[flag[0]][0] = prinTemp[flag[0]][0]; //Присвоение значения температуры
      Temp[flag[0]][1] = prinTemp[flag[0]][1]; //Присвоение значения признака 
      adresDall(flag[0]); //Считать адрес Далласа
      razrDall(0x60); //Изменить на 12 бит разрешение  
    }  
  }
}
          
//--------------------------------------------------

//****Функция считывания адреса Далласа*****
void adresDall(byte number){
  byte i;
  for ( i = 0; i < 8; i++ ){ //Перебор номеров байтов адреса
        addr[i] = EEPROM.read(1022-number*9-i); //Считываем записанный байт в переменную адреса датчика
        ledBlink(1000);
  } 
}
//-------------------------------------------------

//***Функция изменения разрядности Даллас****
void razrDall(byte raz) {
  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F);
  ds.write(0xFF);
  ds.write(raz);
  ds.write(0x48);
}
//------------------------------------------------

//******Функция инд.свтодиодом************* 
void ledBlink(unsigned long interval)
{
  static unsigned long prevTime = 0;
  if (millis()-prevTime > interval)    //Проверка условия
  {
    prevTime = millis();
    wdt_reset(); //Очистка собаки
    digitalWrite(led,!digitalRead(led)); //Инверсия значения
  }
}
//-------------------------------------------------      
        
//***Функция считывания температуры c Далласов*****
void dallRead(unsigned long interval){
  static unsigned long prevTime = 0;
  if (millis() - prevTime > interval) { //Проверка заданного интервала
  static boolean flagDall = 0; //Признак операции
  prevTime = millis();
  flagDall =! flagDall; //Инверсия признака
  if (flagDall) {
    ds.reset();
    ds.write(0xCC); //Обращение ко всем датчикам
    ds.write(0x44); //Команда на конвертацию
    flag[1] = 1; //Время возврата в секундах
  }
  else {
    byte i;
    int temp;
    for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++){ //Перебор количества датчиков
        adresDall(flag[0]); //Получение адреса датчика
     ds.reset();
     ds.select(addr);
     ds.write(0xBE); //Считывание значения с датчика
     temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры
     Temp[flag[0]][0] = temp*100/4/4; //Температура в целочисленном формате *100
     //два знака после запятой.
     flag[1] = 10; //Время возврата в секундах
     }
   }
  }
}
//--------------------------------------------------
     
      
  
  
  
  
void loop() {
  ledBlink(1000);
  
  dallRead(flag[1]*1000);
  Serial.println(flag[1],DEC);
  Serial.println(Temp[0][0]/100.0,2);
  Serial.println(Temp[1][0]/100.0,2);
  Serial.println(Temp[2][0]/100.0,2);
  Serial.println(Temp[3][0]/100.0,2);
  Serial.println(" ");
  delay(900);
  
}

Не смог победить динамическое выделение массива под количество датчиков. Собака на будущие поделки забита.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

bwn пишет:

SU-27-16 пишет:

круто ! копирую , спасибо !

Эт я идею из dimax кода содрал))).

вот обоим и спасибо ! :)

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

SU-27-16 пишет:

вот это и не понятно было - ds.search(addr) addr перебирается от 0 до хххххх ?

Возвращает по возрастанию, до окончания адресов.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

bwn пишет:

Если память не очень лимитирована, на наброски автоопределения. Может уменьшишь))))

нано хватит на это
аха , щас всё брошу , изучу это дело ( год....два ) и начну уменьшать !

:)

Спасибо за предПодсказки !

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

bwn пишет:

Возвращает по возрастанию, до окончания адресов.

интересно - перебор всех адресов без ответа - сколько долго длится ?

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

SU-27-16 пишет:

bwn пишет:

Возвращает по возрастанию, до окончания адресов.

интересно - перебор всех адресов без ответа - сколько долго длится ?

Неверно выразился. Она только живые перебирает.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

bwn пишет:

SU-27-16 пишет:

bwn пишет:

Возвращает по возрастанию, до окончания адресов.

интересно - перебор всех адресов без ответа - сколько долго длится ?

Неверно выразился. Она только живые перебирает.

как это ?!!!!!!!!!!!!!!!!! буду нудеть....
как она узнает кто жив , кто нет ? не опросив каждого ?
пока нагрузили помощъю выше осознаваемого....
Спасибо , пока для поездки в "деревню" ( очень далеко ) - хватит...

Спасибо :)

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

Сам не расскажу. Читай здесь.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не читается ссылка :(
спасибо ! :)

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

SU-27-16 пишет:

не читается ссылка :(
спасибо ! :)

Набери в гугле, "DS18B20, Чернов"

maxvalin
Offline
Зарегистрирован: 22.02.2016

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

 DS18B20 только начал осваивать материал, паял поделки на AVR и PIC там как то не заморачивался над адресом датчика. Здесь начал читать - а лес все темнее... Не смог найти темы пока для двух датчиков на разных пинах, или нашел но не смог понять что это именно та тема которая мне нужна)))

p.s Имел ввиду не то что бы к пинам, понимаю что по адресу надо. ммм как бы обьяснить... есть два провода, один в доме один на улице- меняю датчики свободно на них, показания на экране все равно правильные. Тоисть провода главнее а не адреса.  как-то так.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

maxvalin пишет:

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

Протокол обмена 1-wire, по которому связываются DS18B20, работает с адресами. Без них - не работает.

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

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

SU-27-16 пишет:
как она узнает кто жив , кто нет ? не опросив каждого ?

В библиотеке DallasTemperature можно просто спросить количество устройств на шине и оно вернет их значение (функцию можно найти и посмотреть).

Насколько я понимаю, в 1-wire не опрашивается каждый датчик, а дается свисток: кто ответил в заданный диапазон времени - тот и живой. :)

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

Andrey_Y_Ostanovsky пишет:

Насколько я понимаю, в 1-wire не опрашивается каждый датчик, а дается свисток: кто ответил в заданный диапазон времени - тот и живой. :)

Не совсем, там алгоритм опроса с исключением адресов.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Andrey_Y_Ostanovsky пишет:

maxvalin пишет:

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

Протокол обмена 1-wire, по которому связываются DS18B20, работает с адресами. Без них - не работает.

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


хорошо, а если с автоопредилением но на разных пинах?
Неужели такой затык с шиной?

Logik
Offline
Зарегистрирован: 05.08.2014

Подождите, если на шине один датчик, то адрес а) можно не использовать б) всегда можно спросить его адрес и он один ответит. Потому если на разных пинах, на каждом своя шина и на ней только один датчик, то адреса не нужны. Но это явно не интересный вариант. А вобще привязка новых датчиков и перетасовка старых довольно скользкий вопрос. Допустим были датчики с адресами Д1 и Д2 в доме и саду. В какойто момент их заменили на  Д3 и Д4. Или  еще веселей,  поменяли местами. Как системе узнать какой из датчиков в саду? Очевидно никак. В последнем своем подходе к задаче делал табличку соответствия адрес-роль-название в ЕЕПРОМ, и удаленно её редактировал. Новые датчики автоматом прописываются в неё как "Неизвестный" с порядковым номером. Потом можна отредактировать и указать роль и название датчика. Вроде и не плохо, но чувства глубокого удовлетворения нет.

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

Logik пишет:

 В последнем своем подходе к задаче делал табличку соответствия адрес-роль-название в ЕЕПРОМ, и удаленно её редактировал. Новые датчики автоматом прописываются в неё как "Неизвестный" с порядковым номером. Потом можна отредактировать и указать роль и название датчика. Вроде и не плохо, но чувства глубокого удовлетворения нет.

Иначе наверно никак. Адрес + идентификатор. Я немного иначе делал. Если обнаружился новый номер или исчез какой то из запомненных, заставляет последовательно нагреть все доступные датчики (это нормально на небольшой площади и проблему замены местами тоже не решает).
У меня они на паяном шлейфе, соответственно замена только с паяльником. Уже не перепутаешь.
А проблемы по частой замене датчиков, ИМХО надуманные.

maxvalin
Offline
Зарегистрирован: 22.02.2016

Logik пишет:

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


Как раз интересный вариант! Вот бы тему найти об этом)
А насчёт перетасовки- уж очень кажется что удаленная правка епром действительно самый удачный вариант.

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

maxvalin пишет:
Logik пишет:

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

Как раз интересный вариант! Вот бы тему найти об этом) А насчёт перетасовки- уж очень кажется что удаленная правка епром действительно самый удачный вариант.

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

vde69
Offline
Зарегистрирован: 10.01.2016

bwn пишет:

maxvalin пишет:
Logik пишет:

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

Как раз интересный вариант! Вот бы тему найти об этом) А насчёт перетасовки- уж очень кажется что удаленная правка епром действительно самый удачный вариант.

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

в wire

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

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

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

vde69 пишет:

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

Обращаемся все равно по адресу, для единственного датчика используем команду READ ROM [33h], не прибегая к сканированию адресов.
Если я не прав, то хотелось бы кусочек кода не использующий адрес.

vde69
Offline
Зарегистрирован: 10.01.2016

sensors.getTempCByIndex(0)

vde69
Offline
Зарегистрирован: 10.01.2016

vde69 пишет:

sensors.getTempCByIndex(0)

 

хотя внутри, все равно по адресу :)

 

// sends command for one device to perform a temp conversion by index
bool DallasTemperature::requestTemperaturesByIndex(uint8_t deviceIndex)
{
DeviceAddress deviceAddress;
getAddress(deviceAddress, deviceIndex);
return requestTemperaturesByAddress(deviceAddress);
}

 

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

vde69 пишет:

sensors.getTempCByIndex(0)

Я спрашивал за 1Wire (OneWire) , DallasTemperature - лишних 2 килобайта, без явных преимуществ.
P/S пока писал, уже ответили))))

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

Каюсь, похоже обманул. Вроде как можно сделать Skip ROM [CCh], а затем сразу чтение памяти [BEh]. Попробую на досуге.
Дискутировать полезно, частенько узнаешь новое.))))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

#include <OneWire.h>

// пины для датчиков
#define dallas_1 3
#define dallas_2 4
#define dallas_3 5
#define dallas_4 6
#define dallas_5 7

OneWire ds_1 (dallas_1);
OneWire ds_2 (dallas_2);
OneWire ds_3 (dallas_3);
OneWire ds_4 (dallas_4);
OneWire ds_5 (dallas_5);

unsigned long time=0;
boolean flag=0; // для измерения


byte data[12];
float temp_1, temp_2, temp_3, temp_4, temp_5;
int raw;

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

void loop(){
  izm_temp(); // измеряем температуру

  if(!flag){
    Serial.print (F("Temp_1  " ));
    Serial.print (temp_1);
    Serial.print (F("  Temp_2  "));
    Serial.print (temp_2);
    Serial.print (F("  Temp_3  "));
    Serial.print (temp_3);
    Serial.print (F("  Temp_4  "));
    Serial.print (temp_4);
    Serial.print (F("  Temp_5  "));
    Serial.println (temp_5);
    Serial.flush(); //очищаем значения порта
  }
}

void izm_temp(){
  if(!flag){
    start_izm();
    time=millis();
    flag=1;
  }
  if(flag && (millis()-time)>750){
    calc_izm();
    flag=0;
  }
}

void start_izm(){
  //запускаем измерение всех датчиков
  ds_1.reset();
  ds_1.write(0xCC);
  ds_1.write(0x44);
  ds_2.reset();
  ds_2.write(0xCC);
  ds_2.write(0x44);
  ds_3.reset();
  ds_3.write(0xCC);
  ds_3.write(0x44);
  ds_4.reset();
  ds_4.write(0xCC);
  ds_4.write(0x44);
  ds_5.reset();
  ds_5.write(0xCC);
  ds_5.write(0x44);
}

void calc_izm(){
  // Считываем и пересчитываем 1 датчик
  ds_1.reset();
  ds_1.write(0xCC);
  ds_1.write(0xBE); // Read Scratchpad
  for (byte i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds_1.read ();
  }
  raw =  (data[1] << 8) | data[0];//=======Пересчитываем в температуру
  temp_1 =  (float)raw / 16.0;

  // Считываем и пересчитываем 2 датчик
  ds_2.reset();
  ds_2.write(0xCC);
  ds_2.write(0xBE); // Read Scratchpad
  for (byte i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds_2.read ();
  }
  raw =  (data[1] << 8) | data[0];//=======Пересчитываем в температуру
  temp_2 =  (float)raw / 16.0;

  // Считываем и пересчитываем 3 датчик
  ds_3.reset();
  ds_3.write(0xCC);
  ds_3.write(0xBE); // Read Scratchpad
  for (byte i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds_3.read ();
  }
  raw =  (data[1] << 8) | data[0];//=======Пересчитываем в температуру
  temp_3 =  (float)raw / 16.0;

  // Считываем и пересчитываем 4 датчик
  ds_4.reset();
  ds_4.write(0xCC);
  ds_4.write(0xBE); // Read Scratchpad
  for (byte i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds_4.read ();
  }
  raw =  (data[1] << 8) | data[0];//=======Пересчитываем в температуру
  temp_4 =  (float)raw / 16.0;

  // Считываем и пересчитываем 5 датчик
  ds_5.reset();
  ds_5.write(0xCC);
  ds_5.write(0xBE); // Read Scratchpad
  for (byte i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds_5.read ();
  }
  raw =  (data[1] << 8) | data[0];//=======Пересчитываем в температуру
  temp_5 =  (float)raw / 16.0;
}




 

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

Меня оно чисто в академическом плане заинтересовало. Как их использовать, это дело ТС.
Но платить за возможность беспроблемной замены (будет ли нужна) кратным количеству датчиков увеличением аппаратных и программных средств, имхо, излишество.
 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

за все надо платить)) ну если действительно требуется

maxvalin
Offline
Зарегистрирован: 22.02.2016

ещё как требуется!
первым делом- сделал устройство и забыл, сделал кому-то. да много чего бывает! Зря вы так! Спасибо за последний код!, думаю оно самое то!
p.s Каждый видит со своей колокольни для вас излишество использовать пины, для меня полное непонимание! у меня пинов тьма (2560) мне вообще не в напряг задействовать ещё 10 или 20 штук. А замена в приоритете потому что за год вот, сменил три датчика. но на pic я даже и не задумывался два провода, два показания. )))

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

maxvalin пишет:
А замена в приоритете потому что за год вот, сменил три датчика. но на pic я даже и не задумывался два провода, два показания. )))

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

Logik
Offline
Зарегистрирован: 05.08.2014

bwn пишет:

Каюсь, похоже обманул. Вроде как можно сделать Skip ROM [CCh], а затем сразу чтение памяти [BEh]. Попробую на досуге.
Дискутировать полезно, частенько узнаешь новое.))))

Можна, можна..

SKIP ROM [CCh]
The master can use this command to address all devices on the bus simultaneously without sending out any ROM code information. For example, the master can make all DS18B20s on the bus perform simultaneous temperature conversions by issuing a Skip ROM command followed by a Convert T [44h] command.
Note that the Read Scratchpad [BEh] command can follow the Skip ROM command only if there is a single slave device on the bus. In this case, time is saved by allowing the master to read from the slave without sending the device’s 64-bit ROM code. A Skip ROM command followed by a Read Scratchpad command will cause a data collision on the bus if there is more than one slave since multiple devices will attempt to transmit data simultaneously.
Logik
Offline
Зарегистрирован: 05.08.2014

bwn пишет:

maxvalin пишет:
А замена в приоритете потому что за год вот, сменил три датчика. но на pic я даже и не задумывался два провода, два показания. )))

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

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

maxvalin
Offline
Зарегистрирован: 22.02.2016

Ребят, все проще маслянный котел на выходе стоит Даллас, как говорится про...б.ал насос включить после розжига- 10 минут и труп готов))
Вот и мастырю сейчас автоматику для всего этого ( но даже сильнее в целях обучения) приятное с полезным.

Logik
Offline
Зарегистрирован: 05.08.2014

От перегрева далласы мрут?  8o И скоко же там градусов?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а код проверит кто нибудь? интересно рабочий или нет

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

maxvalin пишет:
Ребят, все проще маслянный котел на выходе стоит Даллас, как говорится про...б.ал насос включить после розжига- 10 минут и труп готов)) Вот и мастырю сейчас автоматику для всего этого ( но даже сильнее в целях обучения) приятное с полезным.

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

Аварийную автоматику надо делать на биметаллических реле типа KSD9700. NO или NC - в зависимости от логики... Ну и надо помнить, что у них температура срабатывания может быть плюс-минус 10-15 градусов.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

jeka_tm пишет:
а код проверит кто нибудь? интересно рабочий или нет

А что, надо принципиально обойтись без циклов? :)

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress Thermometer[5];

....

  // print the device information
  for(int i=0; i < SensorCount; i++){
  // printData(Thermometer[i]);
  printTemperature(Thermometer[i]);
  delay(4000);
  }

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ты кажется не понял что хочет человек, он хочет горячую замену датчиков без прописывания адресов

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

jeka_tm пишет:
ты кажется не понял что хочет человек, он хочет горячую замену датчиков без прописывания адресов

Я - тоже хочу... :)

Просто не допилил механизм привязки индекса к конктерному расположению датчика. В сетапе - запускается поиск устройств и адресами заполняется массив...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

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

jeka_tm пишет:

а код проверит кто нибудь? интересно рабочий или нет

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

понятно. сам бы проверил но нет такого количества датчиков. один даже найти будет тяжело

maxvalin
Offline
Зарегистрирован: 22.02.2016

Может что то не так подключил, но из 78 го поста- код не пошел((

изпользую ramps 1.4   2и 3 пины (два датчика), датчик рабочий, не увидел его, пишет все датчики= 0

или там нужно обязательно все пять цеплять? 

епть... голова уже совсем не варит.. забыл 4.7 кОм впаять

ссори, тесты откладываю до утра

 

maxvalin
Offline
Зарегистрирован: 22.02.2016

Работает! Работает из 78 го поста код!!

меняю между пинами датчик - показывает исправно!!! 

Спасибо огромное Добр человек! одна не маловажная проблема решена!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хорошо. значит сохраню себе, вполне возможно тоже понадобится

долгая у тебя ночь была)))

danil25
danil25 аватар
Offline
Зарегистрирован: 12.11.2016

Знатаки!) Подскажите!  Я хочу  подключить датчиками температуры Ds18b20 к Arduino! http://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.html Если еще добавить дисплей это будет здорово! Только как это все лучше срастить?  И не пойму почему у меня сейчас сам датчик температуру не точно показывает( погрешность в 2 градуса это норм? 

msng
Offline
Зарегистрирован: 07.06.2012

про вранье датчика тоже заметил что он увеличивает температуру на 1,5-2С.

Где то читал, что типа он греется от того что на него постоянно подано напряжение питания.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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