Не видит датчик температуры DS18B20

nikfcsm
Offline
Зарегистрирован: 14.12.2015

Здравсвтуйте, начинаю первые шаги с ардуиной Leonardo.

Пробую подключить датчик температуры, но упорно получаю следующую надпись 

Requesting temperatures...DONE
Device Address: 0000000000000000 Temp C: 0.00 Temp F: 32.00
Device Address: 0000000000000000 Temp C: 0.00 Temp F: 32.00
 
Пробовал подклюать 5 датчиков, подключал через резистор 4.7 кОм
Сейчас вообще подключил напрямую. Плюс к +5В, минус к GND, центральный на Digital PIN10, но всё время выдает одно и тоже сообщение, написанное выше.
Код стандартный. Помогите в чём я мог ошибиться, вроде всё элементарно, а в реале нет...
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 10
#define TEMPERATURE_PRECISION 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);

// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");

  // assign address manually.  the addresses below will beed to be changed
  // to valid device addresses on your bus.  device address can be retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
  //outsideThermometer   = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };

  // search for devices on the bus and assign based on an index.  ideally,
  // you would do this to initially discover addresses on the bus and then 
  // use those addresses and manually assign them (see above) once you know 
  // the devices on your bus (and assuming they don't change).
  // 
  // method 1: by index
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); 
  if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1"); 

  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices, 
  // or you have already retrieved all of them.  It might be a good idea to 
  // check the CRC to make sure you didn't get garbage.  The order is 
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");
  // assigns the seconds address found to outsideThermometer
  //if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();

  Serial.print("Device 1 Address: ");
  printAddress(outsideThermometer);
  Serial.println();

  // set the resolution to 9 bit
  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);

  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC); 
  Serial.println();

  Serial.print("Device 1 Resolution: ");
  Serial.print(sensors.getResolution(outsideThermometer), DEC); 
  Serial.println();
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
}

// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
  Serial.print("Resolution: ");
  Serial.print(sensors.getResolution(deviceAddress));
  Serial.println();    
}

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
  Serial.print("Device Address: ");
  printAddress(deviceAddress);
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();
  Serial.println("DONE");

  // print the device information
  printData(insideThermometer);
  printData(outsideThermometer);
}

 

 

arto1
Offline
Зарегистрирован: 04.01.2015

Введи адрес датчика

nikfcsm
Offline
Зарегистрирован: 14.12.2015

А как узнать адрес датчика?

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

nikfcsm пишет:

А как узнать адрес датчика?

Возьми OneWire без приблуд и запусти пример из нее.
Узнаешь и адрес, и температуру.

Да, и с резистором не балуй, он нужен.

nikfcsm
Offline
Зарегистрирован: 14.12.2015

Зупустил просто OneWire, выдает

 No more addresses.

Пин проверил

Что-то такое ощущение, что ардуино не работает :/ 

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

 
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nikfcsm, а с чего вдруг ардуине не работать? Может вы + и - перепутали, и датчик давно уже сдох.

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

Лучше наверно фото в студию и код примера, который запускали.

nikfcsm
Offline
Зарегистрирован: 14.12.2015

dimax пишет:

nikfcsm, а с чего вдруг ардуине не работать? Может вы + и - перепутали, и датчик давно уже сдох.

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

nikfcsm
Offline
Зарегистрирован: 14.12.2015

Подключал по такой схеме и реальные фото, код вот

#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[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
  // 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] << 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);
    // 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");
}

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

Если рассмотрел правильно, то резистор тянет к GND. А относительно картинки, датчик развернут на 180 градусов.
Если смотреть на срез корпуса, то ноги слева-направо GND, DQ, Vdd.

nikfcsm
Offline
Зарегистрирован: 14.12.2015

bwn пишет:

Если рассмотрел правильно, то резистор тянет к GND. А относительно картинки, датчик развернут на 180 градусов.
Если смотреть на срез корпуса, то ноги слева-направо GND, DQ, Vdd.

Ой, это я уже эксперементировал, сейчас резистор на средний контакт и тишина...

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

Резистор 4К7 от VDD к DQ (средней ноге), нога на 10 пин ардуины. Проверяйте все контакты и сигналы. Если только действительно экспериментами его не спалили (не знаю, как он переполюсовку питания воспринимает).

nikfcsm
Offline
Зарегистрирован: 14.12.2015

bwn пишет:

Резистор 4К7 от VDD к DQ (средней ноге), нога на 10 пин ардуины. Проверяйте все контакты и сигналы. Если только действительно экспериментами его не спалили (не знаю, как он переполюсовку питания воспринимает).

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

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

Я пока и одного не встречал. Тестер и от контакта дуины до датчика, по всем шлейфам, может в макетке контакт плохой. Только не ставьте тот, который жарили переполюсовкой.
Блинком дуина мигает нормально?

swarm38
Offline
Зарегистрирован: 04.10.2016

Доброго времени суток! Изучаю ардуинку, начал с подключения датчика температуры ds18b20, скетч стандарт из примера библиотеки onewire "DS18x20". В мониторе порта выдает "no more addresses". И вообще другие скетчи с датчиком не работают. Резистор присутствует на 4,7. Подключил такой же другой датчик температуры, все одно ничего не работает. Вот как подключил:

 

 

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

swarm38, пост , первые два предложения. За компанию еще раз проверяем схему. А зачем резистор на лишние сопли повесили? И второй конец резистора где, у плюса или GND? Дисплей нетбуковый, плохо видно.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Серый провод от резистора должен быть на +, а не на земле.

swarm38
Offline
Зарегистрирован: 04.10.2016

bwn пишет:

swarm38, пост , первые два предложения. За компанию еще раз проверяем схему. А зачем резистор на лишние сопли повесили? И второй конец резистора где, у плюса или GND? Дисплей нетбуковый, плохо видно.

Резистор между +5в и датой. Подключил минуя макетку максимально просто, результат тот же. Ардуино мигает диодом TX, RX молчит, в окне монитора порта также пусто.

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

Вы контакт тестером между резистором и прочими соединениями проверяли? И доступа к обычному без трубки нет?
Чтобы свечти к минимуму ошибки коммутации - припаяйте и резистор к выводам датчика, а потом прозвоните от этих выводов до нижнего выхода (запаяного) контакта на меге. Ну и номер пина соответствует написанному в программе?

swarm38
Offline
Зарегистрирован: 04.10.2016

Попробую прозвонить контакты. Датчика в наличии 2шт и оба в термооболочке, с обоими пока не работает. Резистор на скрутке, припаяю. Номер пина соответствует скетчу.

Нуидела
Offline
Зарегистрирован: 31.01.2017

nikfcsm пишет:

Пробую подключить датчик температуры, но упорно получаю следующую надпись 

Requesting temperatures...DONE
Device Address: 0000000000000000 Temp C: 0.00 Temp F: 32.00
Device Address: 0000000000000000 Temp C: 0.00 Temp F: 32.00
 
Эти 3 строчки - весь вывод?
zadonck
Offline
Зарегистрирован: 26.03.2017


 Добрый вечер. Помогите подправить скетч-я новичок.Подключил датчик температуры ds18b20 и дисплей с библиотекой UTFT. Всё заработало.Из-за того что эта библиотека сжирает много места перешол на TFT. Начал править скетч дошол до 30 строчки и ни чего не получается.

#include <TFT.h>

#include <SPI.h>

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

// pin definition for the Uno
#define cs   10
#define dc   9
#define rst  8

TFT TFTscreen = TFT(cs, dc, rst);   // Remember to change the model parameter to suit your display module!
extern uint8_t SevenSegNumFont[];                      // подключаем цифровой шрифт
// Declare which fonts we will be using
extern uint8_t SmallFont[];
#define ONE_WIRE_BUS 7 // Номер пина термометра
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;
float tempC = 0;
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(2);                    // устанавливаем цифровой шрифт
  TFTscreen.printNumI(tempC, 1, CENTER, 0);
}
void setup()
{
 TFTscreen.begin();
  TFTscreen.background(0, 0, 0);

  sensors.begin();
  sensors.getAddress(insideThermometer, 0);
  sensors.setResolution(insideThermometer, 12); 
 
}



  
void loop ()
{
   sensors.requestTemperatures();
  printTemperature(insideThermometer);
   
  
}

 

xorkrus
Offline
Зарегистрирован: 22.09.2013

Решения проблемы первых двух вопрощающих не увидел, добавлю свои две копейки.

Ситауция такая же: 8 датчиков, 100% рабочих (проверяются в другой конструкции). А вот ни ардуино про мини (atmega326/16MHz), ни самоделка (atmega168/4MHz), не видят датчиков. Пробовал скетчи и OneWire и вообще уже все подряд на тему DS18B20. Пробовал разные пины. С подтяжкой, без, с паразитным питанием... ни-че-го. Может есть какая-то тайна?

sadman41
Offline
Зарегистрирован: 19.10.2016

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

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

Ви таки лучше по порядку, каким скетчем из OneWire пробовали и схему, а то боюсь, это у вас секрет какой-то.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

У меня недавно не видел из за не контакта резистора 4.7 к

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

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

Иван Шупорин
Offline
Зарегистрирован: 09.01.2019

Ровно такая же ситуация. no more addresses. На англоязычных сайтах рекомендуют понижать сопротивление. 4,7- 2,2 - 1 и ниже. Пишут о каких-то бракованнчых партиях. Возможно поэтому они пачками и не работают. дошел до 680 ом ничего путного пока не получилось