Programar el sensor

Para utilizar el sensor DS18B20 hay que incluir dos bibliotecas: OneWire, para la comunicación entre el sensor y Arduino, y DallasTemperature, que se encarga de realizar los cálculos en el sensor. Descarga las bibliotecas y añádelas al IDE de Arduino. Si no recuerdas cómo hacerlo, consulta la sección “Añadir una biblioteca al IDE de Arduino”.

El siguiente programa toma datos de la temperatura cada cierto tiempo, y presenta en el monitor serie el instante y la temperatura correspondiente. De esta manera se pueden copiar los datos en una hoja de cálculo para, por ejemplo, representar la gráfica temperatura-tiempo del fenómeno que se está estudiando.

#include <OneWire.h>
#include <DallasTemperature.h>

const int ONE_WIRE_BUS = 2;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);

int tiempo = 1;
int contador = 0;

void setup()
{
  Serial.begin(9600);

  Serial.print("t (s)\t");
  Serial.println("T (grados C)");
  Serial.println("===================");

  sensor.begin();
}

void loop()
{
  sensor.requestTemperatures();
  float temperatura = sensor.getTempCByIndex(0);

  Serial.print(contador);
  Serial.print("\t");
  Serial.println(temperatura, 1);

  delay(tiempo * 1000);
  contador += tiempo;
}

Analicemos una a una las instrucciones de este programa:

#include <OneWire.h>
#include <DallasTemperature.h>

Con estas dos instrucciones se incluyen en el programa las bibliotecas OneWire (para la comunicación entre el sensor y Arduino) y DallasTemperature (para leer el sensor). Recuerda que las instrucciones para incluir bibliotecas empiezan con el símbolo # no terminan con punto y coma.

const int ONE_WIRE_BUS = 2;

Creamos una constante, a la que llamamos ONE_WIRE_BUS, para referirnos al bus de datos (es decir, al canal de transmisión de información entre el sensor y Arduino) y le asignamos como valor el pin digital de Arduino al que hemos conectado el sensor. En nuestro caso tenemos el sensor conectado en el pin digital 2; si estás usando otro, cambia este valor.

OneWire oneWire(ONE_WIRE_BUS);

Como comentamos en la descripción del sensor, este dispositivo utiliza el protocolo de comunicación 1-Wire. Para establecer la conexión entre el sensor y Arduino creamos un objeto de la clase OneWire, al que hemos llamado oneWire, indicando cuál es el pin de Arduino que utilizaremos para el intercambio de datos (el pin ONE_WIRE_BUS en nuestro caso).

DallasTemperature sensor(&oneWire);

Igual que hicimos con el sensor de humedad DHT22, para trabajar con el DS18B20 también debemos crear una instancia del sensor. Eso es lo que hace esta instrucción: crea un objeto de la clase clase DallasTemperature, llamado sensor (si quieres puedes ponerle otro nombre), de manera que utilizaremos este nombre cada vez que nos refiramos al sensor en el programa. En esta instrucción estamos además vinculando el sensor al bus de datos del objeto oneWire definido en la instrucción anterior.

int tiempo = 1;

El programa tomará datos de la temperatura cada cierto tiempo. El intervalo entre medidas, es segundos, lo fijamos con esta instrucción asignándoselo a la variable tiempo. En este caso, el tiempo entre medidas será de 1 segundo.

Ten en cuenta que este es solo un valor aproximado; en la práctica el tiempo entre medidas va a ser algo mayor que el establecido aquí. Si necesitas una medida rigurosa del tiempo existe una función ―la función millis()― que te permite calcularlo con exactitud, pero en este ejemplo hemos preferido supeditar la precisión en el tiempo a la simplicidad en el código.

int contador = 0;

Para llevar cuenta del tiempo que pasa utilizaremos un contador. Para ello creamos una variable llamada contador que inicializamos a cero. Esta variable representará el tiempo aproximado que ha pasado desde que se inició el programa.

void setup()
{
Serial.begin(9600);

Empieza la función setup(). Como habitualmente, presentaremos los datos en el monitor serie, por lo que inicializamos la comunicación entre Arduino y el monitor serie a una velocidad de 9600 bits de datos por segundo.

Serial.print("t (s)\t");
Serial.println("T (grados C)");
Serial.println("===================");

Estas tres instrucciones imprimen en el monitor serie la cabecera de la tabla de datos en la que presentaremos los valores del tiempo y la temperatura.

sensor.begin();
}

La última instrucción de setup() abre el bus de comunicación del sensor. Recuerda que sensor es el nombre que le dimos al DS18B20 cuando creamos la instancia del objeto; si le has puesto otro nombre, debes cambiarlo en esta instrucción.

void loop()
{
sensor.requestTemperatures();

Antes de medir la temperatura, el método requestTemperatures() hace la solicitud de una nueva medida a todos los sensores que estén conectados al bus de datos (en nuestro caso solo hay uno, pero podíamos tener más sensores conectados a la misma línea). De nuevo, si le has puesto un nombre diferente a tu sensor no te olvides de actualizarlo aquí también.

float temperatura = sensor.getTempCByIndex(0);

En esta instrucción, por un lado, creamos una variable de tipo float para almacenar la temperatura. Por otro lado, sensor.getTempCByIndex(0) lee la temperatura, en grados centígrados, del sensor y almacena este valor en la variable temperatura.

Si tuviésemos más sensores conectados en el mismo pin, cada uno de ellos tendría un número de índice diferente (0 el primero, 1 el segundo, 2 el tercero, y así sucesivamente). Así, para leer las distintas temperaturas escribiríamos sensor.getTempCByIndex(0) para el primer sensor, sensor.getTempCByIndex(1) para el segundo, sensor.getTempCByIndex(2) para el tercero, etc.

Serial.print(contador);
Serial.print("\t");
Serial.println(temperatura, 1);

La variable contador lleva cuenta aproximada del tiempo que ha pasado desde que empezó el programa. Mostramos su valor en el monitor serie, seguido de un tabulador. Inmediatamente a continuación del tiempo mostramos el valor de la variable temperatura con una cifra decimal, añadiendo un retorno de carro. En conclusión, estas tres instrucciones muestran, en una línea, el tiempo y la temperatura en ese instante.

delay(tiempo * 1000);

La variable tiempo que creamos al principio del programa representa el intervalo entre medidas en segundos, es decir, indica el tiempo que hay que esperar para tomar una nueva medida. Como el argumento de la función delay() viene expresado en milisegundos, debemos multiplicar el valor de tiempo por 1000.

contador += tiempo;
}

Para finalizar, incrementamos el contador del tiempo. Esta instrucción es una manera abreviada de escribir contador = contador + tiempo. Lo que estamos haciendo es que, cada vez que se tome una nueva medida, este contador se incremente en tiempo segundos. Así cada vez que medimos la temperatura la variable contador nos indica, de una manera aproximada, los segundos que han pasado desde que comenzó el programa.

Last updated