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

¿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 http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

yo uso este esquema

//  This Arduino sketch reads DS18B20 "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");
}
¿Ha considerado usar múltiples pines IO en el Arduino para dividir los sensores en redes separadas? Podría, por ejemplo, usar 5 pines y luego solo necesita tener 10 nodos en cada red. Esto evita algunos de los problemas eléctricos y también puede reducir en gran medida la cantidad de tiempo que lleva sondear todos los sensores, ya que puede hacer varias redes en paralelo.
Sí, dije eso en los comentarios debajo de la respuesta.

Respuestas (1)

Primera respuesta: tantos como quieras.

Segunda respuesta: Hay limitaciones. Por ejemplo, si la longitud total del bus aumenta (por ejemplo, 50 m), sufrirá por la capacidad del cable (haciendo que las transiciones sean lentas) y los reflejos (que distorsionan las transiciones). Es posible que el pin del 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 de 1 cable dedicados con un circuito de conducción adecuado (por ejemplo, DS2482).

Además, vigile el uso de la memoria en su microcontrolador. Parece que desea almacenar las identificaciones únicas de cada sensor, lo que consumirá 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 depende de la implementación exacta del protocolo en su biblioteca.

A su segunda pregunta: la resistencia debe permanecer como está. Activa 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 ligeramente el valor 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 de alimentación dedicada y no confiar en el modo de energía parásita.

Gracias por su respuesta. No me importa más, solo me importa la temperatura correcta. Entonces, la mejor manera es usar más buses (menos reflejos), cable más bajo para baja resistencia. Y si no hay memoria tengo que actualizar el microcontrolador. O he comprado DS2482 ¿verdad?
¿El cable Ethernet mejora el rendimiento? ¿Habrá algún problema si uso 9 sensores por bus, en total 45 sensores?
Si son posibles varios autobuses más cortos, esto es preferible. Un cable más grueso o más delgado no ayuda con la calidad de la señal: la resistencia de CC es diferente del comportamiento en el régimen de 100 kHz a 1 MHz. El DS2482 solo ayuda con la calidad de la señal, no con respecto a la memoria. El cable Ethernet está bien, pero no mejorará mucho en comparación con los cables estándar de 3 hilos.
Creo que tendré problemas con la memoria. Tengo que usar gsm, muchos sensores, módulo de tarjeta SD y módulo de tiempo real.
Parece que está codificando las direcciones del dispositivo, por lo que asumo que se trata de una instalación estática en la que los sensores no se intercambian dentro y fuera. Si es así, puede ahorrar una gran cantidad de RAM utilizando PROGMEM para almacenar las direcciones en FLASH, que está mucho menos restringido. Deberá realizar una edición muy pequeña en la biblioteca para que funcione con direcciones en PROGMEM.
Excelente información sobre grandes redes de 1 cable.... maximintegrated.com/en/app-notes/index.mvp/id/148