본문 바로가기

아두이노우노 R4

DS18B20 온도센서 식별 번호 관리 방법

반응형

 

채널 방에서 DS18B20 다중 온도 센서 처리를 질문하신 분이 해결책을 찾은 모양이다. 방법을 올려주었는데 유용한 방법 같아서 참고한다. 혹시 DS18B20 온도 센서에 대해 처음이신 분은 아래 링크를 참고하세요.

 

아두이노 DS18B20 방수형 온도 측정센서 (프로브타입) 

ESP32 DS18B20 온도 센서(단일, 다중, 웹 서버) 

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() {}

 

 

 

 

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩