ds18b20 параметр разрядности преобразования

В данный форуме Вы можете создавать темы посвящённые расширению функционала программы или сайта. После рассмотрения Ваше предложение будет перенесено в соответствующее место
Ответить
ItsMe
Рядовой
Сообщения: 51
Зарегистрирован: 24.09.2015{, 15:43}
Репутация: 1

ds18b20 параметр разрядности преобразования

#1

Сообщение ItsMe » 10.05.2017{, 14:55}

Датчик имеет программную возможность изменения разрядности преобразования температуры от 9 до 12 бит.
Делается это при помощи команды sensors.setResolution(Датчик, Разрядность); в секции setup
Соответственно изменяется шаг изменения температуры (от 0,5 градусов до 0,0625) и время, затрачиваемое на перекодировку результата измерения, причем в разы. Если 9-битное преобразование занимает всего 93,75 ms, то 12-битное, установленное по умолчанию, - целых 750 ms.
И возвращаясь к теме, все-таки хочется поддержки вывода аварии, т.к. эта функция тоже есть в датчике.

Данные взяты отсуда.

saybeer
Рядовой
Сообщения: 35
Зарегистрирован: 28.04.2018{, 09:06}
Репутация: 0
Откуда: Ростов-на-Дону
Имя: Андрей

ds18b20 параметр разрядности преобразования

#2

Сообщение saybeer » 29.04.2018{, 17:58}

Есть пользовательский блок с СRС суммой и выходом ERROR, причем встречается в разных вариантах с автоматическим определением адреса 1 датчик один пин, с ручным вводом адреса, но все завышают показания по температуре, что сводит на нет преимущества блока.
Вложения
ds18b20_(CODE).ubi
(67.57 КБ) 60 скачиваний
ds18b20(1-Wire)_nA(_generator)_(CODE).ubi
(92.37 КБ) 64 скачивания
ds18b20(1-Wire)_(CODE).ubi
(77.43 КБ) 77 скачиваний

Аватара пользователя
RedSky
Лейтенант
Сообщения: 534
Зарегистрирован: 19.12.2016{, 20:07}
Репутация: 65
Откуда: Днепропетровск
Имя: Алексей

ds18b20 параметр разрядности преобразования

#3

Сообщение RedSky » 30.04.2018{, 08:50}

saybeer, приложите проект.

saybeer
Рядовой
Сообщения: 35
Зарегистрирован: 28.04.2018{, 09:06}
Репутация: 0
Откуда: Ростов-на-Дону
Имя: Андрей

ds18b20 параметр разрядности преобразования

#4

Сообщение saybeer » 30.04.2018{, 13:53}

CODE врет на 7 градусов в большую сторону.
Вложения
DS18B20 (CODE) TEST.flp
(140.44 КБ) 49 скачиваний
DS18B20 TEST.flp
(64.2 КБ) 54 скачивания

Аватара пользователя
RedSky
Лейтенант
Сообщения: 534
Зарегистрирован: 19.12.2016{, 20:07}
Репутация: 65
Откуда: Днепропетровск
Имя: Алексей

ds18b20 параметр разрядности преобразования

#5

Сообщение RedSky » 30.04.2018{, 14:47}

У Вас опрос датчика происходит в каждом цикле. Вот так будет работать правильно.
Вложения
ds18b20 правильный вариант.flp
(180.86 КБ) 95 скачиваний

saybeer
Рядовой
Сообщения: 35
Зарегистрирован: 28.04.2018{, 09:06}
Репутация: 0
Откуда: Ростов-на-Дону
Имя: Андрей

ds18b20 параметр разрядности преобразования

#6

Сообщение saybeer » 30.04.2018{, 15:01}

RedSky, У вас есть возможность протестировать в железе? А то мы топчемся на одном месте. Все делают на этом блоке и у всех правильная температура, а у меня нет! Проблема здесь в коде этого блока. Умножение у меня стоит потому что без него он показывает 3.00, я пробывал и с генератором и без - нет результата. Такое ощущение что в железе никто не испытывал этот блок, а только рисовал.

Аватара пользователя
RedSky
Лейтенант
Сообщения: 534
Зарегистрирован: 19.12.2016{, 20:07}
Репутация: 65
Откуда: Днепропетровск
Имя: Алексей

ds18b20 параметр разрядности преобразования

#7

Сообщение RedSky » 30.04.2018{, 15:55}

Проверил в железе - работает нормально без умножения на 10. Плата уно, FLprog 2.5.1, IDE 1.8.5. На всякий случай прикладываю рабочую библиотеку.
Вложения
dallas test.zip
(38.76 КБ) 72 скачивания

Аватара пользователя
Alias
Лейтенант
Сообщения: 476
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

ds18b20 параметр разрядности преобразования

#8

Сообщение Alias » 30.04.2018{, 16:42}

RedSky писал(а):
30.04.2018{, 14:47}
Вот так будет работать правильно
А с точки зрения оптимизации есть ли смысл помещать блоки определения температуры на отдельные платы, работающие с нужным интервалом, или достаточно вот так, через генератор, их опрашивать?
Если датчик от генератора опрашивается каждые 5 секунд, то и умножения на 10 с конвертированием и выводом на экран тоже выполняется не в каждом цикле, а один раз в 5 секунд?

saybeer
Рядовой
Сообщения: 35
Зарегистрирован: 28.04.2018{, 09:06}
Репутация: 0
Откуда: Ростов-на-Дону
Имя: Андрей

ds18b20 параметр разрядности преобразования

#9

Сообщение saybeer » 30.04.2018{, 17:04}

RedSky, Плата UNO, FLPROG 3.0.3, IDE 1.8.5 попробовал с вашей библиотекой ничего не изменилось, у меня умножать надо а то 3.4 на дисплее. Киньте свой блок DS18B20.
Вот код из IDE
СпойлерПоказать
#include <OneWire.h>

#include <LiquidCrystal.h>
LiquidCrystal _lcd1(0, 1, 2, 3, 4, 5);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;

bool in_90674359_1;
float temp_90674359_1;
bool crcOK_90674359_1;
bool error_90674359_1;
OneWire ds_90674359_1(8);
byte i_90674359_1;
byte data_90674359_1[9];
bool _gtv1;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
int _swi1;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
int _disp1oldLength = 0;
void setup()
{
pinMode(13, OUTPUT);

_lcd1.begin(16, 2);

}
void loop()
{if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}





//Плата:1
if(_gtv1) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 1000)) _tim1O = 0;}}}
if(_tim1O)
{_swi1=100;}
else
{_swi1=1500;}
if (1) { if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0;}
if (_gen1I) { if ( _isTimer ( _gen1P , _swi1 )) { _gen1P = millis(); _gen1O = ! _gen1O;}}
if (_gen1O) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
in_90674359_1 = _trgrt1;

if(in_90674359_1){
ds_90674359_1.reset();
ds_90674359_1.write(0xCC); //SKIP ROM
ds_90674359_1.write(0xBE); // Read Scratchpad
for ( i_90674359_1 = 0; i_90674359_1 < 9; i_90674359_1++) { // we need 9 bytes
data_90674359_1[i_90674359_1] = ds_90674359_1.read();}
int16_t raw = (data_90674359_1[1] << 8) | data_90674359_1[0];
temp_90674359_1 = (float)raw / 16.0;
byte CRC=OneWire::crc8(data_90674359_1, 8); //расчёт crc из температуры???
byte crc=data_90674359_1[8]; // получение crc напрямую из датчика???
ds_90674359_1.reset();
ds_90674359_1.write(0xCC);
ds_90674359_1.write(0x44, 1); //start convert
if(CRC==crc){
crcOK_90674359_1=true;}
else{
crcOK_90674359_1=false;}
error_90674359_1 = 0;
if ((data_90674359_1[0] == 255) && (data_90674359_1[1] == 255) && (data_90674359_1[2] == 255) && (data_90674359_1[3] == 255) && (data_90674359_1[4] == 255) && (data_90674359_1[5] == 255) && (data_90674359_1[6] == 255) && (data_90674359_1[7] == 255) && (data_90674359_1[8] == 255))
{error_90674359_1 = 1;}
if ((data_90674359_1[0] == 0) && (data_90674359_1[1] == 0) && (data_90674359_1[2] == 0) && (data_90674359_1[3] == 0) && (data_90674359_1[4] == 0) && (data_90674359_1[5] == 0) && (data_90674359_1[6] == 0) && (data_90674359_1[7] == 0) && (data_90674359_1[8] == 0))
{error_90674359_1 = 1;}
}

digitalWrite(13, error_90674359_1);
_gtv1 = error_90674359_1;
if (1) {
_dispTempLength1 = ((( _floatToStringWitRaz((1.00)*(temp_90674359_1),1)))).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((( _floatToStringWitRaz((1.00)*(temp_90674359_1),1))));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;}
}




}
String _floatToStringWitRaz(float value, int raz)
{

return String(value,raz);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}

Ответить

Вернуться в «Новые»