아두이노 프로젝트 1. 비접촉 온도계
개요
비접촉 온도계
측정 대상 물체 상단에 조금 이격된 상태로 비치해 원거리에서 온도를 확인할 수 있는 온도계를 제작합니다.
고려사항
- LCD를 활용해 관찰자들이 가까이 가지 않더라도 온도를 확인할 수 있도록 되도록 크게 온도를 표시합니다.
- 환경에 따른 오차를 최소화하기 위해 온도값 보정 버튼(단계별 3%)을 추가합니다.
- 전원을 끄고 켜기 위한 스위치를 적용합니다.
- 전원을 끄고 다시 켰을 때 이전에 설정했던 보정값이 보존되도록 설정합니다.
아이디어 스케치
사용 하드웨어
- 아두이노 나노
- 미니 브레드보드 (170홀)
- 아두이노 그래픽 LCD (128x64)
- GY-906 MLX90614 비접촉 온도 센서
- 로커 스위치 (전원)
- 아두이노 푸쉬 버튼 (측정값 보정)
- 점퍼 케이블
회로 구성
기능 구현
#include <U8glib.h>
#include <Adafruit_MLX90614.h>
U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 , 7); //Enable, RW, RS, RESET
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
#define upsw 8
#define dwsw 9
bool relay_upsw = false;
bool relay_dwsw = false;
int calival = 0; # 수정 변수
char cali[5];
char temperature[5];
void setup()
{
Serial.begin(9600);
pinMode(upsw, INPUT_PULLUP);
pinMode(dwsw, INPUT_PULLUP);
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
u8g.setColorIndex(255); // white
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
u8g.setColorIndex(3); // max intensity
else if ( u8g.getMode() == U8G_MODE_BW )
u8g.setColorIndex(1); // pixel on
mlx.begin();
}
void loop()
{
for (int i = 0; i<=30; i++){
MLX();
Calibrate();
}
delay(500);
for (int j = 0; j<=2; j++) {
lcdprint();
delay(1000);
lcdclear();
delay(200);
}
lcdprint();
delay(500);
}
void lcdclear() {
u8g.firstPage();
do {
u8g.setFont(u8g_font_unifont);
u8g.drawStr(5, 40, " ");
}
while(u8g.nextPage());
delay(10);
}
void lcdprint() {
u8g.firstPage();
do {
u8g.setFont(u8g_font_fub42n);
u8g.drawStr(5, 53, temperature);
u8g.setFont(u8g_font_6x10);
u8g.drawStr(109, 9, cali);
}
while(u8g.nextPage());
delay(10);
}
void MLX() {
float t = mlx.readObjectTempC() * (1 + 0.03 * calival);
if (t >= 1000) {
t = 999;
}
else {
if (t >= 100)
dtostrf(t, 3, 0, temperature);
else
dtostrf(t, 3, 1, temperature);
}
lcdprint();
}
void Calibrate() {
dtostrf(calival, 3, 0, cali);
if(!relay_upsw){
if(!digitalRead(upsw)){
relay_upsw=true;
}
}else{
if(digitalRead(upsw)){
relay_upsw = false;
bool relay_upush = relay_upsw^1;
if(relay_upush)
calival ++;
}
}
if(!relay_dwsw){
if(!digitalRead(dwsw)){
relay_dwsw = true;
}
}else{
if(digitalRead(dwsw)){
relay_dwsw = false;
bool relay_dpush = relay_dwsw^1;
if(relay_dpush)
calival --;
}
}
}
GY-906 비접촉 온도 센서(MLX-90614) & 그래픽 LCD
MLX90614 모듈 사용을 위해 <Adafruit_MLX90614.h> 라이브러리, 그래픽 LCD 사용을 위해 <U8glib.h> 라이브러리를 사용했습니다.
라이브러리 다운로드 및 사용 방법은 아두이노 라이브러리 문서를 확인해주세요.
GY-906 비접촉 온도 센서(MLX-90614)는 물체에서 방사되는 적외선을 측정하여 온도로 계산합니다.
측정 물체 재질, 환경, 거리에 따라 적외선 방사율이 달라지기 때문에 보정이 필요할 수 있습니다.
특히 거리의 경우 2cm 이상 시점부터는 오차 범위가 커지는 것을 체온 테스트로 확인했습니다.
본문에서는 30번 측정 후 1초 간격으로 마지막으로 측정된 온도가 그래픽 LCD에서 깜빡거리도록 설정했습니다.
측정값은 보정 단계별로 3%씩 증가하거나 감소하여 최종 결과값으로 표현됩니다.
측정값 보정 푸쉬 버튼
up, down 푸쉬버튼을 두고 측정값 보정 단계를 조절합니다.
푸쉬버튼에서 발생하는 채터링 현상을 방지하기 위한 코드를 Calibrate() 함수에 포함했습니다.
버튼을 누른 후 떨어지는 것까지 확인하여 이후 동작을 진행하는 원리입니다.
전원 스위치
해당 프로젝트 전원은 12V 어댑터를 연결하여 활용합니다.
전원 스위치 사용을 위해 어댑터의 GND와 아두이노의 GND를 연결하고, 어댑터의 VCC는 로커 스위치를 통해 아두이노에 연결되도록 했습니다.
결과
사진
Comment
아이디어 스케치와 비슷한 형태로 간단한 케이스를 MDF로 제작하여 테스트한 모습입니다.
초록색이 보정단계 up 버튼, 노란색은 보정단계 down 버튼, 빨간색은 전원 스위치입니다.
비접촉 온도 센서는 하단부에 동그랗게 구멍을 뚫어 외부에 노출되도록 했습니다.
추신
공집사의 아두이노 프로젝트 결과물은 판매되는 제품이 아니며, 프로젝트 수준에서 간단하게 진행되었습니다.
문의 및 의뢰는 크몽 공집사로 연락주시면 감사하겠습니다.