За измерването на въздушната температура е използван цифров температурен сензор на фирмата Dallas/Maxim DS18B20. Диапазоните на измерване на сензора са -55
C +125
C като се гарантира точност 0.5
C от производителя за диапазона -25
C +125
C. Сензорът комуникира с микроконтролера посредством OneWireTMпротокол на Maxim. На Фиг.2.18 е показана блоковата схема на сензора.
Всеки един сензор има уникален 64битов сериен код, което позволява свързването на много такива по същия комуникационен проводник. Буферната памет (scratchpad memmory) двубайтов температурен регистър, който записва цифровия изход от температурния сензор. Допълнително тя съдържа и еднобайтов конфугурационен регистър, който позволява да бъде променяна разделителната способност на измерванията от 9 до 12 бита. T
и T
регистрите са енергонезависим EEPROM, затова те си запазват стойността когато сензора е изключен. DS18B20 използва еднопроводен OneWire протокол за обмен. Шината се нуждае от маломощен пул-ъп резистор тъй като физическия порт на OneWire модула е с отворен дрейн.
Информацията за тепмературата е съхранена като 16 битов допълнителен код в температурния регистър. На Фиг. 2.19 е показан формата на температурния регистър.
Четенето на информацията от чипа става чрез OneWire библиотеката на mikroC. Показан е част от кода за четене на температурата:
Ow_Reset(&PORTE, 2); // OneWire рестарт Ow_Write(&PORTE, 2, 0xCC); // подай команда SKIP_ROM Ow_Write(&PORTE, 2, 0x44); // подай команда за преобр на Delay_us(120); // темрературата - CONVERT_T Ow_Reset(&PORTE, 2); // Onewire рестарт Ow_Write(&PORTE, 2, 0xCC); // подай команда SKIP_ROM Ow_Write(&PORTE, 2, 0xBE); // чети от буф памет READ_SCRATCHPAD Delay_us(120); temp = Ow_Read(&PORTE, 2); // прочети MSB temp = (Ow_Read(&PORTE, 2) << 8) + temp; // прочети LSB и добави към temp if (temp & 0x8000) { // условие за определяне на температурния знак minus = 1; // температурата е отрицателна temp = ~temp + 1; } else { minus = 0; // температурата не е отрицателна } temp_whole = temp >> RES_SHIFT ; // извлечи цяло число 1** temp_whole_1 = (temp_whole/10)%10 ; // извлечи цяло число *1* temp_whole_2 = temp_whole%10 ; // извлечи цяло число **1 temp_fraction = temp << (4-RES_SHIFT); // извлечи след зап 1** temp_fraction_1 = temp_fraction%10 ; // извлечи десета *1* temp_fraction_2 = (temp_fraction/10)%10;// извлечи стотна **1