채널 방에서 DS18B20 다중 온도 센서 처리를 질문하신 분이 해결책을 찾은 모양이다. 방법을 올려주었는데 유용한 방법 같아서 참고한다. 혹시 DS18B20 온도 센서에 대해 처음이신 분은 아래 링크를 참고하세요.
아두이노 DS18B20 방수형 온도 측정센서 (프로브타입)
ESP32 DS18B20 온도 센서(단일, 다중, 웹 서버)
ESP32 Multiple DS18B20 다중 온도 센서 사용법
dallasTemperature 라이브러리 예제 중 Setuserdata

몇 가지 예제의 사용법을 알고 오늘 작정하고 각종 ai에게 물어봐서 제가 원하던 코딩이 되었습니다.
결과

목적
라이브러리에 의해서 인덱스 정렬된 온도센서들에게 식별 번호를 부여하고 관리하는 겁니다.
기존에 있던 식별 번호 입력하고 다른 점
기존 식별 번호 입력 코드는 몇 개의 센서를 꼽든 한 번에 같은 식별 번호로 eeprom에 저장됩니다. 같은 식별 번호를 한꺼번에 입력하기 좋은 코드죠.
저는 한 개의 센서당 한 개의 식별 번호를 부여하는 코드입니다.
식별 번호를 부여하고 응용하는 곳은
1번 자리
2번 자리
3번 자리
4번 자리의 온도센서들이 고장 났을 때 식별 번호와 자리 번호가 맞는 센서를 연결했을 때 센서 나열 순서가 흐트러지지 않게 됩니다.
#include <OneWire.h>
#include <DallasTemperature.h>
const int ONE_WIRE_BUS = 2;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer;
int deviceCount = 0;
// ROM 주소 출력 함수 (수정 없음)
void printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++)
{
// zero pad the address if necessary
if (deviceAddress[i] < 16)
Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}
// 센서 수량 세기 (수정됨)
void countDevices() {
Serial.print("센서들 찾는중...");
sensors.begin();
deviceCount = sensors.getDeviceCount(); // deviceCount 초기화
Serial.print("찾았습니다. ");
Serial.print(deviceCount, DEC);
Serial.println(" 온도센서");
}
// EEPROM 저장된 ID 출력 (수정됨)
void printID() {
Serial.println("ID of DS18B20");
if (deviceCount == 0) {
Serial.println("아무런 장치를 찾지 못 했습니다.");
return;
}
Serial.println("인덱스 \tROM 주소 \t\t\tID");
for (int index = 0; index < deviceCount; index++) {
DeviceAddress t;
sensors.getAddress(t, index);
Serial.print(index);
Serial.print("\t\t");
printAddress(t);
Serial.print("\t\t");
Serial.println(sensors.getUserData(t));
}
}
// 센서 ID 입력 받기 (전면 수정됨 - 각 센서별 ID 입력)
void inputID() {
Serial.println();
for (int index = 0; index < deviceCount; index++) {
DeviceAddress t;
sensors.getAddress(t, index);
Serial.print("온도센서의 식별번호를 입력해주세요 => ");
printAddress(t);
Serial.print(": ");
int c = 0;
int id = 0;
while (c != '\n' && c != '\r') {
c = Serial.read();
if (isdigit(c)) { // 숫자만 입력 받도록 수정
id *= 10;
id += (c - '0');
}
}
sensors.setUserData(t, id); // 입력 받은 ID 바로 저장
Serial.print("ID ");
Serial.print(id);
Serial.println(" 저장 완료.");
}
}
// 결과 확인 (수정됨 - printID 함수 재사용)
void printResult() {
Serial.println();
Serial.println("결과 출력중 ...");
printID();
Serial.println("결과 출력 끝 ...");
}
void setup() {
Serial.begin(9600);
countDevices();
printID();
if (deviceCount > 0) { // 센서가 있을 경우에만 ID 입력 받음
inputID();
printResult();
}
}
void loop() {}


'아두이노우노 R4' 카테고리의 다른 글
| Arduino Uno R4 WiFi 볼 것 (0) | 2025.01.08 |
|---|---|
| Arduino UNO R4 WiFi VRTC & OFF Pins (0) | 2025.01.08 |
| 아두이노를 이용한 원격 제어 조명 제어 Dimming Light (1) | 2024.12.17 |
| 우노 R4로 키보드로 업무를 자동화 버튼 (1) | 2024.12.15 |
| Adafruit CH552 QT Py (2) | 2024.12.08 |
| Adafruit CH552 QT Py 아두이노 환경 설정 (1) | 2024.12.08 |
| 키보드 자동화 샘플 코드 2 (2) | 2024.12.04 |
| DF Player Mini를 사용한 Arduino와 함께 오디오 플레이어 프로젝트 (0) | 2024.11.20 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩