Miuva Pro cuenta con un sensor de temperatura TMP102 integrado en la tarjeta, el cual se comunica por medio del protocolo I2C. Por lo tanto en esta práctica aprenderemos a utilizar este recuerso.
Lo primero que haremos será declarar en nuestro código que utilizaremos dicho protocolo:
#use I2C(MASTER, SCL=PIN_D6, SDA=PIN_D5)
Indicamos que Miuva Pro será el dispositivo maestro y la ubicación a donde esta conectado el sensor.
Es importante recordar que cuando se utiliza I2C tenemos que conocer la dirección esclava del dispositivo a utilizar, tanto para escritura como para lectura, en este caso las declararemos de la siguiente forma:
#define dir_lec 0x91 //dirección esclava de lectura #define dir_esc 0x90 //dirección esclava de escritura
Crearemos también una función que reciba información del sensor, los pasos para recibir información por I2C son:
Recepción de información
1. Enviar condición de incio
2. Enviar dirección esclava de escritura
3. Registro que se va a leer
4. Condición de inicio
5. Enviar dirección esclava de lectura
6. Recibe información del registro
7. Condición de paro
i2c_start(); i2c_write(dir_esc); i2c_write(0); i2c_start(); i2c_write(dir_lec; x = i2c_read(0); i2c_stop();
El registro 0 del sensor tiene la información de la temperatura detectada.
Por lo tanto el código quedaría de la siguiente forma:
#include <18F87J50.h> #fuses HSPLL, NOWDT, NOPROTECT, NODEBUG, PLL2 #use delay (clock=24M) #include <stdlib.h> #use I2C(MASTER, SCL=PIN_D6, SDA=PIN_D5) #define dir_lec 0x91 //dirección esclava de lectura #define dir_esc 0x90 //dirección esclava de escritura #include<MPLCD.c> int temp; //Variable temporal para almacenar valor de temperatura int lectura_Temp(); //Prototipo de funcion de lectura de temperatura void main(){ lcd_init(); //Inicializa LCD lcd_gotoxy(1,1); //Escribe en la dirección 1,1 de la LCD printf(lcd_putc, "Sensor TMP102"); //Sensor TMP102 while(true){ //Bucle infinito temp = lectura_Temp(); //Ejecuta la función lectura_Temp lcd_gotoxy(1,2); //Escribe en la posición 1,2 de la LCD printf(lcd_putc, "Temp. = %d", temp); //Temp. = "TEMPERATURA" } } int lectura_Temp(){ //Función lectura_Temp int x; //Variable para recibir información del sensor i2c_start(); //Condición de inicio i2c_write(dir_esc); //Dirección esclava para escritura i2c_write(0); //Registro a leer (0) i2c_start(); //Condición repetida de inicio i2c_write(dir_lec); //Dirección esclava para lectura x = i2c_read(); //Recibe byte i2c_stop(); //Condición de paro return x; //Regresa el valor de temperatura }