Wie viele DS18B20-Temperatursensoren kann ich an einen Bus-Arduino anschließen?

Wie viele Temperatursensoren kann ich an einen Bus anschließen, ohne an Genauigkeit zu verlieren. Kann ich beispielsweise 50 Sensoren an einem Bus verwenden? Sollte ich den Widerstand wechseln, wenn ich zu viele Sensoren anschließe? Hier ist das Handbuch http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

Ich verwende dieses Schema

//  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");
}
Haben Sie darüber nachgedacht, mehrere IO-Pins auf dem Arduino zu verwenden, um die Sensoren in separate Netzwerke aufzuteilen? Sie könnten beispielsweise 5 Pins verwenden und brauchen dann nur 10 Knoten in jedem Netzwerk zu haben. Dies vermeidet einige der elektrischen Probleme und kann auch die Zeit, die zum Abfragen aller Sensoren benötigt wird, erheblich reduzieren, da Sie die mehreren Netzwerke parallel ausführen können.
Ja, das habe ich in den Kommentaren unter der Antwort gesagt

Antworten (1)

Erste Antwort: So viele Sie möchten.

Zweite Antwort: Es gibt Einschränkungen. Wenn beispielsweise die Gesamtlänge des Busses groß wird (z. B. 50 m), leiden Sie unter der Kapazität des Kabels (langsame Übergänge) und Reflexionen (verzerrte Übergänge). Der Port-Pin Ihres (nicht spezifizierten) Arduino ist möglicherweise nicht in der Lage, ein langes Kabel mit ausreichender Geschwindigkeit und Qualität zu treiben. Beachten Sie, dass hier nur ein stärkerer Treiber nicht hilft, da dies zu stärkeren Reflexionen führt. Es gibt dedizierte 1-Wire-Master-Chips mit einer geeigneten Treiberschaltung (z. B. DS2482).

Behalten Sie auch die Speichernutzung in Ihrem Mikrocontroller im Auge. Es scheint, dass Sie die eindeutigen IDs jedes Sensors speichern möchten, was in den kleineren Arduino-Varianten eine erhebliche Menge an Ressourcen verschlingt. Die Gesamtzeit, die zum Auslesen der Temperatur aller Sensoren benötigt wird, scheint kein limitierender Faktor zu sein, dies hängt jedoch von der genauen Implementierung des Protokolls in Ihrer Bibliothek ab.

Zu deiner zweiten Frage: Der Widerstand soll so bleiben wie er ist. Es zieht den Bus hoch, wenn keiner der angeschlossenen Sensoren eine '0' sendet und ist unabhängig von der Anzahl der angeschlossenen Sensoren. Bei langen Kabeln kann es sinnvoll sein, den Wert etwas zu verringern oder mehrere Widerstände entlang des Kabels zu verteilen (zB 3x 15k oder 2x 10k).

Auf jeden Fall sollte man für viele Sensoren (wie abgebildet) eine dedizierte Stromleitung betreiben und sich nicht auf den parasitären Power-Modus verlassen.

Vielen Dank für Ihre Antwort. Ms ist mir egal, ich kümmere mich nur um die richtige Temperatur. Der beste Weg ist also, mehr Busse (weniger Reflexionen) und ein niedrigeres Kabel für geringen Widerstand zu verwenden. Und wenn es keinen Speicher gibt, muss ich den Mikrocontroller aufrüsten. Oder ich habe DS2482 richtig gekauft?
Verbessert Ethernet-Kabel die Leistung? Wird es ein Problem geben, wenn ich 9 Sensoren pro Bus verwende, insgesamt 45 Sensoren?
Wenn mehrere kürzere Busse möglich sind, ist dies vorzuziehen. Ein dickerer / dünnerer Draht hilft nicht bei der Signalqualität - der Gleichstromwiderstand unterscheidet sich vom Verhalten im 100-kHz-1-MHz-Regime. Der DS2482 hilft nur bei der Signalqualität, nicht beim Speicher. Ethernet-Kabel sind in Ordnung, aber im Vergleich zu Standard-3-Draht-Kabeln wird es nicht viel verbessern.
Ich glaube, ich werde Probleme mit dem Gedächtnis haben. Ich muss GSM, viele Sensoren, ein SD-Kartenmodul und ein Echtzeitmodul verwenden.
Es sieht so aus, als ob Sie die Geräteadressen fest codieren, also gehe ich davon aus, dass dies eine statische Installation ist, bei der die Sensoren nicht ein- und ausgewechselt werden. Wenn dies der Fall ist, können Sie viel RAM sparen, indem Sie PROGMEM verwenden, um die Adressen in FLASH zu speichern, was viel weniger eingeschränkt ist. Sie müssen eine sehr kleine Änderung an der Bibliothek vornehmen, damit sie mit Adressen in PROGMEM funktioniert.
Einige großartige Informationen zu großen 1-Draht-Netzwerken .... maximintegrated.com/en/app-notes/index.mvp/id/148