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
Para trabajar con el sensor de temperatura de Dallas y la tarjeta SD, necesitará cualquiera de nuestros controladores industriales para la automatización industrial:
Controladores de Industrial Shields: Familia de controladores Wifi & Bluetooth, Familia de controladores Ethernet, Familia de controladores GPRS / GSM o 20IOs Controlador Familia Arduino
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.
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).
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.
Resistencia de pull-up resistance: (producto web)
La Resistencia de 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 One Wire Arduino 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.
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); }