반응형

【 아두이노 센서#14】 TC74 온도센서값 RGB LCD로 출력하기 



 이번 시간은 I2C 통신 방식을 이용하는 TC74 온도 센서와 I2C 방식의 LCD를 동시에 다루어 볼 것이다. 온도 값을 상중하 영역으로 나누어 각 구간에 따라 LED 색을 다르게 출력 해 보려 한다. (예, 낮은 온도구간은 블루, 중간의 최적 온도 구간은 그린, 고온 구간은 레드)  I2C 통신 방식의 부품을 사용하면, 적은 통신선으로 제어가 가능하기 때문에, 아두이노 포트에도 여유가 있게 되어 다수개의 I2C 통신 장치들을 연결하여 컨트롤 하는 것에도 전혀 문제가 없는 장점이 있다.


▶ 실습에 사용되는 온도센서 자료 ( TC74 ) 


《 DIP 타입 


《 SMD 타입 




[ TC74 상세 스팩 ]




[ TC74 고유 주소 파악하기 ]



위 제조사에서 제공하는 스팩을 보면 " Address Options : " 이라는 것이 있다. 

만약 구입한 온도센서 모델이 아래 이미지 처럼 " TC74A0 " 라고 되어 있을 경우,

" A0 = 1001 000 "  이라고 되어 있는데,  이를 2진수 값으로 생각하고( 1001000 ),   

10진 값으로 계산 해보면 ,

  =  1x 2^6 + 1x 2^3   

  = 1 x 64  + 1 x 8

  = 72     가 된다.


즉 10진값 '72' 가 이 센서의 고유 주소가 된다. 

16진 값으로는 0x48 이 된다.     이주소를 기억했다가 프로그래밍의 해당부분에 입력하면 된다. 




--------------------------------------------------


만약 구입한 온도센서 모델이 아래 이미지 처럼 " TC74A5 " 라고 되어 있을 경우,

위의 상세 스팩을 참고하면 " A5 = 1001 101 "  이라고 되어 있는데,  이를 2진 값으로 생각하고( 1001101 ),   

10진 값으로 계산 해보면 ,

  =  (1 x 2^6) + (1 x 2^3) + (1 x 2^2)  +  (1 x 2^0)   

  = 1 x 64  + 1 x 8 + 1 x 4 + 1 x 1

  = 77  이 된다.


즉 10진값 '77'  혹은 16진값으로 0x4D가 이 센서의 고유 주소가 된다. 







I2C 통신을 위해서는 SDA핀과 SCL(SCLK)핀에 풀업 저항을 달아서 연결해야 통신이 제대로 이루어 진다.   (풀업 저항 값으로는 4.7K가 적당하며,  여의치 않을 경우 1K~10KΩ 사이의 저항값 사용가능)


※ 지난 시간 학습한 I2C 스캐너 프로그램 (설명)을 통하여도 주소값을 확인 해낼 수 있다. 

[ I2C 스캐너 프로그램 ]

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


( ※ 주의: RGB LED의 순서가 제조사별로 다를 수 있으니 멀티테스터 혹은 3V 이하의 낮은 전압을 살짝 연결하여 확인하는 것이 필요하다 )

 

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

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


따라서 부품을 사용하기전에 자신의 부품이 공통단자가 캐소드(음극) 타입인지? ,  애노드(양극) 타입인지?  반드시 확인해야 하여야 한다. 그렇지 않으면 +, - 방향이 반대가 되어 LED가 켜지지 않게 된다.   단자의 색상 위치도 그림과 순서가 다를 수 있으니 멀티테스터기 혹은? 3V 정도의 낮은 전원을 가하여 색의 위치를 사전에 확인하면 좋을 것이다. 



▶ 실습 목표 :  


1. TC74 센서의 온도 값을 I2C LCD로 출력해 보자.


2. I2C LCD 사용에 익숙에 익숙하도록 컨트롤 해본다.


3. 여러개의 I2C 통신을 사용한 모듈을 제어 해 볼 수 있다. 


▶ 실습 회로도면 :

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





[ 회로 연결 정보 ]


※ 일반적으로 TC74 를 구입할 때 주소를 구분해서 구매할 필요는 없으나, 

하나의 시스템에서 여러개의 온도센서를 가지고 활용하려 할 때는 고유주소가 다른 센서를 사용해야 각각의 제어가 가능하니 참조하길 바란다. 




▶ 실습 절차  : 

1. 위 회로를 보고 각 부품과 보드를 연결한다. 

2. L기본적으로 I2C 통신을 위한 PIN(SDA, SCL)에는 풀업 저항을 달아 주어야 통신이 잘 이루어 진다.  

3.연결이 완성되면 프로그램을 아두이노 보드에 로딩시키고 시리얼 모니터 창을 열어 출력값을 확인 해본다. 

4.온도 구간을 설정 할 때 현재의 주변 환경에 따라, 저온 < 중온 < 고온 구간을 설정해본다. 다만, 정상 작동 확인을 위해 쉽게 변화를 감지할 수 있는 영역으로 좁게 설정해서 테스트 해보고, 잘 되면 희망 설정 값으로 바꾸어 놓으면 좋을 것이다. 



▶ 프로그램 코드 및 설명 : 


#include <Wire.h>                          // I2C 라이브러리 삽입

#include <LiquidCrystal_I2C.h> // I2C LCD 라이브러리 삽입

LiquidCrystal_I2C lcd (0x27, 16,2);

int tempAddress=72;               // TC74 센서의 고유 주소 값(10진 값)

const int LOWER_BOUND=26;  //온도 하한 값 정의

const int UPPER_BOUND=30;    //온도 상한 값 정의

const int RLED =9; const int GLED =10; const int BLED =11;

byte SpecialChar0[8] = { 

B00010,  

B00101,  

B00101,  

B00010,

B00000,  

B00000,  

B00000,  

B00000   };


void setup()  {

  Serial.begin(9600);

  lcd.begin();

  lcd.clear();

  lcd.createChar(0,SpecialChar0);

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

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

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

  Wire.begin();                        // I2C Wire 객체 시작

void loop()  {

Wire.beginTransmission(tempAddress); // I2C 센서와 통신 개시

Wire.write(0); //I2C 센서의 0번 레지스터를 읽겠다는 쓰기모드 명령

Wire.endTransmission();

Wire.requestFrom(tempAddress, 1); // I2C센서에서 1바이트값 읽음

while(Wire.available()==0);    // 응답이 올 때까지 대기

int TempC = Wire.read();            // 온도(섭씨)를 읽어 변수에 저장

int TempF = round(TempC * 9.0 / 5.0 + 32.0);   // 섭씨를 화씨로

Serial.print(TempC);

Serial.print("C  /  ");

Serial.print(TempF);

Serial.println("F");       

delay(500);

lcd.setCursor(0,0); 

lcd.print("tc74 I2C Sensor!");

lcd.setCursor(0,1);

lcd.print("C:");

lcd.print(TempC);

lcd.write(0);

lcd.print("C /");

lcd.print(" F:");

lcd.print(TempF);

lcd.write(0);     

lcd.print("F ");

if(TempC < LOWER_BOUND) {  //하위 경계선 값 이하이면 BlueLED ON  

    digitalWrite(RLED,LOW);

    digitalWrite(GLED,LOW);

    digitalWrite(BLED,HIGH);   }

  else if (TempC > UPPER_BOUND){ //상위 경계선 값 이하 RedLED ON

    digitalWrite(RLED,HIGH);

    digitalWrite(GLED,LOW);

    digitalWrite(BLED,LOW);     }

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

    digitalWrite(RLED,LOW);

    digitalWrite(GLED,HIGH);

    digitalWrite(BLED,LOW);       

}



1. I2C온도 센서를 이용하기 위해서는 <Wire.h> 파일을 선언해야 한다. 만약 헤더파일이 없을 경우 라이브러리 관리창에서 검색하여 추가해 준다.
2. 본인이 가지고 있는 온도 센서의 라벨을 확인하여 고유주소를 정확하게 적어 놓는다. 
 만약 센서가 "TC74A0" 일 경우 int temp_address = 72; 라고 적는다. 

3. TC74 온도 센서는 기본적으로 섭씨 온도값을 출력 하므로 화씨 온도값을 출력하고자 한다면, 썹씨를 화씨로 변환하는 공식을 사용하면 쉽게 출력 할 수 있다. 

4.  I2C통신용 모듈은 모두 아두이노의 A4,A5 포트를 이용해야 하고, 장치가 여러개일 경우에도 함께 연결 하면 정상 작동 시킬 수 있다.


※ 섭씨온도를 화씨온도로 변환 하는 식  [  (섭씨 x 9.0) / 5.0 + 32.0  ] 



▶ 실행 결과 :

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




▶ 아두이노 파일(다운) :

TC74_temp_to_LCD.ino


I2C 스캐너 프로그램 :  

I2Cscaner.ino




【 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에 똑 같은 이름의 라이브러리가 있을 경우 반드시 삭제를 하거나 압축해서 백업을 해 놓으면 충돌이 일어나지 않습니다.!!!


반응형