/* maximum number of DS18B20 connected to the 1 Wire bus */ #define MAX_DEVICES 8
/* DS18B20 devices ROM code storage area */ unsigned char rom_code[MAX_DEVICES][9];
main() { unsigned char i,j,devices;
lcd_init(16); lcd_putsf("CodeVisionAVR\n1 Wire Bus Demo"); delay_ms(2000); lcd_clear();
/* detect how many DS18B20 devices are connected to the 1 Wire bus */ devices=w1_search(0xf0,rom_code); sprintf(lcd_buffer,"%u DS18B20\nDevice detected",devices); lcd_puts(lcd_buffer); delay_ms(2000);
/* display the ROM codes for each device */ if (devices) { for (i=0;i<devices;i++) { sprintf(lcd_buffer,"Device #%u ROM\nCode is:",i+1); lcd_clear(); lcd_puts(lcd_buffer); delay_ms(2000); lcd_clear(); for (j=0;j<8;j++) { sprintf(lcd_buffer,"%02X ",rom_code[i][j]); lcd_puts(lcd_buffer); if (j==3) lcd_gotoxy(0,1); }; delay_ms(5000); }; } else while (1); /* stop here if no devices were found */
/* configure each DS18B20 device for 12 bit temperature measurement resolution */ for (i=0;i<devices;) if (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES)) { sprintf(lcd_buffer,"Init error for\ndevice #%u",i); lcd_clear(); lcd_puts(lcd_buffer); while (1); /* stop here if init error */ };
/* measure and display the temperature(s) */ while (1) { j=1; for (i=0;i<devices;i++) { sprintf(lcd_buffer,"t%u=%+.3f\xdfC",j++,ds18b20_temperature(&rom_code[i][0])); lcd_clear(); lcd_puts(lcd_buffer); delay_ms(500); }; }; }
Но в результате на ЖКИ появляется лишь <t=.3f> Как я понимаю здесь U-порядковый номер устройства, а какую же переменную в буфер дисплея записывать???
Сделал термометр на DS18B20, температуру прееобразует нормально, но постепенно нагревается. Нагревается примерно на +5 градусов, вследствие показывает неправильно, вместо 23 например 28-29 гр. У кого нибудь такое было? И как это лечится?
1. Заменой датчика. Был один вроде нормальный, а при -15 его заклинило и поперло аж +40. 2. Выносом его с платы 3. Увеличением интервала между опросами 4. Улучшением теплопроводности датчик-окружающая среда. Можно его намазать термопастой и прижать к алюминиевой пластинке.
Real lev писал(а):Сделал термометр на DS18B20, температуру прееобразует нормально, но постепенно нагревается. Нагревается примерно на +5 градусов, вследствие показывает неправильно, вместо 23 например 28-29 гр. У кого нибудь такое было? И как это лечится?
На картинке хоть и не DS18B20, а аналоговый датчик LM335, но изолированный. Тоже подойдет как вариант. А изолировать действительно есть нужда иногда. Можно поставить рядом с DS18B20 маленький контроллер (типа ATtiny) и изолировать однонаправленные линии интерфейса. Или можно взять оптронную развязку, которая применяется для шины I2C. Когда-то хотел попробовать сделать для DS18B20 трансформаторную развязку, чтобы через него и питание датчик получал, и данные передавал. Но руки не дошли, даже не уверен, что получится.