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
}
Funcionamiento
