본문 바로가기

프로젝트/TFT LCD 한글 출력 (아두이노)

StreamReader.H SD카드 텍스트파일 라인읽기

메소드
StreamReader(  텍스트 파일 이름)   SS핀은 10으로 자동 설정  Uno      자동 파일 open
StreamReader(  텍스트 파일 이름 , SS핀 번호)  Mega는 53   Uno는 10                    자동 파일 open 
ReadLine() 한줄씩 파일을 읽어 온다
ReadLine(  n )  n번쩨 줄로 이동하여 읽어 온다. ( 처음 줄 번호는  0임)
open() close()후 다시 파일 사용시    첫라인부터 다시 시작
close() 파일을 닫음
endf() 파일의 끝이면   true 아니면 false
StreamReader.H 
 
#ifndef _StreamReader_
#define _StreamReader_
#include <SPI.h>              
#include <SD.h>

class  StreamReader
{
    private :     File      _f;                
                  String    _fname="";  
                 
    public  :     StreamReader( String fname, int pin)
                  {  
                     SD.begin(pin);
                     _fname = fname ;                        
                     _f=SD.open(_fname);                                      
                  }
                 StreamReader( String fname )
                  {  
                     SD.begin(10);
                     _fname = fname ;                    
                     _f=SD.open(_fname);                                    
                  }                  

           String readLine();
           String readLine( int idx )
                  {  
                     _f.seek(0);
                     for( int i=0; i< idx;i++) readLine();
                     return ( readLine());              
                  }
           void   open()  { _f=SD.open(_fname);         }
           bool   notEnd(){ return(  _f.available() ) ; }          
           void   close() {  _f.close();                }      
};

String StreamReader::readLine( )
{
        char buff[90];    
        int idx=0;
     
        while(StreamReader::_f.available())
        {
            byte b,b2;
               
                b=StreamReader::_f.read();                  
                if( b == 0x0d )
                {
                    b2= StreamReader:: _f.read();          
                    if( b2 == 0x0a )
                    {            
                       buff[idx]= 0;
                       return( String( buff ) );
                    }
                    buff[idx++] = b;
                    buff[idx++] = b2;
                }
                else buff[idx++] =b;        
        }    
        return("");
}
#endif

아두이노 소스를 보면 코드안에 문자열이 "myfont.utf" ,"my.txt"뿐이다.

그만큼 메모리 절약,   코드 안의 문자열은 메모리 많이 소모 ( 한글 1개는 3byte소모)한다.

프로그램이 메모리 부족으로 업로드가 안되는 경우와                                                             실행중  다운시  해결 해 주는 Class

아두이노 소스
  #define   _TFTLCD_      myLcd              // TFT LCD 이름 정의/          
#include  "D:\\myHeader\\StreamReader.H"        
#include  "D:\\myHeader\\Hangul_SD_Selected.H"    
                                    
HanGul_TFT  ht("myfont.utf");     // 아두이노 한글 폰트 Code 자동생성 프로그램 ver 2.5   추출한 폰트
                                                           파일 이름 넘겨준다.


void setup()
{
  int y=0;     
       
  StreamReader txt("my.txt");     //  사용할 텍스트 파일 이름을 넘겨 준다.
                            
  myLcd.InitLCD();            
  myLcd.setRotation(3);   //3 가로 480x320  //2 세로   320x480
  myLcd.clrScr();      
   
   
   while( ! txt.endf()) // 파일의 끝이 아니면 계속
   {     
     ht.print( txt.readLine() ,0,y,1,2);     // 1개의 라인을 읽어와 String으로 반환 한다.
   
     y=y+32;
     if(y>300 ){
        y=0;    
        myLcd.clrScr();      
     }
  }

   ht.print( txt.readLine( 30 ) ,0,300 );     //  30번 라인을 읽어 온다 ( 처음줄은 0이므로    31번째 줄임 )
  txt.close();     //   파일을  닫는다.
  ht.end();
}

void loop()
{
 
}