스마트 홈 연동을 위한 다중 위치 온도 센서 시스템
부품 및 소모품
| DS18B20 온도 센서 |
× |
8개 |
| 나사 |
× |
1세트 |
| Arduino Nano R3 |
× |
1개 |
| 실험용 PCB |
× |
1개 |
| 4.7kΩ 저항 |
× |
1개 |
| 2포트 스크류 터미널 |
× |
1개 |
| SparkFun RS232 시프터 (SMD) |
× |
1개 |
| 3D 프린트 케이스 |
× |
1개 |
| 전선 |
× |
1세트 |
필요한 도구 및 장비
앱 및 온라인 서비스
프로젝트 소개
여러 위치에서 온도를 측정하여 도모티카 시스템(Crestron/AMX)으로 데이터를 전송해야 했습니다. 비용 효율적인 솔루션이 필요했기 때문에 널리 구할 수 있고 저렴하며 버스 시스템인 DS18B20 센서를 선택했습니다.
센서들은 Arduino Nano에 연결되며, Arduino의 시리얼 출력(TTL)은 RS232로 변환되어 도모티카 시스템과 호환되도록 했습니다.
깔끔한 마감을 위해 Zortrax M200 3D 프린터로 케이스를 설계하여 출력했습니다.
질문이 있으시면 언제든 문의해 주세요!
소스 코드
MultiTempSensor v1.0.0 (Arduino)
/* MultiTempSensor code by WT040
센서 코드는 Rik Kretzinger의 예제와 기타 코드 조각을 기반으로 함
히스토리:
v0.1.1 2016/11/27
v0.1.5 2016/12/04 프리릴리즈 버전
v1.0.0 2017/12/04 릴리즈 버전
*/
// 라이브러리 포함
#include <OneWire.h>
#include <DallasTemperature.h>
// 상수 정의
#define SENSOR_PIN 12
#define READ_TIMER 10000 // 10초
OneWire oneWire(SENSOR_PIN);
DallasTemperature sensors(&oneWire);
// 센서 주소 (각 DS18B20의 고유 64비트 ROM 코드)
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 = getSensorAddress(i);
if (sensor) sensors.setResolution(*sensor, 10);
}
getSensorsOnBus();
Serial.println("System initialized");
}
void loop() {
counterCheckBus++;
delay(READ_TIMER);
Serial.println();
// 1시간마다(360회 × 10초) 버스 상의 센서 재검색
if (counterCheckBus == 360) {
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("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* getSensorAddress(int num) {
switch(num) {
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 프린트 케이스 - 하단
- 3D 프린트 케이스 - 상단
- 3D 프린트 케이스 - Sub-D 9 마운트
회로도
기본 회로도 (RS232 모듈 제외)