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
// 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");
}
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.
Großer Josch
Jim