Sistema de Sensor de Temperatura Multiposición para Integración en Hogar Inteligente
Componentes y Suministros
| Componente | Cantidad | Notas |
|---|---|---|
| DS18B20 | 8 | Sensores de temperatura digitales bus 1-Wire |
| Tornillos | 1 | Para fijación de la carcasa |
| Arduino Nano R3 | 1 | Microcontrolador principal |
| PCB experimental | 1 | Placa de prototipo para montaje |
| Resistencia 4.7k Ω | 1 | Pull-up para bus 1-Wire |
| Terminal de tornillo 2 polos | 1 | Conexión de alimentación |
| SparkFun RS232 Shifter SMD | 1 | Conversor TTL a RS232 para domótica |
| Carcasa impresa en 3D | 1 | Diseño personalizado |
| Cable | 1 | Para conexiones internas |
Herramientas y Máquinas Necesarias
- Impresora 3D (genérica)
- Destornillador
Aplicaciones y Servicios Online
- Arduino IDE
Sobre el Proyecto
Necesitaba leer temperaturas en varias posiciones y enviar los datos a un sistema de domótica (Crestron/AMX) de forma económica. La solución elegida utiliza sensores DS18B20, ampliamente disponibles, baratos y basados en bus 1-Wire, lo que permite conectar múltiples sensores con pocos cables.
Los ocho sensores se conectan a un Arduino Nano. La salida serie (TTL) del Arduino se convierte a RS232 mediante el módulo SparkFun para compatibilidad con el sistema de domótica. Para una apariencia profesional, diseñé e imprimí una carcasa en mi impresora 3D Zortrax M200.



¿Preguntas? ¡No dudes en preguntar!
Código
MultiTempSensor v1.0.0 (Arduino)
/* MultiTempSensor código por WT040
Basado en ejemplos de Rik Kretzinger y otros fragmentos
Historial: v0.1.1 27/11/2016, v0.1.5 04/12/2016, v1.0.0 04/12/2017 */
#include <OneWire.h>
#include <DallasTemperature.h>
// Constantes
#define SENSOR_PIN 12
#define READ_TIMER 10000 // 10 segundos
OneWire oneWire(SENSOR_PIN);
DallasTemperature sensors(&oneWire);
// Direcciones de los 8 sensores (deben reemplazarse por las reales)
DeviceAddress Sensor1 = { 0x28, 0xFF, 0x89, 0x0F, 0x61, 0x16, 0x03, 0x40 };
DeviceAddress Sensor2 = { 0x28, 0xFF, 0xE2, 0x0F, 0x61, 0x16, 0x03, 0x21 };
DeviceAddress Sensor3 = { 0x28, 0xFF, 0x38, 0xB3, 0x60, 0x16, 0x03, 0xEA };
DeviceAddress Sensor4 = { 0x28, 0xFF, 0xA4, 0xBE, 0x60, 0x16, 0x03, 0xE1 };
DeviceAddress Sensor5 = { 0x28, 0xFF, 0xFE, 0x13, 0x61, 0x16, 0x03, 0x56 };
DeviceAddress Sensor6 = { 0x28, 0xFF, 0x89, 0xBA, 0x60, 0x16, 0x03, 0xFB };
DeviceAddress Sensor7 = { 0x28, 0xFF, 0xFA, 0xBC, 0x60, 0x16, 0x03, 0xD1 };
DeviceAddress Sensor8 = { 0x28, 0xFF, 0x57, 0xB1, 0x60, 0x16, 0x03, 0x93 };
int amountOfSensors = 8;
int counterCheckBus = 0;
void setup() {
Serial.begin(9600);
printProgramName();
Serial.print("Inicializando librería Dallas Temperature v");
Serial.println(DALLASTEMPLIBVERSION);
Serial.print("Buscando ");
Serial.print(amountOfSensors);
Serial.println(" sensores...");
sensors.begin();
// Resolución 10 bits (9-12 bits, menor = más rápido)
for (int i = 1; i <= 8; i++) {
DeviceAddress* sensor = getSensorAddress(i);
if (sensor) sensors.setResolution(*sensor, 10);
}
getSensorsOnBus();
Serial.println("Sistema inicializado");
}
void loop() {
counterCheckBus++;
delay(READ_TIMER);
Serial.println();
if (counterCheckBus == 360) { // Cada hora aprox (360 * 10s)
getSensorsOnBus();
counterCheckBus = 0;
}
sensors.requestTemperatures();
for (int i = 1; i <= 8; i++) {
DeviceAddress* sensor = getSensorAddress(i);
if (sensor) {
Serial.print("Sensor ");
Serial.print(i);
Serial.print(": ");
printTemperature(*sensor);
Serial.println();
}
}
}
void printTemperature(DeviceAddress deviceAddress) {
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error sensor!");
} else {
Serial.print("C: ");
Serial.print(tempC);
}
}
void printProgramName() {
String path = __FILE__;
int slash = path.lastIndexOf('\\');
String programName = path.substring(slash + 1);
int dot = programName.lastIndexOf('.');
programName = programName.substring(0, dot);
Serial.print("\nVersión del programa: ");
Serial.println(programName);
}
void getSensorsOnBus() {
Serial.print("Sensores encontrados en bus: ");
Serial.println(sensors.getDeviceCount());
}
// Función auxiliar para obtener dirección por índice
DeviceAddress* getSensorAddress(int index) {
switch(index) {
case 1: return &Sensor1;
case 2: return &Sensor2;
case 3: return &Sensor3;
case 4: return &Sensor4;
case 5: return &Sensor5;
case 6: return &Sensor6;
case 7: return &Sensor7;
case 8: return &Sensor8;
default: return nullptr;
}
}
Piezas Personalizadas y Carcasas
- Carcasa impresa en 3D - Base
- Carcasa impresa en 3D - Tapa
- Soporte Sub-D 9 para carcasa impresa en 3D
Esquemáticos
Esquema básico sin módulo RS232:
Proceso de manufactura
- Construya un registrador de temperatura con Raspberry Pi y sensor I2C de 5 $
- Construya un sensor de temperatura remoto con Raspberry Pi y Python – Guía paso a paso
- Construya un Sistema de Monitorización de Temperatura y Luz Multi‑Sensor con Raspberry Pi y DS18B20
- Monitor de temperatura casero con Raspberry Pi, MCP9808, InfluxDB y Grafana
- Invernadero Inteligente DasFilisera: Sistema Avanzado de Monitorización de Cultivos
- MotionSense: Detección inteligente de intrusos con Arduino y ESP8266
- Prevención de Incendios en Impresoras 3D: Sistema de Seguridad con Sensor Inteligente
- Levitación magnética repulsiva con Arduino: Circuito simple y guía DIY
- CoroFence: Detector Térmico Avanzado con Sensor PIR e Integración IoT
- Sensor de temperatura de rodamientos de precisión: detección y monitorización exactas
- Sensor de Temperatura DS18B20 – Termómetro Digital 1-Wire Preciso para Uso Industrial y Consumo