ARTEM000 писал(а):Почему температура ниже чем есть на самом деле? Датчики засунуты в инкубатор, поэтому это хорошо видно. Есть другие устройства с DS18B20. Переставлял. Результат один- занижает примерно на 1 градус Цельсия. Как данные с датчиков обрабатываются?
Не могу сказать почему есть погрешность, данные полученные с датчиков никак не корректируются и никак не преобразовываются. В протеусе всё идеально, никаких отклонений, также я сверял дхт и дс- ку, клал их рядом на столе- показания одинаковые ( разница в 0.5 градуса ). Читаются данные стандартными функциями, так что я даже не знаю что ответить. Возможно погрешность образуется при температуре свыше какой- то....
float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(conv_delay[resolution]);
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;
}
дхт:
//=============MCU send START
EXT_DHT_DDR|=(1<<EXT_DHT_BIT); //pin as output
EXT_DHT_PORT&=~(1<<EXT_DHT_BIT); //0
delay_ms(18);
EXT_DHT_PORT|=(1<<EXT_DHT_BIT); //1
EXT_DHT_DDR&=~(1<<EXT_DHT_BIT); //pin as input
//=============check DHT11 response
delay_us(50);
if (EXT_DHT_PIN&(1<<EXT_DHT_BIT))
return 0;
delay_us(80);
if (!(EXT_DHT_PIN&(1<<EXT_DHT_BIT)))
return 0;
//===============receive 40 data bits
while (EXT_DHT_PIN&(1<<EXT_DHT_BIT));
for (j=0; j<5; j++)
{
data[j]=0;
for(i=0; i<8; i++)
{
while (!(EXT_DHT_PIN&(1<<EXT_DHT_BIT)));
delay_us (30);
if (EXT_DHT_PIN&(1<<EXT_DHT_BIT))
data[j]|=1<<(7-i);
while (EXT_DHT_PIN&(1<<EXT_DHT_BIT));
}
}
Опять таки, датчики всёж не аналоговые а цифровые, датчик передаёт некий набор бит мцу их читает, поэтому какой набор бит датчик передал мцу такой же набор бит мцу передал серверу, это же не терморезистор, где погрешность может быть линейной... Поэтому честно, я в замешательстве.....