4.14 Ejemplo 12
Medición de temperatura por medio del sensor DS1820. Uso del protocolo ‘1-wire’...
La medición de temperatura es una de las tareas más frecuentes realizadas por el microcontrolador. En este ejemplo, se utiliza un sensor DS1820 para medir. Es capaz de medir en el rango de 55 °C a 125 °C con exactitud de 0.5 °C. Para transmitir los datos al microcontrolador se utiliza un tipo especial de la comunicación serial denominado 1-wire. Debido al hecho de que estos sensores son simples de utilizar y con una amplia gama de aplicaciones, las funciones almacenadas en la librería One_Wire ponen en marcha y gobiernan estos sensores.
Esta librería contiene en total tres funciones:
- Ow_Reset se utiliza para reiniciar el sensor;
- Ow_Read se utiliza para recibir los datos del sensor; y
- Ow_Write se utiliza para enviar los comandos al sensor.
Este ejemplo muestra la ventaja de utilizar librerías con las funciones listas para ser utilizadas. Concretamente, no tiene que examinar la documentación proporcionada por el fabricante para utilizar el sensor. Basta con copiar las funciones apropiadas en el programa. Si le interesa saber cómo se declaran, basta con pulsar sobre alguna de ellas y seleccionar la opción Help.
' Cabecera******************************************************
program example_12 ' Nombre de programa
dim LCD_RS as sbit at RB4_bit ' Conexiones del módulo LCD
LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit ' Final de conexiones del módulo LCD
' Ajustar la constante TEMP_RESOLUTION a la resolusión correspondiente del sensor:
' DS18x20 utilizado: 18S20: 9 (ajustes por defecto pueden ser 9,10,11 o 12); 18B20: 12
const TEMP_RESOLUTION as byte = 9 ' Constante TEMP_RESOLUTION es de tipo byte
dim text as char[9] ' Variable text es de tipo char
temp as word ' Variable temp es de tipo word
sub procedure Display_Temperature( dim temp2write as word )
const RES_SHIFT = TEMP_RESOLUTION - 8
dim temp_whole as byte ' Variable temp_whole rd fr tipo byte
temp_fraction as word ' Variable temp_fraction es de tipo word
text = "000.0000"
if (temp2write and 0x8000) then ' Comprobar si la temperatura es negativa
text[0] = "-"
temp2write = not temp2write + 1
end if
temp_whole = word(temp2write >> RES_SHIFT) ' Extraer temp_whole
if ( temp_whole div 100 ) then ' Convertir temp_whole en caracteres
text[0] = temp_whole div 100 + 48
else
text[0] = "0"
end if
text[1] = (temp_whole div 10) mod 10 + 48 ' Extraer dígito de decenas
text[2] = temp_whole mod 10 + 48 ' Extraer dígito de unidades
temp_fraction = word(temp2write << (4-RES_SHIFT)) ' Extraer temp_fraction
temp_fraction = temp_fraction and 0x000F ' y convertirlo en
temp_fraction = temp_fraction * 625 ' unsigned int
text[4] = word(temp_fraction div 1000) + 48 ' Extraer dígito de miles
text[5] = word((temp_fraction div 100) mod 10 + 48) ' Extraer dígito de centenas
text[6] = word((temp_fraction div 10) mod 10 + 48) ' Extraer dígito de decenas
text[7] = word(temp_fraction mod 10) + 48 ' Extraer dígito de unidades
Lcd_Out(2, 5, text) ' Visualizar temperatura en el Lcd
end sub
main: ' Inicio de programa
ANSEL = 0 ' Configurar pines analógicos como digitales de E/S
ANSELH = 0
text = "000.0000"
Lcd_Init() ' Inicializar el Lcd
Lcd_Cmd(_LCD_CLEAR) ' Borrar el Lcd
Lcd_Cmd(_LCD_CURSOR_OFF) ' Apagar el cursor
Lcd_Out(1, 1, " Temperature: ")
Lcd_Chr(2,13,178) ' Visualizar el carácter de grado, 'C' para centígrados
' Distintos visualizadores LCD tienen diferentes códigos de caracteres para el grado
Lcd_Chr(2,14,"C") ' si ve la letra griega Alfa, introduzca 178 en vez de 223
while 1 ' Leer la temperatura en el bucle principal
Ow_Reset(PORTE, 2) ' Señal de reinicio de Onewire
Ow_Write(PORTE, 2, 0xCC) ' Ejecutar el comando SKIP_ROM
Ow_Write(PORTE, 2, 0x44) ' Ejecutar el comando CONVERT_T
Delay_us(120)
Ow_Reset(PORTE, 2)
Ow_Write(PORTE, 2, 0xCC) ' Ejecutar el comando SKIP_ROM
Ow_Write(PORTE, 2, 0xBE) ' Ejecutar el comando READ_SCRATCHPAD
temp = Ow_Read(PORTE, 2)
temp = (Ow_Read(PORTE, 2) << 8) + temp
Display_Temperature(temp) ' Formatear y visualizar el resultado en el LCD
Delay_ms(520) ' Retardo de 520 ms
wend
end. ' Final de programa
Para que este ejemplo funcione apropiadamente, es necesario marcar las siguientes librerías en la ventana Library Manager antes de compilar el programa: