반응형

I2C센서에 비해 상대적으로 저렴하고 가격대비 온도도 잘 측정되는 1-wire 온도 센서 DS18B20를 아두이노에 연결해봤습니다.

DS18B20은 -55°C에서 +125°C까지 온도 측정이 가능하며  -10°C에서  +85°C 사이 측정시 ±0.5°C 정확도를 가진다고 합니다.

자세한 사양은 아래 링크에 있는 데이터시트를 참고하세요.

http://elcodis.com/parts/5415153/DS18B20.html#datasheet 

 

 

최초 작성 - 2015. 1. 21

마지막 업데이트 - 2019. 1. 23



하드웨어 연결

 

원래는 오른쪽 회로도처럼 저항을 연결해야 동작합니다.

 

 

 





라이브러리 설치

아래 링크에서 라이브러리를 다운로드 받아서 압축을 푼 후 폴더를 복사해서

 

https://github.com/grappendorf/arduino-framework/raw/master/3dparty/DallasTemperature_372Beta.zip 

 

http://www.pjrc.com/teensy/arduino_libraries/OneWire.zip 



아래 경로에 각각 복사해 줍니다.  압축풀린 폴더 안에 같은 이름의 폴더가 또 있으니 확인을 하세요.

 




정상적으로 설치되었다면 Arduino IDE에서 다음처럼  라이브러리의 예제가 보입니다.

 




소스 코드

메뉴에서 파일 > 새파일을 선택하여 다음 코드를 복사해줍니다.

 

#include <OneWire.h> 
#include <DallasTemperature.h> 
   
//DS18B20 온도 센서의 데이터선인 가운데 핀을 아두이노 3번에 연결합니다.  
#define ONE_WIRE_BUS 3 
   
//1-wire 디바이스와 통신하기 위한 준비 
OneWire oneWire(ONE_WIRE_BUS); 
   
// oneWire선언한 것을 sensors 선언시 참조함. 
DallasTemperature sensors(&oneWire); 
   
//다비아스 주소를 저장할 배열 선언 
DeviceAddress insideThermometer; 
   
   
void setup(void

  //시리얼 포트 초기화 
  Serial.begin(9600); 
  Serial.println("Dallas Temperature IC Control Library Demo"); 
   
  //1-wire 버스 초기화 
  sensors.begin(); 
     
  //발견한 디바이스 갯수 
  Serial.print("Found "); 
  Serial.print(sensors.getDeviceCount(), DEC); 
  Serial.println(" devices."); 
   
  // parasite power 모드일 때에는  2핀(GND와 DQ 핀)만 연결하면 됨. 
  Serial.print("Parasite power is: ");  
  if (sensors.isParasitePowerMode()) Serial.println("ON"); 
  else Serial.println("OFF"); 
     
   
  //버스에서 첫번째 장치의 주소를 가져온다. 
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");  
     
  //버스에서 발견한 첫번째 장치의 주소 출력 
  Serial.print("Device 0 Address: "); 
  printAddress(insideThermometer); 
  Serial.println(); 
   
  //데이터시트에서 확인결과 9~12비트까지 설정 가능 
  sensors.setResolution(insideThermometer, 10); 
   
  Serial.print("Device 0 Resolution: "); 
  Serial.print(sensors.getResolution(insideThermometer), DEC);  
  Serial.println(); 

   
   
// 온도를 출력하는 함수 
void printTemperature(DeviceAddress deviceAddress) 

  //섭씨 온도를 가져옴 
  float  tempC = sensors.getTempC(deviceAddress); 
     
  Serial.print("Temp C: "); 
  Serial.print(tempC); 
  Serial.print(" Temp F: "); 
     
  //화씨 온도로 변환 
  Serial.println(DallasTemperature::toFahrenheit(tempC));  

   
//디바이스 주소를 출력하는 함수 
void printAddress(DeviceAddress deviceAddress) 

  for (uint8_t i = 0; i < 8; i++) 
  { 
    if (deviceAddress[i] < 16) Serial.print("0"); 
        Serial.print(deviceAddress[i], HEX); 
  } 

   
   
void loop(void
{  
  Serial.print("Requesting temperatures..."); 
  //sensors.requestTemperatures();   //연결되어 있는 전체 센서의 온도 값을 읽어옴 
  sensors.requestTemperaturesByIndex(0); //첫번째 센서의 온도값 읽어옴 
  Serial.println("DONE"); 
   
  //센서에서 읽어온 온도를 출력 
  printTemperature(insideThermometer); 
}  




실행 결과

아두이노에 업로드한 후,  메뉴에서 툴 > 시리얼 모니터를 선택합니다.

손가락을 센서에 올려놓으면 온도가 올라가는 것을 확인할 수 있습니다. 

 

Requesting temperatures...Dallas Temperature IC Control Library Demo
Found 1 devices.
Parasite power is: OFF
Device 0 Address: 28FF96170600000C
Device 0 Resolution: 10
Requesting temperatures...DONE
Temp C: 27.25 Temp F: 81.05
Requesting temperatures...DONE
Temp C: 27.25 Temp F: 81.05
Requesting temperatures...DONE
Temp C: 27.75 Temp F: 81.95
Requesting temperatures...DONE
Temp C: 28.00 Temp F: 82.40
Requesting temperatures...DONE
Temp C: 28.25 Temp F: 82.85
Requesting temperatures...DONE
Temp C: 28.50 Temp F: 83.30
Requesting temperatures...DONE
Temp C: 28.75 Temp F: 83.75
Requesting temperatures...DONE
Temp C: 29.00 Temp F: 84.20
Requesting temperatures...DONE
Temp C: 29.00 Temp F: 84.20
Requesting temperatures...DONE
Temp C: 29.25 Temp F: 84.65
Requesting temperatures...DONE
Temp C: 29.50 Temp F: 85.10
Requesting temperatures...DONE
Temp C: 29.50 Temp F: 85.10
Requesting temperatures...DONE
Temp C: 29.75 Temp F: 85.55
Requesting temperatures...DONE
Temp C: 29.75 Temp F: 85.55
Requesting temperatures...DONE
Temp C: 30.00 Temp F: 86.00
Requesting temperatures...DONE
Temp C: 30.00 Temp F: 86.00
Requesting temperatures...DONE
Temp C: 30.25 Temp F: 86.45
Requesting temperatures...DONE
Temp C: 30.25 Temp F: 86.45
Requesting temperatures...DONE
Temp C: 30.50 Temp F: 86.90
Requesting temperatures...DONE
Temp C: 30.50 Temp F: 86.90
Requesting temperatures...DONE
Temp C: 30.50 Temp F: 86.90
Requesting temperatures...DONE
Temp C: 30.75 Temp F: 87.35
Requesting temperatures...DONE
Temp C: 30.75 Temp F: 87.35
Requesting temperatures...DONE
Temp C: 30.75 Temp F: 87.35
Requesting temperatures...DONE
Temp C: 31.00 Temp F: 87.80
Requesting temperatures...DONE
Temp C: 31.00 Temp F: 87.80
Requesting temperatures...DONE
Temp C: 31.00 Temp F: 87.80
Requesting temperatures...DONE
Temp C: 31.00 Temp F: 87.80
Requesting temperatures...DONE
Temp C: 31.25 Temp F: 88.25
Requesting temperatures...DONE
Temp C: 31.25 Temp F: 88.25
Requesting temperatures...DONE
Temp C: 31.25 Temp F: 88.25
Requesting temperatures...DONE
Temp C: 31.25 Temp F: 88.25
Requesting temperatures...DONE
Temp C: 31.25 Temp F: 88.25
Requesting temperatures...DONE
Temp C: 31.25 Temp F: 88.25
Requesting temperatures...DONE
Temp C: 31.25 Temp F: 88.25
Requesting temperatures...DONE
Temp C: 31.00 Temp F: 87.80
Requesting temperatures...DONE
Temp C: 31.00 Temp F: 87.80
Requesting temperatures...DONE
Temp C: 31.00 Temp F: 87.80




코드에서 Resolution을 올리면 정확도가 올라가는 대신 온도를 가져오는 속도가 느려집니다. 9~12 사이의 숫자를 사용할 수 있습니다.

 

sensors.setResolution(insideThermometer, 10); 



센서 2개 연결하는 방법

아두이노 3번핀에 두 개의 DS18B20 2번핀을 연결합니다. 

 

다음 코드를 사용합니다.

 

#include <OneWire.h> 
#include <DallasTemperature.h> 
   
//DS18B20 온도 센서의 데이터선인 가운데 핀을 아두이노 3번에 연결합니다.  
#define ONE_WIRE_BUS 3 
   
//1-wire 디바이스와 통신하기 위한 준비 
OneWire oneWire(ONE_WIRE_BUS); 
   
// oneWire선언한 것을 sensors 선언시 참조함. 
DallasTemperature sensors(&oneWire); 
   
//다비아스 주소를 저장할 배열 선언 
DeviceAddress Thermometer1, Thermometer2;
   
   
void setup(void

  //시리얼 포트 초기화 
  Serial.begin(9600); 
  Serial.println("Dallas Temperature IC Control Library Demo"); 
   
  //1-wire 버스 초기화 
  sensors.begin(); 
     
  //발견한 디바이스 갯수 
  Serial.print("Found "); 
  Serial.print(sensors.getDeviceCount(), DEC); 
  Serial.println(" devices."); 
   
  // parasite power 모드일 때에는  2핀(GND와 DQ 핀)만 연결하면 됨. 
  Serial.print("Parasite power is: ");  
  if (sensors.isParasitePowerMode()) Serial.println("ON"); 
  else Serial.println("OFF"); 
     
   
  //버스에서 첫번째 장치의 주소를 가져온다. 
  if (!sensors.getAddress(Thermometer1, 0)) Serial.println("Unable to find address for Device 0");  
     
  //버스에서 발견한 첫번째 장치의 주소 출력 
  Serial.print("Device 0 Address: "); 
  printAddress(Thermometer1); 
  Serial.println(); 
   
  //데이터시트에서 확인결과 9~12비트까지 설정 가능 
  sensors.setResolution(Thermometer2, 12); 
   
  Serial.print("Device 0 Resolution: "); 
  Serial.print(sensors.getResolution(Thermometer1), DEC);  
  Serial.println(); 


  //버스에서 두번째 장치의 주소를 가져온다. 
  if (!sensors.getAddress(Thermometer2, 1)) Serial.println("Unable to find address for Device 1");  
     
  //버스에서 발견한 두번째 장치의 주소 출력 
  Serial.print("Device 1 Address: "); 
  printAddress(Thermometer2); 
  Serial.println(); 
   
  //데이터시트에서 확인결과 9~12비트까지 설정 가능 
  sensors.setResolution(Thermometer2, 12); 
   
  Serial.print("Device 1 Resolution: "); 
  Serial.print(sensors.getResolution(Thermometer2), DEC);  
  Serial.println();

   
   
// 온도를 출력하는 함수 
void printTemperature(int num, DeviceAddress deviceAddress) 

  //섭씨 온도를 가져옴 
  float  tempC = sensors.getTempC(deviceAddress); 

  Serial.print("device: ");
  Serial.print(num);
  Serial.print(" Temp C: "); 
  Serial.print(tempC); 
  Serial.print(" Temp F: "); 
     
  //화씨 온도로 변환 
  Serial.println(DallasTemperature::toFahrenheit(tempC));  

   
//디바이스 주소를 출력하는 함수 
void printAddress(DeviceAddress deviceAddress) 

  for (uint8_t i = 0; i < 8; i++) 
  { 
    if (deviceAddress[i] < 16) Serial.print("0"); 
        Serial.print(deviceAddress[i], HEX); 
  } 

   
   
void loop(void
{  
  Serial.print("Requesting temperatures..."); 
  //sensors.requestTemperatures();   //연결되어 있는 전체 센서의 온도 값을 읽어옴 
  sensors.requestTemperaturesByIndex(0); //첫번째 센서의 온도값 읽어옴 
  Serial.println("DONE"); 
   
  //센서에서 읽어온 온도를 출력 
  printTemperature(0, Thermometer1); 


  sensors.requestTemperaturesByIndex(1); //두번째 센서의 온도값 읽어옴 
  Serial.println("DONE"); 
   
  //센서에서 읽어온 온도를 출력 
  printTemperature(1, Thermometer2);
}  




실행시켜 보면 첫번째 온도 센서와 두번째 온도 센서에서 번갈아가며 온도 가져오는 것을 반복합니다. 

첫번째 온도센서에만 손을 얹어보면 온도가 올라가는 것을 볼 수 있습니다. (노란색 줄)

 

Requesting temperatures...Dallas Temperature IC Control Library Demo
Found 2 devices.
Parasite power is: OFF
Device 0 Address: 2899EE2F0A0000C1
Device 0 Resolution: 12
Device 1 Address: 28FF96170600000C
Device 1 Resolution: 12
Requesting temperatures...DONE
device: 0 Temp C: 24.81 Temp F: 76.66
DONE
device: 1 Temp C: 24.75 Temp F: 76.55
Requesting temperatures...DONE
device: 0 Temp C: 24.81 Temp F: 76.66
DONE
device: 1 Temp C: 24.75 Temp F: 76.55
Requesting temperatures...DONE
device: 0 Temp C: 24.81 Temp F: 76.66
DONE
device: 1 Temp C: 24.75 Temp F: 76.55
Requesting temperatures...DONE
device: 0 Temp C: 24.94 Temp F: 76.89
DONE
device: 1 Temp C: 24.75 Temp F: 76.55
Requesting temperatures...DONE
device: 0 Temp C: 25.69 Temp F: 78.24
DONE
device: 1 Temp C: 24.81 Temp F: 76.66
Requesting temperatures...DONE
device: 0 Temp C: 26.31 Temp F: 79.36
DONE
device: 1 Temp C: 24.75 Temp F: 76.55
Requesting temperatures...DONE
device: 0 Temp C: 26.75 Temp F: 80.15
DONE
device: 1 Temp C: 24.81 Temp F: 76.66
Requesting temperatures...DONE
device: 0 Temp C: 27.12 Temp F: 80.82
DONE
device: 1 Temp C: 24.81 Temp F: 76.66
Requesting temperatures...DONE
device: 0 Temp C: 27.37 Temp F: 81.27
DONE
device: 1 Temp C: 24.81 Temp F: 76.66
Requesting temperatures...DONE
device: 0 Temp C: 27.56 Temp F: 81.61
DONE
device: 1 Temp C: 24.81 Temp F: 76.66
Requesting temperatures...DONE
device: 0 Temp C: 27.69 Temp F: 81.84
DONE
device: 1 Temp C: 24.81 Temp F: 76.66
Requesting temperatures...DONE
device: 0 Temp C: 27.87 Temp F: 82.18
DONE
device: 1 Temp C: 24.81 Temp F: 76.66
Requesting temperatures...DONE
device: 0 Temp C: 27.94 Temp F: 82.29
DONE
device: 1 Temp C: 24.81 Temp F: 76.66
Requesting temperatures...DONE
device: 0 Temp C: 28.06 Temp F: 82.51
DONE



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts