본문 바로가기

아두이노우노 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() {}

 

 

 

 

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^