DS18B20 выдает 127,94 с библиотекой DallasTemperature

masterbob
Offline
Зарегистрирован: 22.01.2015
Датчик температуры DS18B20 c с использованием библиотек OneWire и  DallasTemperature стабильно выдает 127,94*С. Если использовать только библиотеку  OneWire то работает корректно и измеряет температуру.  С двумя библиотеками устойчиво не работает!!! Библиотеку DallasTemperature менял.
Где копать, какие будут мысли??? 
 
Примеры скетчей ниже.
 
С библиотеками OneWire и  DallasTemperature
 
#include <OneWire.h>
#include <DallasTemperature.h>
 
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 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);
 
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");
 
  // Start up the library
  sensors.begin();
}
 
void loop(void)
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));  
}
 
Если изменять температуру датчика то результата все равно нет, выдает - 127,94
 
 
С использованием только  OneWire!
 
#include <OneWire.h>
 
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
//
// The DallasTemperature library can do all this work for you!
 
OneWire  ds(9);  // on pin 10
 
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
 
  unsigned int 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);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 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");
}
 
 
 
 
KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Гм, а не использовать DallasTemperature религия не позволяет?

pastry777
Offline
Зарегистрирован: 16.01.2014

Выдает +127 или -127?

masterbob
Offline
Зарегистрирован: 22.01.2015

Именно (+) 127.94.

 

masterbob
Offline
Зарегистрирован: 22.01.2015

Можно и без DallasTemperature. Религия позволяет но это не обьясняет причину!

pastry777
Offline
Зарегистрирован: 16.01.2014

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

DeviceAddress ds1 = {  // задаем любое имя датчику,пусть ds1
0x28, 0x29, 0x68, 0x2E, 0x06, 0x00, 0x00, 0xA5 }; // здесь адресс своего датчика

потом по скетчу спрашиваем с него температуру уже так

sensors.getTempC(ds1);

 

 

masterbob
Offline
Зарегистрирован: 22.01.2015

Адрес определил. По конкретному адресу обращался. Результат тот же.

Среду програмирования сносил и устанавливал новую. Onwire менял.

Глюк какойто не понятный!! Даже не знаю с чего начать? Жду посылку с новыми DS18B20. попробую заменить.

 

 

masterbob
Offline
Зарегистрирован: 22.01.2015

Но как бы с OnWire датчик работает!

Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

А еще попробуй меньши сопротивление опорного резистор. Который с +5В на шину данных идет. Ну или в качестве эксперимента, подсоедини параллельно ему еще один резистор ну где то на 10кОм. Будет ли эффект. У меня есть эффект. Но датчик иногда выдавал -127. Провода до датчика какие? длина большая, есть экран? А еще я сделал в программе, что если датчик выдает -127, то сразу же происходит сброс и перезапрос датчика. И тоже очень помогло!

http://arduino.ru/forum/proekty/sistema-umnyi-dom-dlya-zagorodnogo-doma-...

void izmereniya()   //  Замер температур с датчиков DS18B20 и влажности с датчика DHT11 
   unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > interval) { // Замеры в интервале 
     dht.read(DHT11PIN);                  // Замеры температур с DHT11
     delay(100);                          // Необязательная задержка
     vlaga = dht.humidity;                // Уровень влажности % с DHT11
     TempPodpol = dht.temperature;        // Температура в подполе  с DHT11
     ds.requestTemperatures();            // Замеры температур с DS18B20
     delay(750);                          // Необязательная задержка
     TempZalC    = ds.getTempC(ZalC);     // Считываем температуру в зале
     delay(100);
     TempUlicaC  = ds.getTempC(UlicaC);   // Считываем температуру на улице
     delay(100);
     TempKuhnyaC = ds.getTempC(KuhnyaC);  // Считываем температуру в кухне
     delay(100);
     if(TempZalC== -127 || TempUlicaC== -127 || TempKuhnyaC== -127) // Перезапрос при ошибке датчика
     {
       ds.requestTemperatures(); delay(750); dsshet++ ; // +1 к счетчику ошибок DS18B20
       TempZalC    = ds.getTempC(ZalC);     // Считываем температуру в зале
       delay(100);
       TempUlicaC  = ds.getTempC(UlicaC);   // Считываем температуру на улице
       delay(100);
       TempKuhnyaC = ds.getTempC(KuhnyaC);  // Считываем температуру в кухне
       delay(100);
      }
     UlicaS = analogRead(A15)/10;           // Считываем освещенность на улице
     voltmetr();                            // Считываем напряжения на выходе ИБП (норма 13,5в)
     previousMillis = currentMillis;}       // Сброс таймера
}
 
Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014
В начале еще вот так должно быть.
 
void setup()
 
{
  ds.begin();
  ds.setResolution(ZalC, 10);   
  ds.setResolution(UlicaC, 10); 
  ds.setResolution(KuhnyaC, 10); 
Prostovova
Offline
Зарегистрирован: 17.10.2017

Пониимаю, что тема старая. Но все таки. То же столкнулся с проблеммой DS18b20. Один ("последний" изи трех) выдает -127,00

Причем если выгрызаю большой кусок кода (по работе с GSM) все встает на свои места.

Датчики определяю так: DeviceAddress Thermometer_1, Thermometer_2, Thermometer_3;

Наверно можно задать их физическими адресами, но так то то же должно работать

Где копать подскажите плиз.

vvadim
Offline
Зарегистрирован: 23.05.2012

вы с библиотекой Dallas работаете ?

Prostovova
Offline
Зарегистрирован: 17.10.2017

Да

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

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

попробуйте по моей методике. У меня шина 1 -wire проложена со многоми нарушениями. Но с таким алгоритмом даже такое небрежное подключение терпит  - работает стабильно. #24