?>

Hard Copy World

HCW

Sensor

Home > Info >

Sensor

비접촉식 적외선 온도센서

페이지 정보

작성자 하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일15-02-21 22:34 조회13,082회 댓글12건

본문

 

MLX90614

저렴한 온도센서는 널렸기 때문에 구하기 쉽습니다만, 비접촉식으로 동작하는 정밀한 온도센서는 얘기가 틀립니다. 보통 체온잴 때 병원에서 사용하는 온도센서 같은걸 말하는겁니다.

MLX90614 센서는 물체에서 방출되는 적외선을 통해 온도를 측정하는 센서입니다. 17비트 ADC와 DSP 유닛을 탑재해서 작은 사이즈임에도 높은 정확도와 해상력을 자랑합니다. -70 ~ 380'C 범위를 0.02'C 단위로 측정이 가능합니다. 상세한 스펙은 아래를 참고하세요.

MLX90614ESF-AAA-5V-power-supply

  • Small size, low cost
  • Easy to integrate
  • Factory calibrated in wide temperature range: -40 to 125 °C for sensor temperature and -70 to 380 °C for object temperature.
  • High accuracy of 0.5°C over wide temperature range (0..+50 C for both Ta and To)
  • Medical accuracy of 0.1°C in a limited temperature range available on request
  • Measurement resolution of 0.01°C
  • Single and dual zone versions
  • SMBus compatible digital interface for fast temperature readings and building sensor networks
  • Customizable PWM output for continuous reading
  • Available in 3V and 5V versions
  • Simple adaptation for 8 to 16V applications
  • Power saving mode
  • Different package options for applications and measurements versatility
  • Automotive grade

 

연결 방법

Breakout 보드에 연결되지 않은채 센서 모듈만 가진 상황이라면 아래와 같이 연결할 수 있습니다.

Schematic

I2C 모듈을 연결하는 일반적인 방법인데 2개의 pull-up 저항이 사용되고 VCC, GND 사이에 커패시터가 사용되었습니다. [연결방법 상세 이미지]

아래와 같이 Breakout 에 연결된 모듈을 사면 보다 편리하게 사용할 수 있습니다.

CJMCU-Infrared-Non-Contact-Temperature-Measuring-Sensor-Module-MLX90614-Sensor-IIC-Communication.jpg_200x200

이 경우는 SDA, SCL, VCC, GND 를 아두이노의 A4, A5, 3.3V, GND 핀에 연결해줍니다.

 

라이브러리

이 센서의 유일한 문제점은... I2C  통신을 지원하지만 Wire 라이브러리를 사용할 수 없다는 겁니다. 별도의 전용 라이브러리를 설치해서 사용해야 합니다. I2CMaster 라이브러리를 사용하는 방법과 Adafruit_MLX90614 라이브러리를 사용하는 방법이 있습니다. 여기서는 Adafruit 라이브러리를 이용해서 테스트 해보겠습니다.

먼저 Adafruit_MLX90614 라이브러리를 다운로드 받아서 설치합니다.

 

소스코드

라이브러리가 설치되면 아두이노 IDE를 실행하고 설치한 라이브러리에 포함된 예제파일을 불러옵니다. mlxtest.ino 파일입니다.

/*************************************************** 
  This is a library example for the MLX90614 Temp Sensor

  Designed specifically to work with the MLX90614 sensors in the
  adafruit shop
  ----> https://www.adafruit.com/products/1748
  ----> https://www.adafruit.com/products/1749

  These sensors use I2C to communicate, 2 pins are required to  
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Wire.h>
#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

void setup() {
  Serial.begin(9600);

  Serial.println("Adafruit MLX90614 test");  

  mlx.begin();  
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); 
  Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF()); 
  Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");

  Serial.println();
  delay(500);
}

라이브러리 include 하고 초기화 코드만 실행해주면,  이후로는 필요할 때 센서값을 읽기만하면 됩니다. 간단하죠.

아래는 센서 모듈과 OLED 디스플레이를 이용해 체온을 측정해서 보여주도록 작성한 예제입니다.

non_contact_thermo

코드는 아래와 같습니다. 온도센서 예제에 u8glib를 이용해서 OLED 디스플레이 하도록 코드를 추가했습니다.

/*************************************************** 
  This is a library example for the MLX90614 Temp Sensor

  Designed specifically to work with the MLX90614 sensors in the
  adafruit shop
  ----> https://www.adafruit.com/products/1748
  ----> https://www.adafruit.com/products/1749

  These sensors use I2C to communicate, 2 pins are required to  
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include "U8glib.h"

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

///////////////////////////////////////////////////////////////////
//----- OLED instance
// IMPORTANT NOTE: The complete list of supported devices 
// with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI 
///////////////////////////////////////////////////////////////////

void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit MLX90614 test");  
  mlx.begin();  
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); 
  Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF()); 
  Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");
  Serial.println();
  
  String strTemp = String("");
  strTemp += (int)(mlx.readObjectTempC());
  char buff[10];
  strTemp.toCharArray(buff, 5);
  buff[2] = 0x27;
  buff[3] = 'C';
  buff[4] = 0x00;
  
  drawTemp(buff);
  
  delay(500);
}

void drawTemp(char* strTemp) {
  // picture loop  
  u8g.firstPage();  
  do {
    // show text
    u8g.setFont(u8g_font_courB14);
    u8g.setFontRefHeightExtendedText();
    u8g.setDefaultForegroundColor();
    u8g.setFontPosTop();
    u8g.drawStr(5, 12, "Temperature");
    u8g.drawStr(45, 40, strTemp);
  } while( u8g.nextPage() );
}

 

참고자료

 


하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물

모든 전통이 한 때는 오해를 면치 못했다. 마찬가지로 모든 아이디어는 한 때는 비웃음을 면치 못했다. -홀브룩 잭슨 ::::: 느닷없이 떠오르는 생각이 가장 귀중한 것이며, 보관해야할 가치가 있는 것이다. -베이컨 ::::: 미리 숙고하면 힘든 일도 그저 실행에 옮기는 순간 쉬워진다. - 로버트 M. 피어식

추천 0
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글목록

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

Aliexpress 등에서 센서모델명 MLX90614 로 검색하시면 breakout 보드도 간간히 보입니다.
http://www.aliexpress.com/wholesale?initiative_id=SB_20150312000650&site=glo&shipCountry=KR&SearchText=MLX90614&page=1

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

아래 링크입니다.
http://www.aliexpress.com/item/CJMCU-Infrared-Non-Contact-Temperature-Measuring-Sensor-Module-MLX90614-Sensor/32268205646.html

김동철님의 댓글

김동철 이름으로 검색 작성일

디스플레이에 소수점까지 올리고 싶은데 어떻게 해야 될지 알려주실 수 있나요?

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

실수(float)를 문자열로 바꾸실 때는 아래 함수를 이용해서 변환한 다음 화면에 출력하세요.
char * floatToString(char * outstr, double val, byte precision, byte widthp){
 char temp[16]; //increase this if you need more digits than 15
 byte i;

 temp[0]='\0';
 outstr[0]='\0';

 if(val < 0.0){
  strcpy(outstr,"-\0");  //print "-" sign
  val *= -1;
 }

 if( precision == 0) {
  strcat(outstr, ltoa(round(val),temp,10));  //prints the int part
 }
 else {
  unsigned long frac, mult = 1;
  byte padding = precision-1;
 
  while (precision--)
    mult *= 10;

  val += 0.5/(float)mult;      // compute rounding factor
 
  strcat(outstr, ltoa(floor(val),temp,10));  //prints the integer part without rounding
  strcat(outstr, ".\0"); // print the decimal point

  frac = (val - floor(val)) * mult;

  unsigned long frac1 = frac;

  while(frac1 /= 10)
    padding--;

  while(padding--)
    strcat(outstr,"0\0");    // print padding zeros

  strcat(outstr,ltoa(frac,temp,10));  // print fraction part
 }

 // generate width space padding
 if ((widthp != 0)&&(widthp >= strlen(outstr))){
  byte J=0;
  J = widthp - strlen(outstr);

  for (i=0; i< J; i++) {
    temp[i] = ' ';
  }

  temp[i++] = '\0';
  strcat(temp,outstr);
  strcpy(outstr,temp);
 }

 return outstr;
}

아래 링크에 실수를 문자열로 바꾸는 여러 방법들이 있습니다.
http://forum.arduino.cc/index.php?topic=37391.0