반응형

 【 아두이노 센서#7】 I2C LCD로 TMP36 온도센서값 출력하기 #3

 지난 시간에 tmp36 온도센서의 값을 일반 LCD에 표시(☜클릭) 하는 실습을 하였고, 오늘은 I2C 통신이 가능한 LCD에 이 온도 값을 표시해보고자 한다.




▶ 실험에 사용되는 온도센서 자료 ( TMP36 ) 


아래는 온도 값과 출력전압과의 상관관계를 나타낸 그래프이다.

예를 들어 TMP36센서는 주변 온도가 50도씨 일때 출력단자로 1.0V의 전압값을 출력한다는 뜻이다.


 그래프특성을 살펴보고 자신이 사용하고자 하는 환경에 맞는 센서를 사용하면 되며,  통상적으로 활용 온도 범위가 넓은 TMP36센서를 많이 사용한다. 


[ 실습에 사용될 RGB LED(3색LED) 구조 및 사양 ]


RGB LED 는 그림에서 보듯 3가지 색 LED가 한 몸체에 구성되어 있다고 이해하면 쉽다.

다만, 단자하나는 공통단자로 연결되어 있고, LED의 마이너스(-) 극이 공통단자로 되면 Common 케소드(음극),    플러스(+)극이 공통단자로 되면 Common 애노드(양극)이 된다. (통상적으로 부품의 다리 길이가 제일 긴 단자가 공통단자다)


따라서 부품을 사용하기전에 자신의 부품이 컴온 캐소드 타입인지? , 컴온 애노드 타입인지?  반드시 확인해야 하며, 단자의 색상 위치도 그림과 순서가 다를 수 있으니 멀티테스터기 혹은? 3V 정도의 낮은 전원을 가하여 색의 위치를 사전에 확인하면 좋을 것이다. 



▶ 실습 목표 :  


1. 온도 범위에 따라 LED의 색을 다르게 표시하라. 

[예, 수치 값이 165 이하는 블루색, 165~175는 그린색,  그 이상은 레드색]

2. 온도 값(섭씨)을 I2C LCD로 출력 하라. 


▶ 실습 회로도면 :

  (이미지 클릭하면 확대 가능)







▶ 실습 절차  : 

1. 안정적으로 사용하기 위해서는 LED 공통단자에 220Ω정도의 저항을 달아 준다.

2.LED 3개를 사용 하여 회로를 구성하여도 무방하며이때에도 각각 저항을 연결해주는 것이 좋다.


3. I2C 통신 모듈이 장착된 LCD를 사용하면 회로  연결이 매우 간편해 진다.- 1602(162) LCD의 경우 고유주소는 대개 ’0x27’이며 스캐닝 프로그램 이용해 확인 가능하다.



▶ 프로그램 코드 및 설명 : 


#include <Wire.h>                          // I2C 통신을 위한 헤더파일 추가

#include <LiquidCrystal_I2C.h> // I2C LCD 헤더파일 추가

LiquidCrystal_I2C lcd (0x27, 16,2); // 1602 LCD의 고유 주소 설정

const int RLED=9;    // 빨간색 LED 상수형변수에 아두이노 9번 핀 할당

const int GLED=10; // 녹색 LED 상수형변수에 아두이노 10핀 할당

const int BLED=11; //파란색 LED 상수형변수에 아두이노 11핀 할당

const int TEMP=0;     // 아날로그 입력 0(A0) 핀 선

const int LOWER_BOUND=160;      // 온도 하한 값을 정의 함

const int UPPER_BOUND=170;       // 온도 상한 값을 정의 함

int val=0;                      // 온도 센서의 현재 값을 저장하는 변수 선언

byte SpecialChar0[8] = {      // 온도 표시를 위한 특수 문자 배열

 B00010,

 B00101,

 B00101,

 B00010,

 B00000,

 B00000,

 B00000,

 B00000   };


void setup()   {

  Serial.begin(9600);

  pinMode(RLED, OUTPUT);        // RLED를 출력으로 지정

  pinMode(GLED, OUTPUT);        // GLED를 출력으로 지정

  pinMode(BLED, OUTPUT);       // BLED를 출력으로 지정

  Serial.begin(9600);

  pinMode(RLED, OUTPUT);        // RLED를 출력으로 지정

  pinMode(GLED, OUTPUT);        // GLED를 출력으로 지정

  pinMode(BLED, OUTPUT);        // BLED를 출력으로 지정

  lcd.begin();               // LiquidCrystal_I2C.h 에서 lcd.begin(16,2)’                                 

                                       //  지정하면 에러 발생함, ‘()’ 안을 비워 둘 것

  lcd.clear();

  lcd.createChar(1,SpecialChar1);      

}

 

void loop()   {

  val=analogRead(TEMP); 

  Serial.println(val);

  float mVoltage = val*5000.0/1024.0;

  float TempDotC = (mVoltage - 500) / 10.0;

  Serial.print(TempDotC);

  Serial.println("℃\n");

  lcd.setCursor(0,0); 

  lcd.print("Tmp36 Sensor !");

  lcd.setCursor(0,1);

  lcd.print("Temp:");

  lcd.print(TempDotC);

  lcd.write(0);

  lcd.print("C"); 

  delay(500);

  if(val < LOWER_BOUND) {             // 경계 값 비교

    digitalWrite(RLED,LOW);

    digitalWrite(GLED,LOW);

    digitalWrite(BLED, HIGH);      //  켜려고 하는 LED HIGH 값 지정

  }

  else if (val>UPPER_BOUND) {//상위 경계선값 이상이면 Red LED ON

    digitalWrite(RLED,HIGH);

    digitalWrite(GLED, LOW); 

    digitalWrite(BLED, LOW);    

  }

  else {                                               // 경계선 사이 값이라면 Green LED On

    digitalWrite(RLED, LOW);

    digitalWrite(GLED, HIGH);  

    digitalWrite(BLED, LOW);    

  }

}   



▶ 프로그램 코드 다운로드 :

TEMP_sensor_LCD_I2C.zip


 



1.  TMP 36 온도 센서를 이용해서 온도값에 따른 RGB LED의 색을 다르게출력 해보는 실습이다.
2.  Common Anode 타입의 RGB LED는 공통단자를 V+ 연결 하기 때문에 LED를 On 하기 위해서는 입력단자 LOW신호가 들어가야 한다.

3.  온도 변화에 따른 LED 색을 다르게 표시하기 위해  TMP36의 출력 값을 측정하여 경계값을 설정한다
  예165  이하면  블루 LED ON’     
  175 
값 이상이면  레드 LED ON’ 
  165~175 
사이 값이면  그린 LED ON’

4.   정상 동작이 되면 온도 변환 공식을 이용하여 섭씨온도로 변환하여 시리얼 모니터를 통해 화면에 표시하는 프로그램을 다음 과제로 진행해 해보고자 한.


※위의 섭씨온도식에서 




▶ 실행 결과 :

 (영상은 고화질로 설정하고 전체화면으로 보세요)





【 LCD관련 에러나 동작이 안 될 때 】

 LCD관련한 라이브러리 에러나 코드 에러에 대한 안내를 드립니다.  

 크게 아래와 같은 두 가지 형태를 보이는데요, 


▶ 1. 코드를 실행하기전 LiquidCrystal_I2C.h: No such file or directory 에러라고 뜨는 경우!


 이때는 LCD 헤더파일이 설치가 되어 있지 않았을 경우입니다.  아예 관련 라이브러리(해더 파일)가 설치 되지 않은 경우입니다. 

해결법은 바로 아래에 첨부한 라이브러리를 다운받아 압축을 풀지 말고 라이브러리 관리 메뉴에서  .zip 라이브러리 추가 메뉴를 이용해서 추가해주세요.

경로 :  아두이노IDE >  스케치 》 라이브러리 포함하기  .zip 라이브러리 추가...  "다운받은 라이브러리파일 선택"


▶ 2. 또 한가지 LCD관련 에러는 ,  no matching function for call to ‘LiquidCrystal_I2C::begin();   라고 뜨는 경우!

 라이브러리 파일도 똑같은 이름이지만, 제공자에 따라 내부코드가 다른 라이브러리인 경우가 종종 있어요.  그래서 만약 제가 실험에서 사용한 라이브러리가 아닌,  같은 이름이지만 다른 라이브러리를 사용할 경우 위와 같은 에러 표시를 낼 수 있습니다.    라이브러리는 분명 설치되어 있지만 그래서 프로그램이 인지는 하는데, 코드에서 사용한 함수 적용이 되지 않을 때 이런 에러를 띄우게 됩니다.    그럼, 해결책은 실험에 사용한(적용한) 그 라이브러리를 다시 설치해 주어야 하는데요,   이 때 중요한 것은 아두이노에서는 똑 같은 이름의 라이브러리가 두 개 설치될 경우 또다른 중복에러를 띄우게 됩니다.   그러니 잘 못 설치된 라이브러리는 찾아서 반드시 삭제하거나,  다른이름으로 임시 변경해 놓거나,  나중에 다른 프로그램에서 사용해야 할 경우를 대비해서 압축해 놓고 원본은 지워 놓으면 됩니다. 


 그럼 기존 라이브러리를 찾아서 삭제를 하거나 하려면 설치된 라이브러리를 찾아야 겠죠? 

찾는 위치는 보통 아래 두 곳입니다.  (윈도우10 기준이며, 윈도우7도 비슷한 위치) 


두 곳으로 나뉘어 설치되는 이유는 아두이노 IDE의 "라이브러리 관리 메니저" 창을 통해 검색으로 설치되는 기본위치가 있고(아두이노 설치된 경로),   '.zip 라이브러리' 추가로 설치되는 위치가(도큐멘트 문서 저장영역-Doucuments) 따로 있어서 그렇습니다. 


< .zip 라이브러리 추가 메뉴에서 추가한 라이브러리 설치 위치 >

 1. C:\Users\유저-이름\Documents\Arduino\libraries    


 <라이브러리 관리 메뉴창에서 라이브러리 직접 검색으로 설치된 라이브러리 위치 >

 2. C:\Program Files (x86)\Arduino\libraries


위 두 곳에서 찾아서 삭제를 하세요.   (그냥, 폴더 째로 삭제하면 됩니다.)

 그리고 아래 첨부하는 라이브러리를 다운받아  압축파일 그대로 .zip 라이브러리 추가 메뉴로 추가해 주세요. 

만약, 압축파일 그대로 추가할 때 에러가 난다면,  앞축을 풀고  xxxxx.h 가 있는 폴더만 "C:\Users\유저-이름\Documents\Arduino\libraries" 경로에 붙여넣기 하면 됩니다.    이때 아두이노 스케치 IDE는 모두 닫고 재실행 해야 적용 됩니다.


 본 예제에서 사용한 라이브러리 다운로드 받기 :

Arduino-LiquidCrystal-I2C-library-master.zip




  ※ 중요! : 여기에서 제시된 코드로 작성할 경우 반드이 이 라이브러리로 설치하셔야 합니다.   만약, 여러분의 PC에 똑 같은 이름의 라이브러리가 있을 경우 반드시 삭제를 하거나 압축해서 백업을 해 놓으면 충돌이 일어나지 않습니다.!!!

반응형