¿Cuántos sensores de temperatura DS18B20 puedo conectar a un bus arduino?

2

¿Cuántos sensores de temperatura puedo conectar a un bus sin perder precisión? ¿Puedo usar, por ejemplo, 50 sensores en un bus? ¿Debo cambiar la resistencia cuando conecto demasiados sensores? Aquí está el manual enlace

//ThisArduinosketchreadsDS18B20"1-Wire" digital
//  temperature sensors.
//  Copyright (c) 2010 Mark McComb, hacktronics LLC
//  License: http://www.opensource.org/licenses/mit-license.php (Go crazy)
//  Tutorial:
//  http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html

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

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 3

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

// Assign the unique addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

DeviceAddress insideThermometer = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
  sensors.setResolution(outsideThermometer, 10);
  sensors.setResolution(dogHouseThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{ 
  delay(2000);
  Serial.print("Getting temperatures...\n\r");
  sensors.requestTemperatures();

  Serial.print("Inside temperature is: ");
  printTemperature(insideThermometer);
  Serial.print("\n\r");
  Serial.print("Outside temperature is: ");
  printTemperature(outsideThermometer);
  Serial.print("\n\r");
  Serial.print("Dog House temperature is: ");
  printTemperature(dogHouseThermometer);
  Serial.print("\n\r\n\r");
}
    
pregunta Jim

1 respuesta

1

Primera respuesta: tantas como quieras.

Segunda respuesta: hay limitaciones. Por ejemplo, si la longitud total del bus aumenta (por ejemplo, 50 m), sufrirá la capacidad del cable (haciendo que las transiciones sean lentas) y los reflejos (distorsiones de las transiciones). Es posible que el pin de puerto de su Arduino (no especificado) no pueda conducir un cable largo con suficiente velocidad y calidad. Tenga en cuenta que solo un controlador más fuerte no ayuda aquí porque causará reflejos más fuertes. Hay chips maestros dedicados de 1 cable con un circuito de conducción adecuado (por ejemplo, DS2482).

También, vigile el uso de la memoria en su microcontrolador. Parece que desea almacenar las ID únicas de cada sensor que consumirán una cantidad sustancial de recursos en las variantes más pequeñas de Arduino. El tiempo total necesario para leer la temperatura de todos los sensores no parece ser un factor limitante, pero esto depende de la implementación exacta del protocolo en su biblioteca.

A tu segunda pregunta: la resistencia debe permanecer como está. Detiene el bus si ninguno de los sensores conectados envía un '0' y no depende de la cantidad de sensores conectados. Para cables largos, es posible que desee reducir el valor ligeramente o distribuir varias resistencias a lo largo del cable (por ejemplo, 3x 15k o 2x 10k).

En cualquier caso, para muchos sensores, debe ejecutar (como se muestra) una línea eléctrica dedicada y no confiar en el modo de energía parásita.

    
respondido por el asdfex

Lea otras preguntas en las etiquetas