Sensor de temperatura

Sensor de temperatura

Los termistores están compuestos por materiales (como por ejemplo el cobre o el níquel) que van modificando su resistencia eléctrica según la temperatura a la que se encuentran.

Estos materiales se clasifican en 2 tipos:

  • NTC (Coeficiente de temperatura negativo): La relación entre la temperatura y la resistencia es inversa, es decir, al aumentar una, la otra disminuye.

  • PTC (Coeficiente de temperatura positivo): La relación entre la temperatura y la resistencia es directa, es decir, al aumentar una, también aumenta la otra.

Sensor TC74:

Para esta entrada vamos a trabajar con el sensor TC74 con encapsulado tipo TO220:

sensor

Con los pines correspondiente a la comunicación I2C:

  • SDA: datos
  • SCL: reloj
  • GND: tierra
  • VDD: alimentación (3,3 V)
  • NC: No conectado En este caso, como vamos a utilizar el sensor, no con el Raspbian de la Raspberry Pi, sino con un sistema Linux embebido personalizado por nosotros, tendremos que habilitar el i2c con Buildroot.

Una vez lo tengamos,vamos a identificar la dirección I2C asignada a nuestro dispositivo, ya conectado a la Raspberry Pi, con el comando:

i2cdetect -y 1

En nuestro caso vemos que la dirección del dispositivo es la 0x4d

Ahora mandamos el comando 0x00 a nuestro sensor, para que haga una lectura.

i2cset 1 0x4d 0x00

Confirmamos con una Y (Yes) la pregunta que se nos formula, sobre si queremos escribir en el fichero /dev/i2c-1, y después escribimos el siguiente comando:

i2cget 1 0x4d

que nos devuelve la temperatura medida por el sensor en grados C. Volvemos a confirmar con Y a la pregunta de si queremos leer del fichero /dev/i2c-1 sobre el que escribe el sensor.

Ahora pasamos a hacer esta misma función de leer la temperatura pero con un programa en C realizado desde Eclipse y compilado de manera cruzada para poder ejecutarlo en la Raspberry Pi.

En el main del programa añadimos un while(1) para que tome medidas periodicamente:

/*PROGRAMA PARA LEER LA TEMPERATURA CON EL SENSOR TC74 CONECTADO A LA RPI
ISMAEL TOBAR Y RAQUEL MUÑOZ*/

#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void get_temp_sensor(void){
  int file;
  char filename[40];
  const char *buffer;
  int addr = 0x4d; 	// The I2C addres of the sensor

  sprintf(filename,"/dev/i2c-1");
  if ((file = open(filename, O_RDWR)) < 0){
    printf("Failed to open the bus.");
    /* ERROR HANDLING; you can check errno to see what went wrong*/
    exit(1);
  }
  if (ioctl(file, I2C_SLAVE, addr) < 0) {
    printf("Failed to acquire bus access and/or talk to slave.\n");
    /* ERROR HANDLING; you can check errno to see what went wrong*/

  }
  char buf[10] = {0};
  int data;
    //Using I2C Read
    if (read(file,buf,1) != 1){
      /*ERROR HANDLING: i2c transaction failed */
      printf("Failed to read from i2c bus.\n");
      printf("\n\n");
    } else {
      data  = (int)(buf[0]);
      printf("Temperatura: %d \n", data);
    }
    buf[0] = 0x00;

  if(write(file,buf,1) != 1){
    /*ERROR HANDLING: i2c transaction failed */
    printf("Failed to write to the i2c bus.\n");

  }
}

void main(){
  while(1){
    get_temp_sensor();
    sleep(1);
  }
}

Datasheet sensor:

http://ww1.microchip.com/downloads/en/DeviceDoc/21462D.pdf