반응형

【 아두이노 센서#16】 TC74 센서 74HC595 with I2C LCD



 지난 시간 TC74 센서의 온도 값을 LED 레벨미터로 구현해 보았다. (TC74 센서 & 74HC595 응용회로 실습 강좌 보기)  


 이번 시간은 바로 지난시간 구현해 놓은 LED레벨미터 회로에 I2C 방식의 LCD를 장착하여 온도표시도 같이 구현해보려 한다.  


▶ 선수 학습 :

  1. 시프트 레지스터 실습  강좌보기클릭☜

  2. TC74온도 센서 활용하기1  강좌보기클릭☜

  3. 지난 강좌 회로 사용    강좌보기클릭☜


▶ 실습에 사용되는 부품 자료 ( TC74  & 74HC595 ) 


《 TC 74 핀 배열 》





《 74HC595 IC 핀배열》



▶ 실습 목표 :  


1. TC74 센서의 온도 값을 8bit 레벨값(LED)으로 표시할 수 있다. 


2. 측정되는 온도 값을 I2C LCD에도 표시 할 수 있다. 


3. 다수개의 I2C 통신 부품을 이용해보는 경험을 해 볼 수 있다.



▶ 실습 회로도면 :

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







▶ 실습 절차  : 

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

2. 위에 있는 것과 같은 작은 브레드보드를 사용할 경우, 부품 배치 할 공간이 협소할 수 있으니 공간을 미리 잘 확인할 필요 있다.

3.LSB(하위비트)와 MSB(상위비트) 위치를 확인하며 조립한다. 

4.다수의 선을 연결 할 때 헷갈리지 않도록 색으로 구분 해놓았으니 참조해서 조립한다. 
5.다수의 I2C 통신 기기를 연결할 때 SDA 단자는 모두 아두이노의 A4 포트에 연결하고, SCL 단자는 모두 아두이노의 A5단자에 공통으로 연결하면 된다.  이때 각각 고유의 콘트롤 가능한 주소를 가지고 있기 때문에 전혀 문제 되지 않는다)


▶ 프로그램 코드 및 설명 : 


/*  l2C 온도 센서 값을 읽어 LED 막대 그래프와 LCD로 표시 하기  */

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

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0x27, 16,2);

const int SER=8;

const int LATCH=9;    // LATCH 핀과 LATCH 상수 정의

const int CLK=10;       // Clock 핀과 CLK 상수 정의

int temp_address=72;   // 제조회사 제공 고정 값

int vals[8]={1,3,7,15,31,63,127,255};//레벨메터로 표시할 LED 배열

byte SpecialChar0[8] = {    

  B00010,  

  B00101,

  B00101,

  B00010,

  B00000,

  B00000,

  B00000,

  B00000   };


void setup()  {

 Serial.begin(9600);      lcd.begin();      lcd.clear();

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

 pinMode(SER, OUTPUT);

 pinMode(LATCH, OUTPUT);

 pinMode(CLK, OUTPUT); 

 lcd.createChar(0,SpecialChar0);    //   lcd.print(char(223));

}

void loop ( ) {

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

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

 Wire.endTransmission();  // 전송 완료(0값 전송 종료)

 Wire.requestFrom(temp_address, 1);    // 1바이트 값을 읽음

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

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

 int f=round(c*9.0/5.0 +32.0);

 int graph=map(c, 24, 31, 0,7);  // 온도값을 특정범위로 맵핑시킴

 graph=constrain(graph,0,7);    // 온도값의 범위를 특정함

 digitalWrite(LATCH, LOW);      // LATCHLOW 입력

 shiftOut(SER, CLK, MSBFIRST, vals[graph]);    // 데이터 전송

 digitalWrite(LATCH, HIGH);        // LATCHHIGH 입력

 lcd.setCursor(0,0); 

 lcd.print("tc74 Sensor& 595");

 lcd.setCursor(0,1);

 lcd.print("C:");

 lcd.print(c);

 lcd.write(0);

 lcd.print("C /");

 lcd.print(" F:");

 lcd.print(f);

 lcd.write(0);

 lcd.print("F ");

 Serial.print(c);

 Serial.print("C, ");

 Serial.print(f);

 Serial.println("F. "); 

 delay(500);

}



1. 온도가 올라갈수록 LED 레벨이 높아지도록 프로그래밍 한다.


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

4. LED 레벨미터는 각 비트의 LED만 켜면 되기 때문에 각 비트에 해당하는 값만 미리 배열로 선언해두어 출력하면 간단히 구현할 수 있다.
( "int vals[8]={1,3,7,15,31,63,127,255};  " ) 

5. 주변 온도 환경에 맞추어 레벨미터 값을 8개의 LED 레벨값으로 맵핑한다. ( int graph=map(c, 24, 31, 0,7);  즉, 24도~31도의 온도값을 0~7, 8개의 LED로 치환시킨다(맵핑)  )

6. 온도 표시 문자(‘º’)를 사용자 정의 문자로 표시하는 대신,

 아스키 코드값에 있는 유사한 표시로 대체 하면 코드가 훨씬 간단해 진다. " lcd.print(char(223));"


▶ 실행 결과 :

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





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

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

반응형