DS18B20 выдает 127,94 с библиотекой DallasTemperature
- Войдите на сайт для отправки комментариев
Пт, 06/03/2015 - 22:17
Датчик температуры 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");
}
Гм, а не использовать DallasTemperature религия не позволяет?
Выдает +127 или -127?
Именно (+) 127.94.
Можно и без DallasTemperature. Религия позволяет но это не обьясняет причину!
мда...первый раз сталкиваюсь с +127...даже не знаю на что грешить...ну,раз библиотеку даллас меняли и не помогло,может OneWire библиотеку заменить?еще чтоб наверняка,можно попробовать обратиться к датчику по конкретному его адресу...сначала вам этот адресс надо узнать,есть скетч в примерах,который в сериал напишет адрес подключенного датчика...потом в своем скетче вверху напишите
потом по скетчу спрашиваем с него температуру уже так
Адрес определил. По конкретному адресу обращался. Результат тот же.
Среду програмирования сносил и устанавливал новую. Onwire менял.
Глюк какойто не понятный!! Даже не знаю с чего начать? Жду посылку с новыми DS18B20. попробую заменить.
Но как бы с OnWire датчик работает!
А еще попробуй меньши сопротивление опорного резистор. Который с +5В на шину данных идет. Ну или в качестве эксперимента, подсоедини параллельно ему еще один резистор ну где то на 10кОм. Будет ли эффект. У меня есть эффект. Но датчик иногда выдавал -127. Провода до датчика какие? длина большая, есть экран? А еще я сделал в программе, что если датчик выдает -127, то сразу же происходит сброс и перезапрос датчика. И тоже очень помогло!
http://arduino.ru/forum/proekty/sistema-umnyi-dom-dlya-zagorodnogo-doma-...
Пониимаю, что тема старая. Но все таки. То же столкнулся с проблеммой DS18b20. Один ("последний" изи трех) выдает -127,00
Причем если выгрызаю большой кусок кода (по работе с GSM) все встает на свои места.
Датчики определяю так: DeviceAddress Thermometer_1, Thermometer_2, Thermometer_3;
Наверно можно задать их физическими адресами, но так то то же должно работать
Где копать подскажите плиз.
вы с библиотекой Dallas работаете ?
Да
попробуйте по моей методике. У меня шина 1 -wire проложена со многоми нарушениями. Но с таким алгоритмом даже такое небрежное подключение терпит - работает стабильно. #24