¿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
// 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");
}
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.
gran josh
Jim