DS18b20 온도센서#
DS18b20 온도 센서를 이용하여 온도를 측정한다.
- one-wire 버스 통신
- 공급전압: 3.0V ~ 5.5V
- 작동온도: -55ºC ~ +125ºC
- 오차: +/-0.5 ºC (-10ºC ~ 85ºC 범위에서)
Pinout#
schematic#
DS18b20 센서는 두 가지 연결방법을 제공하는데, 하나는 VCC를 5V에 연결하는 Normal Mode이고 다른 하나는 VCC를 GND에 연결하는 Parasite Mode이다. 두가지 방법 모두 지원되지만 (경험상) Normal를 추천하며 (원인은 잘 모르겠지만) Parasite Mode에서는 온도센서가 작동이 되지 않는 경우도 가끔 있었다. 회로 구성을 위해 4.7㏀ 저항 1개가 필요하며 Normal Mode 구성을 위해 다음 그림과 같이 연결한다.
- 3가닥의 선에 브레드보드에 연결할 수 있는 핀을 납땜하고, 노란색선과 빨간색선의 연결부위에 4.7㏀ 저항을 추가로 납땜하여 연결한다.
- 수축튜브를 사용하여 연결부위를 절연한 뒤,
- 구경이 조금 더 큰 수축튜브를 사용하여 3가닥을 하나로 감싸 마무리한다.
Normal Mode#
DS18b20 | Yellow | Red | Black |
---|---|---|---|
Arduino | 2 | 5V | GND |
4.7㏀ | O | O |
Parasite Mode#
DS18b20 | Yellow | Red | Black | |
---|---|---|---|---|
Arduino | 5V | 2 | GND | GND |
4.7㏀ | O | O |
sketch#
라이브러리 준비하기#
- OneWire (by Jim Studt etc.)
- DallasTemperature (by Miles Burton)
sketch#
#include <OneWire.h>
#include <DallasTemperature.h>
#define TEMP_PIN 2
OneWire oneWire(TEMP_PIN);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
Serial.println("DallasTemperature IC Control");
// Start up the library
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
float temperatureF = sensors.getTempFByIndex(0);
Serial.print(temperatureC);
Serial.println("*C");
Serial.print(temperatureF);
Serial.println("*F");
delay(2000);
}
TM1637에 온도 표시하기#
schematic: Normal Mode#
sketch#
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 4
#define DIO 7
TM1637Display display(CLK, DIO);
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
int seg3, seg2, seg1, seg0;
// DS18b20 Temperature Sensor Setting
#include <OneWire.h>
#include <DallasTemperature.h>
#define TEMP_PIN 2
OneWire oneWire(TEMP_PIN);
DallasTemperature sensors(&oneWire);
float celciusTemperature; // Celcius Temperature
int tempTemperature;
void setup() {
Serial.begin(9600);
Serial.println("DallasTemperature IC Control");
// DS18b20 Temperature Sensor Initialize
sensors.begin();
// TM1637 Initialize
display.setBrightness(15); // 0 ~ 15 (15가 가장 밝음)
// display.setBrightness(0x0f);
}
void loop() {
sensors.requestTemperatures();
celciusTemperature = sensors.getTempCByIndex(0);
Serial.print("Temperature is: ");
Serial.println(celciusTemperature);
tempTemperature = celciusTemperature * 100;
seg0 = (tempTemperature / 1000) % 10; // 4자리에서 1000의 자리 숫자 저장
seg1 = (tempTemperature / 100) % 10; // 4자리에서 100의 자리 숫자 저장
seg2 = (tempTemperature / 10) % 10; // 4자리에서 10의 자리 숫자 저장
seg3 = tempTemperature % 10; // 4자리에서 1의 자리 숫자 저장
data[0]=display.encodeDigit(seg0); // 첫번째 FND에 1000의 자리 숫자배열
data[1]=display.encodeDigit(seg1); // 두번째 FND에 100의 자리 숫자 배열
data[2]=display.encodeDigit(seg2); // 세번째 FND에 10의 자리 숫자 배열
data[3]=display.encodeDigit(seg3); // 네번째 FND에 1의 자리 숫자 배열
// 온도가 100도보다 높으면 소수점 첫째자리까지 출력
if (celciusTemperature >= 100) {
display.showNumberDecEx(tempTemperature, (0x80 >> 2), true);
}
// 온도가 100도보다 낮으면 소수점 둘째자리까지 출력
else {
display.showNumberDecEx(tempTemperature, (0x80 >> 1), true);
}
delay(2000);
}