개발자/Arduino

Arduino와 DS18B20 1-Wire 디지털 온도 센서 인터페이스, 온도표시

지구빵집 2021. 4. 20. 10:23
반응형

 

 

Arduino와 DS18B20 1-Wire 디지털 온도 센서 인터페이스 

 

Arduino 프로젝트에 온도 감지를 추가하는 가장 쉽고 저렴한 방법 중 하나는 DS18B20 1-Wire 온도 센서를 사용하는 것입니다. 이 센서는 매우 정확하며 작동하는 데 외부 구성 요소가 필요하지 않습니다. 따라서 몇 개의 연결과 일부 Arduino 코드로 온도를 즉시 감지 할 수 있습니다! 

 

DS18B20 1-Wire 온도 센서 DS18B20은 Dallas Semiconductor Corp에서 제조 한 1-Wire 인터페이스 온도 센서 입니다. 고유한 1-Wire® 인터페이스는 마이크로 컨트롤러와 양방향 통신을위한 하나의 디지털 핀을 필요로한다. 센서는 일반적으로 두 가지 폼 팩터로 제공 됩니다. TO-92 패키지로 제공되는 것은 일반 트랜지스터와 똑같이 보입니다. 방수 프로브 스타일의 다른 하나는 멀리 떨어진 곳, 수중 또는 지하에서 무언가를 측정해야 할 때 더 유용 할 수 있습니다. 

 

 

Types Of DS18B20 Temperature Sensor

 

DS18B20 온도 센서는 매우 정확하며 작동하는 데 외부 부품이 필요하지 않습니다. ± 0.5 ° C 정확도 로 -55 ° C ~ + 125 ° C의 온도를 측정 할 수 있습니다 .

 

온도 센서의 분해능은 9, 10, 11 또는 12 비트로 사용자가 구성 할 수 있습니다. 그러나 전원 공급시 기본 분해능은 12 비트 (예 : 0.0625 ° C 정밀도)입니다.

 

센서는 3V ~ 5.5V 전원 공급 장치로 전원을 공급할 수 있으며 활성 온도 변환 중에는 1mA 만 소비합니다.

전체 사양은 다음과 같습니다. 

 

  • Power Supply 3V to 5.5V
  • Current Consumption 1mA
  • Temperature Range -55 to 125°C
  • Accuracy ±0.5°C
  • Resolution 9 to 12 bit (selectable)
  • Conversion Time < 750ms 

 

단일 버스에서 다중 DS18B20

 

DS18B20의 가장 큰 장점 중 하나는 여러 DS18B20이 동일한 1-Wire 버스에 공존 할 수 있다는 것입니다. 각 DS18B20에는 공장에서 구운 고유 한 64 비트 직렬 코드 가 있으므로 서로 구별하기가 더 쉽습니다.

이 기능은 넓은 지역에 분산 된 많은 DS18B20을 제어하려는 경우 큰 이점이 될 수 있습니다.

여러 DS18B20 온도 센서에서 온도를 읽는 방법을 알아 보려면 이 튜토리얼을 확인하십시오. 

 

 

DS18B20 센서 핀아웃 

 

https://lastminuteengineers.com/ds18b20-arduino-tutorial/#ds18b20-1wire-temperature-sensor

 

GND 접지 핀입니다. DQ 1-Wire 데이터 버스는 마이크로 컨트롤러의 디지털 핀에 연결되어야합니다. VDD 핀은 3.3 ~ 5V 사이의 센서에 전원을 공급합니다. 

 

Arduino에 DS18B20 온도 센서 배선

 

이론은 충분합니다. Let 's Go Practical! DS18B20을 Arduino에 연결해 보겠습니다. 연결은 매우 간단합니다. VDD를 Arduino의 5V 출력 핀에 연결하고 GND를 접지에 연결하여 시작하십시오.

 

다음으로 나머지 디지털 신호 핀 DQ를 arduino의 디지털 핀 2에 연결합니다. 또한 데이터 전송을 안정적으로 유지하려면 신호와 전원 핀 사이에 4.7k 풀업 저항 을 추가해야합니다 . (arduino의 내부 풀업이 작동하지 않음) DS18B20을 올바르게 사용하도록주의하십시오. 잘못된 방향으로 넣으면 뜨거워지고 깨집니다. 

 

 

 

Arduino에 DS18B20 온도 센서 배선 DS18B20의 방수 버전을 사용하는 경우 빨간색 줄무늬를 5V에 연결하고 검은 색은 접지에 연결하고 노란색 줄무늬는 arduino의 디지털 핀 2로가는 데이터입니다. 데이터에서 5V까지 4.7K 풀업 저항을 연결해야합니다. 

 

 

 

DS18B20 용 라이브러리 설치Dallas 1-Wire 프로토콜은 다소 복잡하며 통신을 파싱하기 위해 많은 코드가 필요합니다. 이 불필요한 복잡성을 감추기 위해 DallasTemperature.h 라이브러리 를 설치 하여 센서에서 온도 판독 값을 가져 오는 간단한 명령을 실행할 수 있습니다. 라이브러리를 설치하려면 Sketch> Include Library> Manage Libraries…로 이동하여 라이브러리 관리자가 라이브러리 색인을 다운로드하고 설치된 라이브러리 목록을 업데이트 할 때까지 기다립니다. 

 

'ds18b20'을 입력하여 검색을 필터링하십시오. 몇 개의 항목이 있어야합니다. Miles Burton의 Dallas Temperature 를 찾으십시오 . 해당 항목을 클릭 한 다음 설치를 선택합니다. 

 

 

이 Dallas Temperature 라이브러리는 하위 수준 기능을 처리하는 하드웨어 별 라이브러리입니다. DS18B20뿐만 아니라 모든 단선 장치와 통신하려면 1-wire 라이브러리와 페어링해야합니다 . 이 라이브러리도 설치하십시오. 

 

 

아래와 같이 아두이노 코드를 입력합니다.

 

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

// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);	

// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);

void setup(void)
{
  sensors.begin();	// Start up the library
  Serial.begin(9600);
}

void loop(void)
{ 
  // Send the command to get temperatures
  sensors.requestTemperatures(); 

  //print the temperature in Celsius
  Serial.print("Temperature: ");
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print((char)176);//shows degrees character
  Serial.print("C  |  ");
  
  //print the temperature in Fahrenheit
  Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0);
  Serial.print((char)176);//shows degrees character
  Serial.println("F");
  
  delay(500);
}

 

결과는 아래와 같지만 온도 표시 문자가 깨집니다.

 

Temperature: 23.69⸮C  |  74.64⸮F
Temperature: 23.69⸮C  |  74.64⸮F
Temperature: 23.69⸮C  |  74.64⸮F
Temperature: 23.69⸮C  |  74.64⸮F
Temperature: 23.69⸮C  |  74.64⸮F

 

아래 코드는 온도 기호가 잘 표시되도록 변경한 코드입니다.

 

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

// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 12

// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);    

// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);

void setup(void)
{
  sensors.begin();  // Start up the library
  Serial.begin(9600);
}

void loop(void)
{ 
  // Send the command to get temperatures
  sensors.requestTemperatures(); 

  //print the temperature in Celsius
  Serial.print("Temperature: ");
  Serial.print(sensors.getTempCByIndex(0));
  //Serial.print((char)176);//shows degrees character
  Serial.print("\xe2\x84\x83");//shows degrees character
  //Serial.print("C  |  ");
  
  //print the temperature in Fahrenheit
  Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0);
  Serial.println("\xe2\x84\x89");//shows degrees character
  //Serial.println("F");
  
  delay(500);
}

 

결과는 아래와 같이 깔끔하고 아름답게 나옵니다. 고생하셨습니다. 일이 많아 집니다. 무엇이 좋은 지는 세월이 알려줄 거라고 믿습니다.

 

Temperature: 25.25℃77.45℉
Temperature: 25.25℃77.45℉
Temperature: 25.25℃77.45℉
Temperature: 25.25℃77.45℉
Temperature: 25.25℃77.45℉
Temperature: 25.25℃77.45℉

 

코드 설명 :

 

스케치는 OneWire.h 및 DallasTemperature.h 라이브러리를 포함하고 센서의 신호 핀이 연결된 Arduino 핀을 선언하는 것으로 시작됩니다. 

 

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

#define ONE_WIRE_BUS 2

 

다음으로 센서의 신호 핀을 생성자에 전달하여 단선 객체를 만듭니다. 이 단선 개체를 통해 DS18B20뿐만 아니라 모든 단선 장치와 통신 할 수 있습니다. DS18B20 센서와 통신하기 위해서는 DallasTemperature 라이브러리의 객체를 생성하고 one-wire 객체의 참조를 매개 변수로 전달해야합니다. 

 

OneWire oneWire(ONE_WIRE_BUS);	
DallasTemperature sensors(&oneWire);

 

DallasTemperature 객체가 생성되면 다음과 같은 간단한 명령을 실행하여 센서와 상호 작용할 수 있습니다.

 

  • begin() 기능은 버스에서 연결된 센서를 검색하고 각각에 대해 비트 해상도 (12 비트)를 설정합니다.
  • requestTemperatures() 함수는 온도 변환을 수행하기 위해 버스의 모든 센서에 대한 명령을 보냅니다.
  • getTempCByIndex(deviceIndex)함수는 센서에서 온도 판독 값을 읽고 반환합니다. deviceIndex버스의 센서 위치 일뿐입니다. 버스에서 DS18B20을 하나만 사용하는 경우 0으로 설정하십시오. 

 

DallasTemperature.h 라이브러리의 기타 유용한 기능

 

DallasTemperature 객체와 함께 사용할 수있는 몇 가지 유용한 기능이 있습니다. 그 중 몇 가지가 아래에 나열되어 있습니다.

 

  • setResolution() 함수는 DS18B20의 내부 아날로그-디지털 변환기의 분해능을 각각 0.5 ° C, 0.25 ° C, 0.125 ° C 및 0.0625 ° C의 증분에 해당하는 9, 10, 11 또는 12 비트로 설정합니다.
  • bool getWaitForConversion()함수는 waitForConversion 플래그의 값을 반환합니다. 온도 변환이 완료되었는지 확인하고자 할 때 유용 할 수 있습니다.
  • setHighAlarmTemp()& setLowAlarmTemp()기능은 장치에 대한 내부 고온 및 저온 경보를 섭씨로 설정합니다. 유효 범위는 -55 ~ 125 ° C입니다.
  • bool hasAlarm() 온도가 높고 낮은 알람 온도 설정을 초과 할 때 장치에 알람 조건이있는 경우 함수는 true를 반환합니다. 

 

어렵다. 즐거우면서도 즐겁지 않다. 언제까지 이런 짓을 반복해야 하는지.

 

참고 문서

Arduino와 DS18B20 1-Wire 디지털 온도 센서 인터페이스 

 

 

 

반응형