코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-11-05 11:28:12
아두이노에서 주변의 온도를 측정하려 할때
'온도 센서'를 통해 주변 온도에 따른 변화를 측정하게 됩니다.
이때 사용되는 '온도 센서'는 작동방식에 따라 다양하게 존재하는데요,
일반적으로 많이 사용되는 몇가지 소자를 살펴보겠습니다.
사진: 서미스터 (Thermister)
'서미스터'는 저항기의 일종으로,
온도에 따라 물질의 저항이 변화하는 성질을 이용한 전기적 장치입니다.
열가변저항기라고도 하며, 주로 회로의 전류가 일정 이상으로 오르는 것을 방지하거나,
회로의 온도를 감지하는 센서로써 이용됩니다.
사진: TMP 36
'TMP 36'은 IC의 일종으로 반도체형 온도센서입니다.
측정 범위가 넓고 사용이 간단하며, 영하의 온도까지 측정이 가능한 것이 특징입니다.
다소 제한적인 '서미스터'보다 널리 사용되는 소자입니다.
사진 : 열적외선 온도 센서 - MLX90614
이번 예제에서 사용할 '열 적외선 온도 센서'는
피사체에서 방사되는 열 적외선을 감지하여 온도를 측정하는 모듈로,
비접촉 방식의 온도 측정이 가능하다는 특징이 있습니다.
사진 : 열적외선 온도계
이와 같은 열적외선 온도계에 사용되거나,
출처 : 공항 검역 - news.investors.com/PhotoPopup열적외선 카메라에 삽입되어, 공항에서 검역 장치로도 사용되고 있습니다.
그럼 본격적으로 실습을 통해 열적외선 온도 센서를 이용하여
주변 대기의 온도를 측정해 보겠습니다.
NO | 부품명 | 수량 | 상세설명 |
1 | 오렌지 보드 | 1 | 아두이노 호환보드 |
2 | 열적외선 온도 센서 | 1 | MLX90614 |
3 | 점퍼케이블 | 4 | '암-수' 핀 점퍼케이블 필요 |
부품명 | 오렌지 보드 | 열적외선 온도 센서 | 점퍼케이블 |
파트 | x1 | x1 | x4 |
IR Temp | 아두이노 |
VCC | 5V |
GND | GND |
SDA | A4 |
SCL | A5 |
I2C 통신을 위해 라이브러리를 다운받아 설치합니다.
라이브러리 다운받기
아래의 코드를 아두이노에 업로드 합니다.
#include // i2cmaster 라이브러리를 불러옵니다. void setup(){ Serial.begin(9600);//시리얼 통신을 준비합니다. Serial.println("Setup...");// 초기 설정 상태를 시리얼 모니터상에 출력합니다. i2c_init(); //i2c 버스의 초기값을 설정합니다. PORTC = (1 << PORTC4) | (1 << PORTC5);// 풀업을 사용합니다. } void loop(){ int dev = 0x5A<<1; int data_low = 0; int data_high = 0; int pec = 0; i2c_start_wait(dev+I2C_WRITE); i2c_write(0x07); // 값을 읽어들입니다. i2c_rep_start(dev+I2C_READ); data_low = i2c_readAck(); //1바이트를 읽어들이고 전송 상태를 송신합니다. data_high = i2c_readAck(); //1바이트를 읽어들이고 전송 상태를 송신합니다. pec = i2c_readNak(); i2c_stop(); //This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps double tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614) double tempData = 0x0000; // zero out the data int frac; // data past the decimal point // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte. tempData = (double)(((data_high & 0x007F) << 8) + data_low); tempData = (tempData * tempFactor)-0.01; float celcius = tempData - 273.15;//현재 측정된 tempData를 섭씨로 변환합니다. float fahrenheit = (celcius*1.8) + 32;//현재 측정된 tempData를 화씨로 변환합니다. Serial.print("Celcius: ");//섭씨를 시리얼모니터에 출력합니다. Serial.println(celcius); Serial.print("Fahrenheit: ");//화씨를 시리얼모니터에 출력합니다. Serial.println(fahrenheit); delay(1000); // 1초 동안 대기합니다. }
kocoafabeditor
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!