K씨의 별별제작소

아두이노로 비접촉 온도계 만들기(MLX90614 온도센서, 0.91OLED) 본문

아두이노 프로젝트

아두이노로 비접촉 온도계 만들기(MLX90614 온도센서, 0.91OLED)

K씨 2018. 12. 18. 21:01

비접촉 온도계를 만들 예정에 없다가 갑자기 만들게 된 건

직접 납땜한 센서 하나가 전혀 작동을 하지 않아서였다.

온도조절기능이 없는 인두기로 납땜을 했는데

혹시 인두기 온도가 맞지 않아서 잘못된 납땜을 해서

작동을 안하는건가 하는 의구심이 들어

인두기 온도를 측정하기 위해

비접촉 적외선 온도계를 만들어보기로 했다.

 

1. 준비물

 

▲ 부피를 작게 하려고 아두이노 나노 호환보드를 사용하고

0.91인치 OLED (128x32 I2C SSD1306) 모듈과

MLX90614 비접촉 적외선 온도센서 모듈을 사용했다.

 

 

2. MLX90614 비접촉 적외선 온도센서 모듈 연결하기

 

▲ 이 온도센서는 I2C 통신을 하고

사물온도를 -70도에서 380도까지 측정할수 있다고 나와있다.

알리익스프레스에서 구입했고 가격은 $5.04

 

헤더핀을 직접 납땜해 주었는데

지금껏 그래왔듯이 감으로 적당히 달궈졌다고 여겨지는 때(?)에 인두기로 납땜했는데

작동하는데 문제는 없었다.

 

 

▲ 이 보드는 MicroUSB 포트를 사용하고 있어서

컴퓨터와 연결할 때나 전원연결 시

스마트폰 케이블을 사용할 수 있어서 좋다.

크기도 작고 활용도가 높아 앞으로 많이 사용하게 될 것 같다.

알리익스프레스에서 구입했고, 가격은 $3.09

 

 

▲ 연결은 간단하다.

MLX90614 온도센서 모듈의 GND와 VIN(VCC)를 보드의 GND와 3.3V(또는 5V)에 연결해준다.

I2C통신을 하므로, 센서 모듈의 SCL과 SDA는 각각 보드의 A5, A4에 연결해준다.

 

 

3. 라이브러리 설치하기

 

MLX90614 온도센서 사용을 위해 라이브러리를 설치한다.

https://github.com/adafruit/Adafruit-MLX90614-Library

에서 라이브러리를 다운로드 받을 수 있다.

 

▲ ZIP 파일을 다운로드하고

 

▲ 아두이노IDE 프로그램을 열고

다운로드받은 ZIP 라이브러리를 추가한다.

 

▲ 라이브러리가 포함된 걸 확인할 수 있다.

 

 

4. MLX90614 작동 확인을 위한 예제 실행하기

 

▲ 라이브러리를 설치하고 나면 아두이노IDE에서 mlxtest 예제를 찾을 수 있다.

mlxtest 예제를 열고 컴퓨터에 연결된 나노호환보드에 업로드한다.

 

▲ 업로드 후 시리얼모니터를 열면 온도가 표시된다.

온도센서가 내 손을 향하게 하니 Object 온도가 34도 정도로 표시되었다.

실제 온도보다는 조금 낮게 나타나는 것 같다.

 

▲ 업로드 시 에러가 발생했는데,

툴에서 보드와 포트를 확인하고 케이블도 뺐다 끼우니 정상적으로 업로드가 되었다.

 

아두이노IDE 1.8.7버전에서는 아두이노 나노 보드의 경우

프로세서를 선택하는 메뉴가 있는데

업로드 에러시 ATmega328P(Old Bootloader)로 바꾸어주면 된다는 어느 블로그 글을 보았다.

 

▲ 업로드 에러 발생시에는 먼저 보드, 프로세서, 포트를 다시 한번 확인해보길~

 

5. OLED 연결하기

 

▲ 디스플레이에 온도만 표시하면 되니

예전에 사두었던 0.91인치 OLED 디스플레이 모듈을 사용하기로 했다.

전에 사용했던 0.96인치 OLED 모듈과 마찬가지로

I2C 통신을 하는 모듈(128x32 I2C SSD1306)로

사용법도 거의 같고 같은 라이브러리를 이용하면 된다.

역시 알리익스프레스에서 구입했고, 가격은 $2.21

 

▲ I2C 통신을 하는 관계로 MLX90614와 같이

GND-GND, VCC-3.3V(또는 5V), SCL-A5, SDA-A4 로 센서와 보드를 연결한다.

 

 

▲ 전체 연결 그림

 

 

6. OLED에 온도 표시하기 1

- Adafruit SSD1306 라이브러리 사용

 

http://www.arduinoprojects.net/lcd-projects/mlx90614-and-oled-display-example.php

사이트의 소스코드를 사용해보았다.

 


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <stdint.h>
#include <Adafruit_MLX90614.h>
 
#define OLED_RESET 4
 
Adafruit_SSD1306 display(OLED_RESET);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
 
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
 
void setup()  
{               
//  Serial.begin(57600);
  Serial.println("Adafruit MLX90614 test"); 
  mlx.begin(); 
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
}
 
 
void loop()
{
    // Clear the buffer.
  display.clearDisplay();
 
  // text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("Ambient: ");
  display.print(mlx.readAmbientTempC());
  display.print(" c");
  display.setCursor(0,10);
  display.print("Object: ");
  display.print(mlx.readObjectTempC());
  display.print(" c");
  display.display();
  delay(2000);
 
}

 

▲ 이 소스코드를 이용하려면

앞에서 설치한 Adafruit-MLX90614 라이브러리 이외에도

Adafruit_SSD1306 라이브러리와 Adafruit_GFX 라이브러리가 설치되어 있어야 한다.

 

나는 이전에 0.96인치 OLED를 사용하면서 설치했기때문에 이 과정은 패스~

만약 설치되어 있지 않다면

http://makerk.com/12 로 들어가

"방법1. Adafruit SSD1306 라이브러리 사용"

1-1> Adafruit SSD1306 라이브러리 설치하기

내용을 참고로 라이브러리를 설치하기 바란다.

 

▲ 위의 소스 코드를 보드에 업로드하니

온도가 OLED 디스플레이에 정상적으로 표시된다.

Ambient 는 주변온도를, Object는 센서가 향하는 방향의 사물온도를 보여주는 듯한데

이 온도계 용도는 사물온도만 보여주면 되어서

Object 온도만 디스플레이에 표시되도록 수정했다.

 


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <stdint.h>
#include <Adafruit_MLX90614.h>
 
#define OLED_RESET 4
 
Adafruit_SSD1306 display(OLED_RESET);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
 
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
 
void setup()  
{               
  Serial.begin(57600);
  Serial.println("Adafruit MLX90614 test"); 
  mlx.begin(); 
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
}
 
 
void loop()
{
    // Clear the buffer.
  display.clearDisplay();
 
  // text display tests
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setCursor(0,5);
  display.print(mlx.readObjectTempC());
  display.print(" C");
  display.display();
  delay(2000);
 
}

 

▲ 센서가 향하는 방향의 사물온도를 보여주는 코드를 업로드했다.

 

▲ 글씨 크기를 3으로 했더니 숫자가 이쁘게 보이진 않는다.

 

 

7. OLED에 온도 표시하기 2

- U8glib 라이브러리 사용

 

글씨 폰트를 바꾸고 특수문자도 넣기 위해 U8glib 라이브러리를 사용해보기로 했다.

이 라이브러리 역시 이전에 0.96인치 OLED 디스플레이를 사용하면서 설치했기에

추가로 설치할 필요가 없지만

혹시나 이 라이브러리가 설치되어 있지 않다면

http://makerk.com/13  로 들어가서

"방법2. U8glib 라이브러리 사용"

2-1> U8glib 라이브러리 설치하기

를 참고하기 바란다.

 

① 내가 사용하는 OLED 확인하기

U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); 

부분은 내가 사용한 OLED를 나타내는데,

다른 OLED 디스플레이를 사용하고자 한다면

아래의 내용을 참고하면 된다.

 

 

 

▲ 아두이노IDE 프로그램을 열고

예제 → U8glib → HelloWorld 를 연다.

연결할 OLED에 해당하는 코드를 복사하고

 

▲ 업로드할 소스에 복사한 부분을 주석을 빼고 삽입한다.

 

② 폰트 결정하기

 

▲ 폰트 모양을 정하고 특수문자를 삽입해주었다.

 

폰트 변경과 특수문자 삽입에 대한 내용은

http://makerk.com/13 의 2-5> 폰트 모양, 크기 바꾸고 특수문자 삽입하기

에서 확인할 수 있다.

 

 위 과정을 거쳐 만들어진 최종소스는 다음과 같다.

 

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

 

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

 

U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI //0.91인치 128x32 OLED


void setup() {
  mlx.begin(); 
}

void loop() {
  u8g.firstPage(); 
  do {
    u8g.setFont(u8g_font_fub17);
    u8g.setPrintPos(15, 25);
    u8g.print(mlx.readObjectTempC());
    u8g.print(" \xb0""C"); //온도기호삽입
 //   delay(500);
}
 while( u8g.nextPage() );
}

 

 

delay 값을 주니 온도가 매끄럽게 표시되지 않아서

delay(500); 부분을 주석처리했더니 실시간으로 온도가 표시되었다.

필요하다면 delay 시간을 주는 것도 괜찮은 것 같다.

 

▲ 소스코드를 보드에 업로드해 주니 온도가 잘 표시된다.

 

▲ 집에 있던 두꺼운 종이를 이용해서 임시로 케이스를 만들어주었다.

휴대용 보조배터리로 전원을 공급해주었는데 잘 동작한다.

 

▲ 뜨거운 물이 담긴 컵 온도를 측정하니 55.91도로 표시된다.

P.S

앞에서도 밝혔듯이 납땜할 때 사용하는 인두기 온도 측정을 위해

이 비접촉 적외선 온도계를 만들었다.

그래서 직접 사용해봤는데...

인두기의 문제인지, 온도계의 문제인지, 내가 찾은 적정 인두기 팁의 온도가 잘못된 정보인건지

무려 1시간을 기다려 300도까지 겨우 올라가는 인두기 온도를 확인하고

다시 그냥 적당히 감으로 납땜을 해야했다.

 

정보를 찾다보니 많은 분들이 비접촉 온도계를 요리할 때 사용한다고 한다.

튀김온도를 재는 용도로 유용하다고 하니

나도 앞으로 요리에 사용해봐야겠다.

 

Comments