반응형




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



반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


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

  1. 안녕하세요 2019.01.23 17:10

    두 개의 온도 센서를 제어하고 싶은데 코드 상으로 어떤 걸 추가해야되나요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.01.23 21:10 신고

      포스팅에 센서 2개 연결하는 방법을 추가했습니다.
      참고하세요~

  2. 장일문 2019.03.03 18:22

    안녕하세요
    일단 글을 잘 읽어 보았습니다
    저는 아두이노 나노에 온도센서를 연결 할려고 하는데요

    무조건 저항을 2번과 5V사이에 연결해 주어야 하는지요

    또 온도 센서 2개를 연결할때는 저항이 필요 없다는 말씀이신지 궁금합니다

    세번째는 제가 아두이노 초보라서 드리는 무식한 질문입니다

    현재 S4A라는 스크래치 코딩 프로그램으로 실시간 아두이노를 제어하고있는데요

    이걸하기위해서는 S4A에서 제공하는 펌웨어를 업로드 해야만 합니다

    그런데 저 온도 센서 관련 라이브러리를 업로드한다는 말씀은 S4A에서 제공하는 펌웨어에 저 소스코드를 추가해 넣으라는 말씀이신지

    소스코드는 수정하고 펌웨어안에 라이브러리를 정의해주기만 하면 되는것인지요

    마지막으로 첫번째 파일링크가 깨져있습니다

    바쁘시더라도 도움 부탁드립니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.03.03 20:32 신고

      1. 저항을 온도센서 2번과 5V사이에 연결해주어야 정상동작합니다.

      2. 온도 센서 2개를 연결시에는 각각 저항을 각각 연결해주고 데이터핀에 같이 연결해주면 됩니다.

      3. 본 글을 진행하려면 아두이노 IDE를 사용하셔야 합니다.
      다음 글을 참고하세요.

      https://webnautes.tistory.com/537



  3. 학생! 2019.04.07 18:50

    포스팅에 나온 온도센서 말고 다른센서들을 이용해서 데이터를 표시하고싶으면 위에서 수정해야 할 사항들이 무엇이있을까요
    일산화탄소 센서와 가스센서를 사용하려고 합니다.

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.07 19:14 신고

      온도 센서만 해서 도움을 못드립니다..

      라이브러리 이름 onwire와 사용할 센서 영어 이름을 사용하여 구글에서 검색해보세요.


  4. 온도 2019.06.03 20:44

    코드대로 다 따라 했는데도 디바이스가 0개 발견 되었다고만 뜨네요ㅠ ㅠ

    저항을 연결 안해서 그런건가요 ?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.03 20:53 신고

      온도 센서 사용시 저항을 연결안하면 인식이 안됩니다.

      꼭 연결해줘야 합니다.

    • 온도 2019.06.03 20:55

      아 그렇군요 감사합니다.

      저항 종류가 여러개 인데

      위에 써져 있느것이 470 입니다.

      이걸로 쓰면 되는건가요 ?

      그리고 3번핀 꼽은 곳과 5v 꼽은 곳 양쪽에다가 꼽아 주면 되는건가요 ?

    • 온도 2019.06.03 20:59

      저항 연결 했는데 값이 거의 0.01초 속도로 뜹니다 ㅠ 뭐가 문제일까요 ?

      그리고 멈춰서 온도를 보면 값이 -127도에요.....

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.03 21:14 신고

      데이터핀과 5V 연결하는 선 중간에 연결해줘야 합니다.

    • 온도 2019.06.03 21:19

      혹시 단면도? 그런건 없을까요 ?

      이해가 잘 안가네요 ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.03 21:29 신고

      포스트의 하드웨어 연결에 추가한 이미지를 참고하세요.

    • 온도 2019.06.03 21:36

      감사합니다 !

    • 온도 2019.06.03 21:40

      저대로 꼽으면 우노가 꺼져버리는데 왜 그런거죠 ? ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.03 21:42 신고

      1번핀과 3번핀 방향이 맞나 확인해보세요

    • 온도 2019.06.03 21:45

      gnd와 5v말씀하시는건가요 ?

    • 온도 2019.06.03 21:48

      보드에 업로딩 중 문제 발생 이라고 뜨는건 제가 잘못연결해서 그런거 맞나요 ?

    • 온도 2019.06.03 21:55

      저대로 꼽았는데도 자꾸 우노가 꺼지면서업로딩 중 문제가 생겼다고 뜹니다 ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.03 21:55 신고

      빼고 업로드해보세요

    • 온도 2019.06.03 21:58

      어떤걸 빼라는 말씀이시죠?
      esp-01하고 온도 센서 모든 핀 다 말씀이신가요 ?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.03 21:59 신고

      5v핀과 그라운드핀을 빼고 업로드해보세요

    • 온도 2019.06.03 22:16

      빼고 업로드 하면 여전히 0디바이스 발견이네요 ㅠ 저대로 꼽고 하면 온도 센서에서 타는 냄새가 납니다 .....

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.03 22:21 신고

      5V와 그라운드를 뒤바꾸어서 그렸네요..

      잘못연결해도 보드에 문제가 생기지는 않습니다.

    • 온도 2019.06.03 22:23

      아 아까 단면이 잘못 된 거였나요 ? 수정 본 혹시 올려주실 수 있으신가요 ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.03 22:31 신고

      확인해보니 처음 그린 그림이 맞네요..

      저항 연결후 빠르게 온도 메시지가 보이는 것은 테스트해보니 아두이노에 연결시 5V와 그라운드를 거꾸로 연결시 발생하네요..

    • 온도 2019.06.03 22:34

      거꾸로 연결 했다는 말씀이 지금 기준으로 제가 만약 잘못 끼웠다면, 온도 센서를 뒤집어서 끼워주면 맞는거겠죠?

      양쪽 끝이 바뀌게 되니까요 ??

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.03 22:49 신고

      맞습니다

  5. 안녕하세요 2020.09.21 16:14

    안녕하세요 해당 센서 두개를 이용하여 출력을 같이 뽑아내려합니다.
    현재 저의 구상도는 진동센서 2개와 온도센서 2개의 출력값을 동시에 LCD 가시화와 USB TTL을 통해 PLX-DAQ를 이용하여 데이터를 저장하려 합니다.
    진동센서의 2개 는 완벽히는 아니지만 결과값을 확인 하였으며,
    온도센서의 경우 1개 개별 구동으로 구동을 확인하였습니다.

    글쓴이분께서 작성글을 보니 3번핀에 센서 2개를 연결을 하는거로 보입니다. 한 넘버링에 2개의 센서를 연결할 시 동시 출력이 아닌 개별 반복 출력 되는게 아닌가 싶어 문의 드립니다.
    그럼 빵판에 3번핀을 연결하고, 공유된 3번핀에 2개의 센서 핀을 꼽는게 맞는지 확인 부탁드리겠습니다.

    저는 센서 출력값을 drsorft 명령어를 통해 변수 각자 다시 선언하고, 통합으로 sprintf 함수로 한번에 모든 결과 값들을 출력 시켜 주려 하는데 작성자 분의 글처럼 연결을 해도 가능한가요?

    현재 저의 기존 생각은 각 디지털 2,3 번핀에 각각 연결을 하여, 시도하려 했습니다.

+ Recent posts