Leyendo datos de múltiples sensores de temperatura

Para crear nuestra línea de sensores de temperatura necesitamos poder leer los datos de nuestros DS18B20 a través de un único cable. Cada sensor de temperatura tiene un único número de registro que nos va a permitir identificarlo. Lo primero que necesitamos hacer es catalogar nuestros sensores. Para ello utilizaremos el siguiente script para el autonomo. Antes nos aseguraremos de que podemos leer los datos usando nuestro tutorial de leer datos del sensor de temperatura y tenemos un circuito correctamente configurado con la placa de prototipado.

Luego cargamos en el autonomo el siguiente script

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

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 5

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
int numberOfDevices = 0;
DeviceAddress tmp_address;
 
void setup()
{
 SerialUSB.begin(115200);
 SerialUSB.println("Temperature search");
 SerialUSB.println("waiting 6 seconds before printing");
 delay(6000);
 sensors.begin();


numberOfDevices = sensors.getDeviceCount();
 SerialUSB.print("Found devices:");
 SerialUSB.println(numberOfDevices);
 for(int i=0;i<numberOfDevices; i++)
 {
 sensors.getAddress(tmp_address, i);
 printAddress(tmp_address);
 SerialUSB.println();
 }
}

void loop()
{ 
 for(int i=0;i<numberOfDevices; i++)
 {
 sensors.getAddress(tmp_address, i);
 printAddress(tmp_address);
 SerialUSB.println();
 }
 
}

void printAddress(DeviceAddress deviceAddress)
{
 SerialUSB.print("{ ");
 for (uint8_t i = 0; i < 8; i++)
 {
 // zero pad the address if necessary
 SerialUSB.print("0x");
 SerialUSB.print(deviceAddress[i], HEX);
 if (i<7) SerialUSB.print(", ");
 
 }
 SerialUSB.print(" }");
 delay(2000);
}

y abrimos el Monitor Serie, veremos que nos imprime una secuencia de números “raros”

{ 0x28, 0x18, 0xB5, 0x29, 0x8, 0x0, 0x0, 0xBF }

es el identificador para ese sensor. Guardaremos ese número con en un archivo de texto y le daremos un código más sencillo al sensor (A1, B2…, etc) , escribiéndolo con rotulador indeleble sobre el sensor para así tenerlo identificado.

Repetimos el proceso con todos los sensores que necesitemos.

Esa lista de números nos va a permitir leer por el mismo cable varios sensores. Por ejemplo si añadimos otro sensor de ésta forma:

Podremos leer la temperatura de los dos sensores a la vez por un único cable. Para ello usamos el siguiente script de ejemplo:

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 5
#define TEMPERATURE_PRECISION 12

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress Device1 = { 0x28, 0xFC, 0xB8, 0x28, 0x8, 0x0, 0x0, 0x29 };
DeviceAddress Device2 = { 0x28, 0x18, 0xB5, 0x29, 0x8, 0x0, 0x0, 0xBF };

void setup(void)
{
 // start serial port
 SerialUSB.begin(9600);
 // Start up the library
 sensors.begin();
 sensors.setResolution(Device1, TEMPERATURE_PRECISION);
 sensors.setResolution(Device2, TEMPERATURE_PRECISION);

}

/*
 * Main function, calls the temperatures in a loop.
 */
void loop(void)
{ 
 sensors.requestTemperatures();
 float temp1 = sensors.getTempC(Device1);
 float temp2 = sensors.getTempC(Device2);
 SerialUSB.print("Temp1 = "); SerialUSB.print(temp1); 
 SerialUSB.print(" | Temp2 = "); SerialUSB.println(temp2); 
}

 

Leyendo datos de múltiples sensores de temperatura

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *