ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Arduino Uno에서 DS18B20 1-Wire 온도 센서 사용하기
    Arduino Uno/센서 2019. 1. 23. 21:07




    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



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

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

    유튜브 구독하기


    댓글 28

    • 안녕하세요 2019.01.23 17:10


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

    • 장일문 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



    • 학생! 2019.04.07 18:50


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

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


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

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


    • 온도 2019.06.03 20:44


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

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

Designed by Tistory.