Многопозиционная система датчиков температуры для интеграции в умный дом
Компоненты и материалы
| DS18B20 | × | 8 шт. |
| Саморезы | × | 1 комплект |
| Arduino Nano R3 | × | 1 шт. |
| Экспериментальная печатная плата | × | 1 шт. |
| Резистор 4.7 кОм | × | 1 шт. |
| Двухконтактный винтовой клеммник | × | 1 шт. |
| SparkFun RS232 Shifter (SMD) | × | 1 шт. |
| 3D-печатный корпус | × | 1 шт. |
| Провода | × | 1 комплект |
Необходимые инструменты и оборудование
- 3D-принтер (любой)
- Отвёртка
Программное обеспечение и онлайн-сервисы
- Arduino IDE
О проекте
Мне требовалось считывать показания температуры в нескольких точках. Данные должны были передаваться в систему домашней автоматизации (Crestron/AMX). Решение должно было быть недорогим, поэтому был выбран датчик DS18B20 — он широко доступен, недорог и использует шину 1-Wire, что позволяет подключать множество датчиков по двум проводам.
Датчики подключены к Arduino Nano. Последовательный вывод Arduino (TTL) преобразуется в RS232 для совместимости с системой автоматизации.
Для эстетичного вида был спроектирован и напечатан корпус на 3D-принтере Zortrax M200.
Есть вопросы? Обращайтесь!
Программный код
MultiTempSensor v1.0.0 (Arduino)
/* MultiTempSensor code by WT040
Основан на примерах Rik Kretzinger и других фрагментах кода
История:
v0.1.1 27/11/2016
v0.1.5 04/12/2016 pre-release
v1.0.0 04/12/2017 release
*/
// Библиотеки
#include <OneWire.h>
#include <DallasTemperature.h>
// Константы
#define SENSOR_PIN 12
#define READ_TIMER 10000 // 10 секунд
OneWire oneWire(SENSOR_PIN);
DallasTemperature sensors(&oneWire);
// Адреса датчиков (уникальны для каждого)
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("Initializing Temperature Control Library Version ");
Serial.println(DALLASTEMPLIBVERSION);
Serial.print("Searching for ");
Serial.print(amountOfSensors);
Serial.println(" sensors...");
sensors.begin();
// Установка разрешения 10 бит (9-12 бит, меньше — быстрее)
for (int i = 1; i <= 8; i++) {
DeviceAddress* sensor = getSensorByIndex(i);
if (sensor) sensors.setResolution(*sensor, 10);
}
getSensorsOnBus();
Serial.println("System initialized");
}
void loop() {
counterCheckBus++;
delay(READ_TIMER);
Serial.println();
if (counterCheckBus == 360) { // Проверка шины каждый час (360 × 10 сек)
getSensorsOnBus();
counterCheckBus = 0;
}
sensors.requestTemperatures();
for (int i = 1; i <= 8; i++) {
DeviceAddress* sensor = getSensorByIndex(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("Sensor error!");
} 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("\nProgram version: ");
Serial.println(programName);
}
void getSensorsOnBus() {
Serial.print("Number of sensors found on bus: ");
Serial.println(sensors.getDeviceCount());
}
DeviceAddress* getSensorByIndex(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;
}
}
3D-модели корпуса
- Нижняя часть корпуса
- Верхняя часть корпуса
- Крепление разъёма Sub-D 9
Схема подключения
Базовая схема без RS232-модуля:
Производственный процесс
- Датчик температуры DS18B20 — точный цифровой термометр с интерфейсом 1-Wire для промышленности и быта
- Сборка логгера температуры на Raspberry Pi с $5 I2C датчиком
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Создание многодатчиковой системы мониторинга температуры и света с Raspberry Pi и DS18B20
- Создайте домашний монитор температуры на Raspberry Pi с MCP9808, InfluxDB и Grafana
- Умная теплица DasFilisera: система мониторинга роста растений на Arduino MKR1000
- MotionSense: умная система обнаружения проникновения на Arduino и ESP8266
- Пожарная безопасность 3D-принтера: умная система обнаружения дыма
- CoroFence: термический детектор на GridEye + PIR с IoT
- Точный датчик температуры подшипников: обнаружение и мониторинг