Lectura de un sensor de temperatura de Dallas y registro de datos en una tarjeta µSD
Trabajar con controladores lógicos programables Arduino para automatización industrial
11 marzo, 2020 por
Lectura de un sensor de temperatura de Dallas y registro de datos en una tarjeta µSD
Boot & Work Corp. S.L., Berta Canet

Introducción

En esta publicación, aprenderás cómo conectar el sensor de temperatura de Dallas a cualquiera de nuestros PLCs, leer las temperaturas y almacenarlas en una tarjeta SD. El código de las temperaturas y la tarjeta SD se realizan con el software Arduino y puedes verlo en la sección Software.

Lecturas previas

Te recomendamos que leas las siguientes publicaciones de nuestro blog para comprender el contenido de este:

  • Controlling the temperature with Dallas DS18B20 Sensor: Read >>

  • How to connect an SD Card to industrial Arduino Ethernet PLC controller: Read >> 

Requisitos

Para trabajar con el sensor de temperatura de Dallas y la tarjeta SD, necesitará cualquiera de nuestros controladores industriales para la automatización industrial:

Protocolo One Wire

Una de las principales ventajas del sensor de Dallas (DS18B20) es su bus de comunicación de 1-Wire que le permite comunicarse con el PLC Arduino usando un solo cable de datos. 1-Wire se basa en un complejo sistema de temporización en la señal entre los dispositivos emisores y receptores.

La mayor desventaja del sistema 1-Wire es que requiere un código complejo y al mismo tiempo es una gran carga para que el procesador consulte el estado de los sensores. El tiempo total de adquisición de una medición es de 750ms.

1-Wire permite que los dispositivos conectados al bus obtengan la fuente de alimentación a través de la línea de datos. Para hacer esto posible, tienen un condensador que almacena energía mientras la línea de datos está en ALTO. Este es el "modo parásito". Si no se utiliza este modo, los dispositivos tendrán que ser conectados a un voltaje entre 3.0V y 5.5V.

En cualquiera de los casos, el bus 1-Wire necesita una resistencia pull-up de 4k7Ω entre los cables VDD (línea de alimentación) y DQ (línea de datos) para funcionar correctamente.

Protocolo One Wire

Hardware

  • Configuración de los interruptores: 

La mayoría de las entradas y las salidas están conectadas al Arduino interno, pero en pocos casos, el usuario puede elegir entre una configuración periférica especial o un GPIO cambiando la posición de los Dip Switches.

Cada interruptor puede seleccionar solo una de las dos configuraciones posibles al mismo tiempo. Por ejemplo, en este caso estamos viendo la configuración de un M-Duino 58+ controlado por Ethernet. Si pones el interruptor en la posición derecha (ON), se activará la entrada I0.6, pero si el interruptor está en la posición izquierda (OFF) activaremos el Pin 2, que es un pin digital.

Ten en cuenta que cada interruptor tiene dos configuraciones diferentes: debes seleccionar la opción derecha (ON) o la izquierda (OFF). 

Configuración de los interruptores

Pin 3, Pin 2 & SD habilitados - I0.6, I0.0 & Q2.0 deshabilitados


  • Conexión:

La conexión del sensor al PLC tiene que ser la que se muestra en la sección de Protocolo de un solo cable.

  • Más de un sensor de temperatura Dallas:

Puede haber más de un sensor de Dallas conectado, usando la misma línea de datos (DQ). Su conexión sería como la siguiente imagen.

Sensores adicionales

Resistencia de pull-up resistance: (producto web)

La resistencia 4k7 Ohm que ha estado apareciendo en los ensamblajes de hardware es necesaria para poner la línea de datos (DQ) en ALTA. Esto permite que el sensor trabaje con la librería Arduino One Wire y que funcione sin una fuente de alimentación externa, porque se toma a través de la resistencia de pull-up de 1-Wire a través de la clavija DQ cuando el bus está alto. La señal del bus alto también carga un condensador interno, que suministra energía a los dispositivos cuando el bus está bajo. Este conjunto se conoce como "parásito". La disposición del hardware es la siguiente.

Sensores adicionales


Software

  • Lectura de un sensor de Dallas localizado en la clavija digital 2:

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

const int oneWirePin = 2;

OneWire oneWireBus(oneWirePin); DallasTemperature sensor(&oneWireBus);
void setup() { Serial.begin(9600); sensor.begin();
}

void loop() {
    Serial.println("Reading temperatures: ");    
    sensor.requestTemperatures();    

    Serial.print("Temperature in sensor: ");
    Serial.print(sensor.getTempCByIndex(0));
    Serial.println(" ºC");

    delay(1000);    //waits for 1 second
}


  • Lectura de un sensor de Dallas localizado en la clavija digital 2 y el registro de datos en una tarjeta µSD:

#include <OneWire.h> #include <DallasTemperature.h> #include <SPI.h> #include <SD.h> File myFile; const int oneWirePin = 2; OneWire oneWireBus(oneWirePin); DallasTemperature sensor(&oneWireBus); void setup() { Serial.begin(9600); sensor.begin(); discoverOneWireDevices(); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.print("Initializing SD card..."); if (!SD.begin(53)) { Serial.println("initialization failed!"); while (1); } Serial.println("initialization done."); } void discoverOneWireDevices(void) { byte i; byte present = 0; byte data[12]; byte addr[8]; myFile = SD.open("test.txt", FILE_WRITE); Serial.println("Looking for 1-Wire devices"); myFile.println("Looking for 1-Wire devices"); while(oneWireBus.search(addr)) { Serial.println("1-Wire device found in this direcion"); myFile.println("1-Wire device found in this direcion");
for( i = 0; i < 8; i++) { Serial.print("0x"); if (addr[i] < 16) { Serial.print('0'); } Serial.print(addr[i], HEX); if (i < 7) { Serial.print(", "); } } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("Device error."); myFile.println("Device error.");
return; } } Serial.println("Search completed."); myFile.println("Search completed.");
oneWireBus.reset_search(); myFile.close(); return; } void loop() { myFile = SD.open("test.txt", FILE_WRITE); Serial.println("Reading temperatures: "); myFile.println("Reading temperatures: "); sensor.requestTemperatures(); Serial.print("Temperature in sensor: "); Serial.print(sensor.getTempCByIndex(0)); Serial.println(" ºC"); myFile.print("Temperature in sensor: ");
myFile.print(sensor.getTempCByIndex(0)); myFile.println(" ºC"); myFile.close(); delay(1000); }


  • Encontrar la dirección y leer dos sensores de Dallas, ambos localizados en la clavija digital 2:

#include <OneWire.h>
 
const int oneWirePin = 2;
OneWire oneWireBus(oneWirePin);
 
void setup() {
  Serial.begin(9600);
  discoverOneWireDevices();
}
 
void discoverOneWireDevices() {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  Serial.println("Looking for 1-Wire devices");
  while(oneWireBus.search(addr)) {
    Serial.println("1-Wire device foun in this direction:");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.println("Devicce error");
        return;
    }
  }
  Serial.println("Search completed!");
  oneWireBus.reset_search();
  return;
}
 
void loop() {
  // nothing to do in here
}


  • Lectura de dos sensores de Dallas con su dirección, ambos localizados en el pin digital 2:

#include <OneWire.h> #include <DallasTemperature.h> const int oneWirePin = 2; OneWire oneWireBus(oneWirePin); DallasTemperature sensors(&oneWireBus); DeviceAddress indoorThermometer = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE }; DeviceAddress outdoorThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 }; void setup() { Serial.begin(9600); sensors.begin(); sensors.setResolution(indoorThermometer, 10); sensors.setResolution(outdoorThermometer, 10); } void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); if (tempC == -127.00) { Serial.print("Error getting temperature"); } else { Serial.print(tempC); Serial.println(" ºC"); } } void loop() { Serial.println("Reading temperatures"); sensors.requestTemperatures(); Serial.print("Indoor temperature: "); printTemperature(indoorThermometer); Serial.print("Outdoor temperature: "); printTemperature(outdoorThermometer); Serial.println(); delay(2000); }

¿Tienes dudas sobre la funcionalidad de nuestros equipos, programación o nuevas tecnologías?

Solo tienes que suscribirte a nuestro blog para estar al día de todas las novadades.

 

Lectura de un sensor de temperatura de Dallas y registro de datos en una tarjeta µSD
Boot & Work Corp. S.L., Berta Canet
11 marzo, 2020
Compartir
Archivar

¿Buscas tu controlador lógico programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Comparación PLC industrial>>>

¿Quieres más información?

¡Rellena el formulario!

¡Cuéntame más!