본문 바로가기

ESP32

ESP32 Multiple DS18B20 다중 온도 센서 사용법

반응형

 

 

여러 DS18B20 온도 센서가 있는 ESP32

 

이 가이드는 Arduino IDE를 사용하여 ESP32로 여러 DS18B20 온도 센서에서 온도를 읽는 방법을 보여줍니다. 동일한 데이터 버스에 있는 센서를 ESP32에 연결하는 방법, 필요한 라이브러리를 설치하는 방법, 그리고 자신의 프로젝트에서 사용할 수 있는 스케치 예제를 보여드리겠습니다. 이 튜토리얼은 ESP8266 및 Arduino 보드와도 호환됩니다.

 

 

여러 센서의 판독값을 표시하는 웹 서버를 구축하려면 다음 튜토리얼을 따르세요. ESP32 차트의 센서 판독값 플롯(여러 DS18B20 센서)

 

다른 DS18B20 가이드도 읽어보세요.

 

 

DS18B20 온도 센서 소개

 

DS18B20 온도 센서는 1-와이어 디지털 온도 센서입니다. 각 센서에는 고유한 64비트 일련 번호가 있어 동일한 데이터 버스에서 여러 센서를 사용할 수 있습니다(즉, 동일한 GPIO에 연결된 여러 센서). 이는 특히 데이터 로깅 및 온도 제어 프로젝트에 유용합니다. DS18B20은 저렴하고 정확하며 사용하기 매우 쉬운 훌륭한 센서입니다.

 

다음 그림은 DS18B20 온도를 보여줍니다.

 

 

 

참고: DS18B20 온도 센서의 방수 버전도 있습니다.

 

DS18B20 온도 센서의 주요 사양은 다음과 같습니다.

 

  • 1-wire 버스 통신
  • 작동 범위 온도: -55ºC ~ 125ºC
  • 정확도 +/-0.5ºC(범위 -10ºC ~ 85ºC)

왼쪽에서 오른쪽으로: 첫 번째 핀은 GND, 두 번째 핀은 데이터, 가장 오른쪽 핀은 VCC입니다.

 

DS18B20 온도 센서는 어디에서 구매할 수 있나요?

 

여러 개의 DS18B20 센서 배선

 

다음은 이 예제를 따라하는 데 필요한 부품 목록입니다.

 

 

  • ESP32 DOIT DEVKIT V1 보드 - ESP32 개발 보드 리뷰 및 비교 읽기
  • DS18B20 온도 센서(이 예제에서는 3개의 센서 사용)
  • 4.7kΩ 저항
  • 점퍼 와이어
  • 브레드보드

DS18B20 온도 센서를 배선할 때 VCC와 데이터 라인 사이에 4.7kΩ 저항을 추가해야 합니다. 다음 회로도는 3개의 센서에 대한 예를 보여줍니다(필요한 경우 센서를 더 추가할 수 있음).

 

 

 

이전 회로도에서 센서의 둥근 면이 뒤로 향하고 있습니다. 평평한 부분은 앞을 향하고 있습니다.

 

Arduino IDE 준비

 

Arduino IDE용 애드온이 있는데, 이를 사용하면 Arduino IDE와 해당 프로그래밍 언어를 사용하여 ESP32를 프로그래밍할 수 있습니다. 아직 준비하지 않았다면 다음 튜토리얼 중 하나를 따라 Arduino IDE를 ESP32와 함께 작동하도록 준비하세요.

 

Windows 지침 - Arduino IDE의 ESP32 보드

Mac 및 Linux 지침 - Arduino IDE의 ESP32 보드

 

라이브러리 설치

 

코드를 업로드하기 전에 Arduino IDE에 두 개의 라이브러리를 설치해야 합니다. Paul Stoffregen의 OneWire 라이브러리와 Dallas Temperature 라이브러리입니다. 다음 단계에 따라 해당 라이브러리를 설치하세요.

 

OneWire 라이브러리

 

  1. 여기를 클릭하여 OneWire 라이브러리를 다운로드하세요. 다운로드에 .zip 폴더가 있어야 합니다.
  2. .zip 폴더의 압축을 풀면 OneWire-master 폴더가 있어야 합니다.
  3. 폴더 이름을 OneWire-master에서 OneWire로 변경합니다.
  4. OneWire 폴더를 Arduino IDE 설치 라이브러리 폴더로 옮깁니다.
  5. 마지막으로 Arduino IDE를 다시 엽니다.

Dallas Temperature 라이브러리

 

  1. 여기를 클릭하여 DallasTemperature 라이브러리를 다운로드합니다. 다운로드에 .zip 폴더가 있어야 합니다.
  2. .zip 폴더의 압축을 풀면 Arduino-Temperature-Control-Library-master 폴더가 있어야 합니다.
  3. 폴더 이름을 Arduino-Temperature-Control-Library-master에서 DallasTemperature로 변경합니다.
  4. DallasTemperature폴더를 Arduino IDE 설치 라이브러리 폴더로 옮깁니다.
  5. 마지막으로 Arduino IDE를 다시 엽니다.

DS18B20 센서 주소 가져오기

 

각 DS18B20 온도 센서에는 일련 번호가 할당되어 있습니다. 먼저 해당 번호를 찾아서 각 센서에 그에 맞는 레이블을 지정해야 합니다. 이렇게 하면 나중에 어느 센서에서 온도를 읽는지 알 수 있습니다.

 

다음 코드를 ESP32에 업로드합니다. 올바른 보드와 COM 포트를 선택했는지 확인하세요.

 

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

#include <OneWire.h>

// Based on the OneWire library example

OneWire ds(4);  //data wire connected to GPIO 4

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);
  }
}

 

 

한 번에 하나의 센서만 연결하여 주소를 찾거나(또는 새로운 센서를 연속적으로 추가) 각 센서를 주소로 식별할 수 있습니다. 그런 다음 각 센서에 물리적 레이블을 추가할 수 있습니다. 9600의 전송 속도로 직렬 모니터를 열면 다음과 같은 결과가 나와야 합니다(하지만 주소는 다름):

 

 

"자동 스크롤" 옵션의 선택을 해제하여 주소를 복사할 수 있도록 합니다. 우리의 경우 다음 주소가 있습니다.

 

센서 1: 28 FF 77 62 40 17 4 31

센서 2: 28 FF B4 6 33 17 3 4B

센서 3: 28 FF A0 11 33 17 3 96

 

여러 센서에서 온도 가져오기

 

동일한 공통 데이터 버스에서 여러 센서의 온도를 가져오는 것은 매우 간단합니다.

 

 

아래 예제 코드는 각 센서에서 섭씨와 화씨로 온도를 읽고 결과를 직렬 모니터에 인쇄합니다.

 

 

/*
 * 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);

DeviceAddress sensor1 = { 0x28, 0xFF, 0x77, 0x62, 0x40, 0x17, 0x4, 0x31 };
DeviceAddress sensor2 = { 0x28, 0xFF, 0xB4, 0x6, 0x33, 0x17, 0x3, 0x4B };
DeviceAddress sensor3= { 0x28, 0xFF, 0xA0, 0x11, 0x33, 0x17, 0x3, 0x96 };

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)); 
  
  delay(2000);
}

 

 

직렬 모니터를 115200의 전송 속도로 열면 비슷한 화면이 표시됩니다.

 

 

 

코드 작동 방식 

 

먼저 필요한 라이브러리를 포함하세요:

 

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

 

온도 센서에 필요한 인스턴스를 생성합니다. 온도 센서는 GPIO 15에 연결됩니다.
 
// Data wire is connected to ESP32 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);

 

DS18B20 센서용 Dallas 온도 라이브러리를 시작합니다.

 

sensors.begin();

그런 다음 각 온도 센서에 대해 이전에 찾은 주소를 입력합니다. 저의 경우 다음과 같습니다:
 
DeviceAddress sensor1 = { 0x28, 0xFF, 0x77, 0x62, 0x40, 0x17, 0x4, 0x31 };
DeviceAddress sensor2 = { 0x28, 0xFF, 0xB4, 0x6, 0x33, 0x17, 0x3, 0x4B };
DeviceAddress sensor3= { 0x28, 0xFF, 0xA0, 0x11, 0x33, 0x17, 0x3, 0x96 };
 
setup()에서 직렬 통신을 초기화하고 DS18B20 센서용 Dallas 온도 라이브러리를 시작합니다.
 
void setup(void){
  Serial.begin(115200);
  sensors.begin();
}
 
loop() 함수에서 섭씨와 화씨 온도를 모두 요청하고 결과를 직렬 모니터에 인쇄합니다. 먼저 다음 코드 줄을 사용하여 온도를 요청해야 합니다:

 

sensors.requestTemperatures(); // 온도를 가져오는 명령을 보냅니다.

 

그런 다음 센서 주소를 사용하여 온도를 요청할 수 있습니다.

 

  • sensors.getTempC(SENSOR_ADDRESS) – 섭씨로 온도를 요청합니다.
  • sensors.getTempF(SENSOR_ADDRESS) – 화씨로 온도를 요청합니다.

 

예를 들어 센서 1의 섭씨 온도를 요청하려면 다음을 사용합니다.

 

sensors.getTempC(sensor1)

 

여기서 sensor1은 첫 번째 센서의 주소를 보관하는 변수입니다.

 

이것은 ESP32를 사용하여 여러 DS18B20 센서에서 온도를 가져오는 방법을 보여주는 간단한 스케치 예입니다. 이 코드는 ESP8266 및 Arduino 보드와도 호환됩니다.

 

더 나아가기

 

여러 DS18B20 온도 센서에서 온도를 얻는 것은 모니터링 및 온도 제어 프로젝트와 데이터 로깅에 특히 유용합니다. 수집된 데이터를 microSD 카드에 로깅하는 방법을 알아보세요.

 

ESP32 MicroSD 카드에 온도 데이터 로깅

 

MQTT를 통해 Node-RED에 판독값을 게시하고 차트에 데이터를 표시할 수도 있습니다. 아래 링크에서 해당 주제에 대한 튜토리얼을 볼 수 있습니다.

 

ESP32 MQTT – Arduino IDE로 게시 및 구독

 

이 튜토리얼이 도움이 되었기를 바랍니다. ESP32를 좋아하고 더 자세히 알고 싶다면 Arduino IDE로 ESP32 배우기 과정에 등록하는 것이 좋습니다.

 

읽어주셔서 감사합니다. 배움을 멈추지 마세요.

 

반응형

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