본문 바로가기

ESP32

ds18b20 온도 센서 여러 개 스캔 주소 얻기

반응형

 

팰티어 소자를 사용해 뜨거운 방열판 온도, 냉각 방열판 온도와 실내 두 곳의 온도까지 전부 네 군데 온도를 측정하려고 DS18B20 방수 온도 센서를 달았다.

 

회로도는 아래와 같다. 센서 데이터 라인에 풀업을 달아주고 모두 한 라인으로 온도 데이터를 읽을 수 있다.

 

연결 회로도

 

 

 

회로를 CAD로 작업하면 아래 이미지

 

 

 

 

우선 DS18B20 온도 센서와 인터페이스 하려면 Paul Stoffregen의 One Wire 라이브러리와 Dallas Temperature 라이브러리를 설치해야 합니다. 다음 단계에 따라 라이브러리를 설치하세요. 

 

1. Arduino IDE를 열고 Sketch > Include Library > Manage Libraries로 이동합니다. Library Manager가 열립니다.

 

2. 검색 상자에 "onewire"를 입력하고 Paul Stoffregen의 OneWire 라이브러리를 설치합니다. 

 

3. 그런 다음 "Dallas"를 검색하고 Miles Burton의 DallasTemperature 라이브러리를 설치합니다. 의존성 메시지 창이 나타나면 모두 설치해 주시면 됩니다.  

 

4. 라이브러리를 설치한 후 Arduino IDE를 다시 시작합니다. 제 경우에는 다시 시작하지 않아도 잘 동작합니다.

 

세서가 한 개라서 무조건 데이터를 읽는다면 아래 코드를 아두이노에 업로드 한 후 테스트 하면 잘 나온다.

 

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com  
*********/

#include <OneWire.h>
#include <DallasTemperature.h>

// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;     

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

void setup() {
  // Start the Serial Monitor
  Serial.begin(115200);
  // Start the DS18B20 sensor
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures(); 
  float temperatureC = sensors.getTempCByIndex(0);
  float temperatureF = sensors.getTempFByIndex(0);
  Serial.print(temperatureC);
  Serial.println("ºC");
  Serial.print(temperatureF);
  Serial.println("ºF");
  delay(5000);
}

 

결과는 아래와 같다.

 

 

 

DS18B20 센서를 여러 개 사용할 경우 각 주소를 알아서 서로 구별할 수 있어야 정확한 위치를 선정하고 구분할 수 있으므로 아래 코드를 사용하여 각 센서의 고유 주소를 확인한다. 

 

아래 코드가 센서 주소를 스캔하는 코드다.  

 

/*
 * Rui Santos 
 * Complete Project Details https://randomnerdtutorials.com
 */

#include <OneWire.h>

#define ONE_WIRE_BUS 15

// Based on the OneWire library example

OneWire ds(ONE_WIRE_BUS);  //data wire connected to GPIO 15

void setup(void) {
  Serial.begin(115200);
}

void loop(void) {
  byte i;
  byte addr[8];
  
  if (!ds.search(addr)) {
    Serial.println(" No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  Serial.print(" ROM =");
  for (i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
}

 

 

저의 경우 주소는 아래와 같이 교대로 연결하여 주소를 찾았습니다.

 

 

센서 두 개일 때

 

 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 

 

센서 4개를 연결하면 아래와 같은 오토 스크롤을 정지 시키고 주소를 카피합니다.

 

ROM = 28 61 64 34 8C 25 15 E7 ROM = 28 61 64 34 CD A0 7F B6 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8C 25 15 E7 ROM = 28 61 64 34 CD A0 7F B6 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8C 25 15 E7 ROM = 28 61 64 34 CD A0 7F B6 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8C 25 15 E7 ROM = 28 61 64 34 CD A0 7F B6 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8C 25 15 E7 ROM = 28 61 64 34 CD A0 7F B6 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8C 25 15 E7 ROM = 28 61 64 34 CD A0 7F B6 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8C 25 15 E7 ROM = 28 61 64 34 CD A0 7F B6 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 ROM = 28 61 64 34 8C 25 15 E7 ROM = 28 61 64 34 CD A0 7F B6 ROM = 28 61 64 34 8F 7C E2 31 ROM = 28 61 64 34 8F 4F 81 CE No more addresses.

 

 

아래는 네 개 센서를 읽는 코드

 

/*
 * Rui Santos 
 * Complete Project Details https://randomnerdtutorials.com
 */

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is connected to GPIO15
#define ONE_WIRE_BUS 15
// Setup a oneWire instance to communicate with a OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

//ROM = 28 61 64 34 8F 7C E2 31 No more addresses. Number 1

DeviceAddress sensor1 = { 0x28, 0x61, 0x64, 0x34, 0x8F, 0x7C, 0xE2, 0x31 };
DeviceAddress sensor2 = { 0x28, 0x61, 0x64, 0x34, 0x8F, 0x4F, 0x81, 0xCE };
DeviceAddress sensor3= { 0x28, 0x61, 0x64, 0x34, 0xCD, 0xA0, 0x7F, 0xB6 };
DeviceAddress sensor4= { 0x28, 0x61, 0x64, 0x34, 0x8C, 0x25, 0x15, 0xE7 };

void setup(void){
  Serial.begin(115200);
  sensors.begin();
}

void loop(void){ 
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  Serial.print("Sensor 1(*C): ");
  Serial.print(sensors.getTempC(sensor1)); 
  Serial.print(" Sensor 1(*F): ");
  Serial.println(sensors.getTempF(sensor1)); 
 
  Serial.print("Sensor 2(*C): ");
  Serial.print(sensors.getTempC(sensor2)); 
  Serial.print(" Sensor 2(*F): ");
  Serial.println(sensors.getTempF(sensor2)); 
  
  Serial.print("Sensor 3(*C): ");
  Serial.print(sensors.getTempC(sensor3)); 
  Serial.print(" Sensor 3(*F): ");
  Serial.println(sensors.getTempF(sensor3));

  Serial.print("Sensor 4(*C): ");
  Serial.print(sensors.getTempC(sensor4)); 
  Serial.print(" Sensor 4(*F): ");
  Serial.println(sensors.getTempF(sensor4));
  
  delay(5000);
}

 

 

결과는 

 

Requesting temperatures...DONE
Sensor 1(*C): -127.00 Sensor 1(*F): -196.60
Sensor 2(*C): -127.00 Sensor 2(*F): -196.60
Sensor 3(*C): -127.00 Sensor 3(*F): -196.60
Sensor 4(*C): -127.00 Sensor 4(*F): -196.60
Requesting temperatures...DONE
Sensor 1(*C): -127.00 Sensor 1(*F): -196.60
Sensor 2(*C): -127.00 Sensor 2(*F): -196.60
Sensor 3(*C): -127.00 Sensor 3(*F): -196.60
Sensor 4(*C): -127.00 Sensor 4(*F): -196.60
Requesting temperatures...DONE
Sensor 1(*C): -127.00 Sensor 1(*F): -196.60
Sensor 2(*C): -127.00 Sensor 2(*F): -196.60
Sensor 3(*C): -127.00 Sensor 3(*F): -196.60
Sensor 4(*C): -127.00 Sensor 4(*F): -196.60
Requesting temperatures...DONE
Sensor 1(*C): -127.00 Sensor 1(*F): -196.60
Sensor 2(*C): -127.00 Sensor 2(*F): -196.60
Sensor 3(*C): -127.00 Sensor 3(*F): -196.60
Sensor 4(*C): -127.00 Sensor 4(*F): -196.60

 

 

그럼 즐개발 하세요. 배움을 멈추지 마시고, 어떤 상황에서도 포기하지 마세요.

 

 

 

 

 

 

반응형

캐어랩 고객 지원

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

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

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

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

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

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

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

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

카카오 채널 추가하기

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

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

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

캐어랩