Приехали MAXIM DS18B20, заказанные под термоконтроллер (фанбас) для сервера. Стал пробовать и столкнулся с завышением показаний, приблизительно на 3 градуса. Брак? Как оказалось, нет. На демороликах в Ютубе – та же проблема. На одном из ресурсов удалось выяснить, что это обычное явление: саморазогрев такого термометра. Способы борьбы донельзя простые: приклеить к металлическому «флажку»; вставить в металлическую трубку; приклеить к контролируемому объекту; радикально снизить частоту опроса.
Попутно разбираюсь с макеткой PinBoard: вполне позитивные впечатления. Код на микро-Паскале:
program OneWire;
// LCD module connections
var LCD_RS : sbit at PORTD2_bit;
var LCD_EN : sbit at PORTD3_bit;
var LCD_D4 : sbit at PORTD4_bit;
var LCD_D5 : sbit at PORTD5_bit;
var LCD_D6 : sbit at PORTD6_bit;
var LCD_D7 : sbit at PORTD7_bit;
var LCD_RS_Direction : sbit at DDD2_bit;
var LCD_EN_Direction : sbit at DDD3_bit;
var LCD_D4_Direction : sbit at DDD4_bit;
var LCD_D5_Direction : sbit at DDD5_bit;
var LCD_D6_Direction : sbit at DDD6_bit;
var LCD_D7_Direction : sbit at DDD7_bit;
// End LCD module connections
// Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
// 18S20: 9 (default setting; can be 9,10,11,or 12)
// 18B20: 12
const TEMP_RESOLUTION : byte = 12; {DS18B20}
var text : array[9] of char;
temp : word;
procedure Display_Temperature( temp2write : word );
const RES_SHIFT = TEMP_RESOLUTION - 8;
var temp_whole : byte;
temp_fraction : word;
begin
text := '000.0000';
// check if temperature is negative
if (temp2write and 0x8000) then
begin
text[0] := '-';
temp2write := not temp2write + 1;
end;
// extract temp_whole
temp_whole := word(temp2write shr RES_SHIFT);
// convert temp_whole to characters
if ( temp_whole div 100 ) then
text[0] := temp_whole div 100 + 48
else
text[0] := '0';
text[1] := (temp_whole div 10)mod 10 + 48; // Extract tens digit
text[2] := temp_whole mod 10 + 48; // Extract ones digit
// extract temp_fraction and convert it to unsigned int
temp_fraction := word(temp2write shl (4 - RES_SHIFT));
temp_fraction := temp_fraction and 0x000F;
temp_fraction := temp_fraction * 625;
// convert temp_fraction to characters
text[4] := word(temp_fraction div 1000) + 48; // Extract thousands digit
text[5] := word((temp_fraction div 100)mod 10 + 48); // Extract hundreds digit
text[6] := word((temp_fraction div 10)mod 10 + 48); // Extract tens digit
text[7] := word(temp_fraction mod 10) + 48; // Extract ones digit
// print temperature on LCD
Lcd_Out(2, 5, text);
end;
begin
text := '000.0000';
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, ' Temperature: ');
Lcd_Chr(2,13,223); // Print degree character, 'C' for Centigrades
// different LCD displays have different char code for degree
Lcd_Chr(2,14,'C'); // if you see greek alpha letter try typing 178 instead of 223
//--- main loop
while (TRUE) do
begin
//--- perform temperature reading
Ow_Reset(PORTB, 2); // Onewire reset signal
Ow_Write(PORTB, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(PORTB, 2, 0x44); // Issue command CONVERT_T
Delay_ms(750);
Ow_Reset(PORTB, 2);
Ow_Write(PORTB, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(PORTB, 2, 0xBE); // Issue command READ_SCRATCHPAD
Delay_ms(400);
temp := Ow_Read(PORTB, 2);
temp := (Ow_Read(PORTB, 2) shl 8) + temp;
//--- Format and display result on Lcd
Display_Temperature(temp);
Delay_ms(3000);
end;
end.
Комментариев нет:
Отправить комментарий
Ваш комментарий откроется после проверки и подтверждения.
Благодарю за понимание необходимости проверки!