본문 바로가기

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

 

 

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

 

 

 

 

 

 

반응형

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