ds18b20 не правильно показывает температуру.

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

Да можно и паяльником или феном чуть погреть, что б далеко не ходить.  Пока подозрение на самый старший залипший бит  MSB:BSSSSS1xx  Если он действительно "залип", то выше 64 градусов датчик начнёт правильно показывать температуру :)

Dart.sh
Offline
Зарегистрирован: 21.02.2016

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

vsvleo
Offline
Зарегистрирован: 29.09.2016

то же показывал 80 градусов.. Подключен был к esp8266 +5в.. Все разрешилось после переключения питания на 3.3в

obodoc
Offline
Зарегистрирован: 25.10.2018

Этот датчик точность измерения имеет 0,5 градуса. И то не во всем диапазоне. У меня работает. Но врет и он, и bmp 280. И на несколько градусов...

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

obodoc пишет:
Этот датчик точность измерения имеет 0,5 градуса. И то не во всем диапазоне. У меня работает. Но врет и он, и bmp 280. И на несколько градусов...

Та ладно, с чего такой вывод?

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

Недавно обнаружил следующую неисправность на одном из датчиков. Из-за неудачной прокладки кабеля, перетерлись и закоротили все три жилки. Как там чего коротило не особо вникал, там есть вибрация. После изолирования и восстановления целостности проводки датчик получил дефект. Отключаешь питание, ждешь стабилизации температуры, включаешь – датчик начинает плавно набирать температуру. По прикидкам у меня висит примерно +5 С. Пока не мучил датчик, только наблюдаю. Есть предположения, что подгорел дата порт и теперь подогревает корпус датчика.

Резюме: самый первый способ определить неисправность DS18B20 термостатировать датчик и снять лог первых 30 сек после подачи питания на него. Ну и всяческие комбинации при подачи питания «с ноги» МК. 

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

obodoc пишет:
Этот датчик точность измерения имеет 0,5 градуса. И то не во всем диапазоне. У меня работает. Но врет и он, и bmp 280. И на несколько градусов...

почитайте этот топик, желатеьно полностью.   Более подробных по данному вопросу на этом форуме не встречал. Первые 90 постов настоятельно рекомендую прочитать.  

blanca12
Offline
Зарегистрирован: 30.10.2018

в коде ошибка пересчёта показаний.

NA
Offline
Зарегистрирован: 06.02.2018

А сталкивался кто с "уходом" показаний DS18B20 в приличный "плюс" в течение примерно полугода? Сразу несколько штук.
Заменил на новые - и опять всё хорошо (т.е. проблема именно в датчиках). 

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

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

NA пишет:

А сталкивался кто с "уходом" показаний DS18B20 в приличный "плюс" в течение примерно полугода? Сразу несколько штук.
Заменил на новые - и опять всё хорошо (т.е. проблема именно в датчиках). 

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

угу, недавно поменял, но он не совсем в + ушел, после выключения остывал и очень быстро нагревался после включения (пост 56)

NA
Offline
Зарегистрирован: 06.02.2018

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

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

Dart.sh пишет:

#include <OneWire.h>
OneWire ds(9);
 
void setup() {
Serial.begin(9600); 
}
 
void loop() {
 
byte data[2];
ds.reset(); 
ds.write(0xCC);
ds.write(0x44);
delay(750);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read(); 
data[1] = ds.read();
int Temp = (data[1]<< 8)+data[0];
Temp = Temp>>4;
Serial.println(Temp);
}

Это "кто" нацарапал? ШкольнеГ?

Нармальные "пацаны" сначала "узнают" сигнатуру датчика, потом настраивают точность его измерения АДРЕСНО обращаясь именно к нужному датчику! Потом дают команду на старт измерения либо АДРЕСНО, либо всем датчикам СРАЗУ. Команду delay стрёмно использовать, это признак недопрограммиста. Нормальные пацаны делают флаговЫе поля для чётко вымеренных временных интервалов, например в 1 секунду и уже по "поднятию" временного флага дают команды датчикам. Есть так-же проверка на присутствие датчика на шине и проверка контрольной суммы в ответной пачке байт с датчика. Только после всего этого принятая от датчика "пачка" байт считается валидной!  Отт как нужно программировать...)))))

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

-NMi- пишет:

Это "кто" нацарапал? ШкольнеГ?

Нармальные "пацаны" сначала "узнают" сигнатуру датчика, потом настраивают точность его измерения АДРЕСНО обращаясь именно к нужному датчику! Потом дают команду на старт измерения либо АДРЕСНО, либо всем датчикам СРАЗУ. Команду delay стрёмно использовать, это признак недопрограммиста. Нормальные пацаны делают флаговЫе поля для чётко вымеренных временных интервалов, например в 1 секунду и уже по "поднятию" временного флага дают команды датчикам. Есть так-же проверка на присутствие датчика на шине и проверка контрольной суммы в ответной пачке байт с датчика. Только после всего этого принятая от датчика "пачка" байт считается валидной!  Отт как нужно программировать...)))))

1. Нахрена ее узнавать для одного датчика?
2. Зачем настраивать разрядность каждый раз?
3. 0xCC, что делает, по вашему?
4. С делеем соглашусь, хотя для теста и он пойдет.
5. У меня года три без КС работает и ничего, все валидно.

AleksSF
Offline
Зарегистрирован: 06.03.2019

[byte data[2];

ds.reset(); 
ds.write(0xCC);
ds.write(0x44);
delay(750);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read(); 
data[1] = ds.read();
int Temp = (data[1]<< 8)+data[0];
Temp = Temp>>4;
 
А вы какой датчик читаете после конвертации ? Все сразу , что ли.
Вот из даташита:
 SKIP ROM [CCh] Пропуск ROM [CCh]
Главное устройство может использовать эту команду, чтобы обратиться ко всем устройствам на шине одновременно. Например, главное устройство может заставить, чтобы все DS18B20 (датчики температуры) на шине, начали одновременно температурные преобразования. Для этого необходимо выдать на шину команду Пропуска ROM [CCh] сопровождаемую командой Температурного преобразования [44h].
Обратите внимание, что команда ЧТЕНИЕ ПАМЯТИ [BEh] может следовать за командой Пропуска ROM, только если на шине присутствует одно подчиненное устройство. Команда Пропуска ROM, сопровождаемая командой ЧТЕНИЕ ПАМЯТИ вызовет конфликт на уровне данных на шине, если на шине более одного подчиненного устройства, так как все устройства будут пытаться одновременно передавать данные.
Ardfun
Offline
Зарегистрирован: 22.05.2016

Стикался ли кто то с проблемой когда нужно менрять температуру больше 90 а датчик только до 80 доходит и пишет -127 в чем проблема так как датчик работать должен в пределах -55 до +125 ?

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

Ardfun пишет:
Стикался ли кто то с проблемой когда нужно менрять температуру больше 90 а датчик только до 80 доходит и пишет -127 в чем проблема так как датчик работать должен в пределах -55 до +125 ?

номинал сопротивления шины данных и какой режим используете 2х проводный или 3х проводный?  

Ardfun
Offline
Зарегистрирован: 22.05.2016

Режим роботи 3х проводной сопротивление между + и сигнальним 4.8к(хотя где то читал но не пробовал можно от 4-10к ?)
А каким образом 2х проводной режим использовать?

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

Ardfun пишет:
Режим роботи 3х проводной сопротивление между + и сигнальним 4.8к(хотя где то читал но не пробовал можно от 4-10к ?) А каким образом 2х проводной режим использовать?

сопротивление слишком большое и не годится для высокой температуры, я не парюсь и использую 2,2к или 2,7к просто опрашиваю немного реже. 2х проводный режим не годится для температур выше (вот тут много разных вариантов встречал в разных ДШ) 60 С. 

сталкивался с трудностями даже при рекомендуемом 4к7 сопротивлении...

Ardfun
Offline
Зарегистрирован: 22.05.2016

Благодарю буду пробовать :)
То мне нужно для системы автоматики в автоелектрике контроль охлаждающей жидкости и запуск вентиляторов :)

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

Гриша пишет:

сталкивался с трудностями даже при рекомендуемом 4к7 сопротивлении...

Есть "девайс" , там 9-ть датчиков 18b20 на одной шине. Резистор подтяжки 4к7 стоит у МК. Никаких конденсаторов на питании нет. Измеряем температуру 30-110. Долго. Бывает и сутками. В софте есть логгер ошибок по датчикам. Редкий раз вижу значение, отличающееся от нуля.

МК управляет твердотельным реле 1,2 или 4 кВт 220 Вольт.

Есть дисплей i2c, RTC и клавиатура. Есть логгер и по i2c. Всё собрано "на коленке".

Работает так больше года.

...Почему нет проблем???  (шлейф с датчиками = МГТФ... метра 3 точно)

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

-NMi- пишет:

Есть "девайс" , там 9-ть датчиков 18b20 на одной шине. Резистор подтяжки 4к7 стоит у МК.

Работает так больше года.

...Почему нет проблем???  (шлейф с датчиками = МГТФ... метра 3 точно)

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

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

Гриша, а у меня вот есть некоторые идеи.

Но хотелось бы от Вас получить ссылку на

//2х проводный режим не годится для температур выше (вот тут много разных вариантов встречал в разных ДШ) 60 С

И еще, интересно.

// датчик начинает плавно набирать температуру. По прикидкам у меня висит примерно +5 С. Пока не мучил датчик, только наблюдаю. Есть предположения, что подгорел дата порт и теперь подогревает корпус датчика.

Нельзя ли померить ток потребления? По земле и по питанию.

 

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

For parasite-powered DS18B20s, the master must enable a strong pullup on the 1-Wirebus during temperature conversions and copies from the scratchpad to EEPROM. No other bus activity may take place during this time

...

The use of parasite power is not recommended for temperatures above +100°C since the DS18B20 may not be able to sustain communications due to the higher leakage currents that can exist at these temperatures. For applications in which such temperatures are likely, it is strongly recommended that the DS18B20 be powered by an external power supply.

В старом ДШ от даласа видел цифирю +85 ... но его сорян искать не буду... возможно это было связано с применением простого сопротивления, без подтяжки транзистором (там схема есть)

DS18B20 Datasheet (PDF) - Maxim Integrated Products

Logik пишет:

Гриша, а у меня вот есть некоторые идеи.

Но хотелось бы от Вас получить ссылку на

//2х проводный режим не годится для температур выше (вот тут много разных вариантов встречал в разных ДШ) 60 С

И еще, интересно.

// датчик начинает плавно набирать температуру. По прикидкам у меня висит примерно +5 С. Пока не мучил датчик, только наблюдаю. Есть предположения, что подгорел дата порт и теперь подогревает корпус датчика.

Нельзя ли померить ток потребления? По земле и по питанию.

я его потерял в своем хламе :((((  он стоял на приборе далеко от дома (градусник в деревне) просто заменил и все на этом.

Ardfun
Offline
Зарегистрирован: 22.05.2016

Поставил резистор на 3к и все работает показывала до 120 норм. То от 2к до 3.5к можно спокойно ставить и будет ок

forwov
Offline
Зарегистрирован: 24.12.2020

-NMi- пишет:

Нармальные "пацаны" сначала "узнают" сигнатуру датчика, потом настраивают точность его измерения АДРЕСНО обращаясь именно к нужному датчику! Потом дают команду на старт измерения либо АДРЕСНО, либо всем датчикам СРАЗУ. Команду delay стрёмно использовать, это признак недопрограммиста. Нормальные пацаны делают флаговЫе поля для чётко вымеренных временных интервалов, например в 1 секунду и уже по "поднятию" временного флага дают команды датчикам. Есть так-же проверка на присутствие датчика на шине и проверка контрольной суммы в ответной пачке байт с датчика. Только после всего этого принятая от датчика "пачка" байт считается валидной!  Отт как нужно программировать...)))))

Можно ссылкочку на пример скетча пож.?

p.s. Долбусь некоторе время с парой датчиков. Упрямо шлют "0" в консоль. Интересует момент отладки. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

forwov пишет:

-NMi- пишет:

Нармальные "пацаны" сначала "узнают" сигнатуру датчика, потом настраивают точность его измерения АДРЕСНО обращаясь именно к нужному датчику! Потом дают команду на старт измерения либо АДРЕСНО, либо всем датчикам СРАЗУ. Команду delay стрёмно использовать, это признак недопрограммиста. Нормальные пацаны делают флаговЫе поля для чётко вымеренных временных интервалов, например в 1 секунду и уже по "поднятию" временного флага дают команды датчикам. Есть так-же проверка на присутствие датчика на шине и проверка контрольной суммы в ответной пачке байт с датчика. Только после всего этого принятая от датчика "пачка" байт считается валидной!  Отт как нужно программировать...)))))

Можно ссылкочку на пример скетча пож.?

p.s. Долбусь некоторе время с парой датчиков. Упрямо шлют "0" в консоль. Интересует момент отладки. 

на вемосе, но разницы нет
 

#include <ESP8266WiFi.h>
#include <ESP8266Ping.h>

/* DS18B20 Temperature Sensor */
#include <OneWire.h>
#include<DallasTemperature.h>    // <a data-cke-saved-href="https://github.com/milesburton/Arduino-Temperature-Control-Library" href="https://github.com/milesburton/Arduino-Temperature-Control-Library" rel="nofollow">https://github.com/milesburton/Arduino-Temperature-Control-Library</a>
#define ONE_WIRE_BUS D2          // DS18B20 подключаем на D4 на плате  (a 4.7K resistor is necessary)
                                 // D0 - GPIO6
                                 // D1 - GPIO5
                                 // D2 - GPIO4 
                                 // D3 - GPIO0
                                 // D4 - GPIO2 
                                 // Если надо задать GPIO указываем его номер ( ONE_WIRE_BUS 2) - GPIO2
                                 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
float tempC0;
float tempC1;
float tempC2;

#include <Ticker.h>
Ticker flipper;

const char* ssid     = "Oss"; //"Rostelecom";
const char* password = "1234";
const char* host = "mydomen.pro";
const int httpPort = 80;
const int interval = 1*60; // 1 минута
bool ret;
int tm = interval;

  
void flip(){
  tm--;
//  Serial.println(tm);
}


void getData()
{
  DS18B20.requestTemperatures();
  tempC0 = DS18B20.getTempCByIndex(0); // Sensor 0 показания для датчика 1 в цельсиях
  tempC1 = DS18B20.getTempCByIndex(1); // Sensor 0 показания для датчика 2 в цельсиях
  tempC2 = DS18B20.getTempCByIndex(2); // Sensor 0 показания для датчика 3 в цельсиях

  Serial.print(" tempC0: ");
  Serial.print(tempC0);
  Serial.println(" oC . ");
  
  Serial.print(" tempC1: ");
  Serial.print(tempC1);
  Serial.println(" oC . ");

  Serial.print(" tempC2: ");
  Serial.print(tempC2);
  Serial.println(" oC . ");
}


void setup() {
  Serial.begin(115200);
  delay(10);
  DS18B20.begin();
  delay(10);
  DS18B20.setResolution(12);               // устанавливаем разрешение градусника 9, 10, 11, или 12 bit
 
  getData();                               // забираем температуру с градусников 
  Send();                                  // при включении отправляем данные
  flipper.attach(1, flip);                 // запускаем таймер
}


// функция отправляет данные в базу на сайте
void Send() { 

  // Подключаемся к wifi
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");                    } //

  Serial.println();                       // отправляем в Serial данные о подключении
  Serial.println("WiFi connected");  
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("MAC address: ");
  Serial.println(WiFi.macAddress());
  Serial.println();
  
  // подключаемся к серверу 
  Serial.print("ping connecting http://");
   Serial.println(host);
  for(int i = 0; i <3; i++){
  ret = Ping.ping(host);
  Serial.print(ret);
 }
  Serial.println();
  
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
     return;
  }
  
  // отправляем данные  
  Serial.println("Sending..."); 
  // заголовок
  String url = "/temp/ds18b20.php?";
  url += "&tempC0=";
  url += tempC0;
  url += "&tempC1=";
  url += tempC1;
  url += "&tempC2=";
  url += tempC2;
  url += "&macIP=";
  url += WiFi.macAddress();
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  client.stop();
  delay(10);

  // читаем ответ  и отправляем его в сериал
  // вообще на ответ нужно как-то реагировать
  Serial.print("Requesting: ");  
  while(client.available()){
  String line = client.readStringUntil('\r');
  Serial.print(line);    }  //
  client.stop();
  Serial.println();
  Serial.println();
  Serial.println("Closing connection");
  WiFi.disconnect(); // отключаемся от сети
  Serial.println("Disconnect WiFi.");
}


void loop() {
 if (tm == 0){                        // если таймер отработал
    flipper.detach();                 // выключаем
    tm = interval;                    // сбрасываем переменную таймера
    getData();                        // забираем температуру с градусников
    Send();                           // отправляем
    flipper.attach(1, flip);          // включаем прерывание по таймеру
  }  
}  // END LOOP