본문 바로가기

프로젝트/휴대폰을 디스플레이로 활용하기

그래픽 시연

사용 휴대폰 LG G3       

화면을 터치하면 메뉴 on / off

동여상 보기 클릭

아두이노 휴대폰을 디스플레이로 활용하기

아두이노 휴대폰을 디스플레이로 활용하기(2) 슬라이드 메뉴

Bluetooth Display 예제1

Bluetooth Display 예제2(조이스틱 사용)

Bluetooth Display 예제3  원테두리에 다른 작은원 그리기

TFT LCD 출력과 비교하기

아두이노 소스 
  #define _BT Serial                                          // 하드웨어 기본 시리얼을 블루투스로 사용
#include "D:\\myHeader\\Display.H"              //  디스플레이 코어 클래스( 디스플레이 앱과 통신 하는 곳 )
#define _APK_   apk파일로 앱을 휴대폰에 추가 한 경우
#ifdef  _APK_
  #define LoadImg;  hp.load("/storage/emulated/0/Android/data/appinventor.ai_구글ID.Display/files/radar.jpg");
#else
  #define LoadImg;  hp.load("/storage/emulated/0/Android/data/edu.mit.appinventor.aicompanion3/files/radar.jpg");
#endif

Display hp;       //  디스플레이 생성 (연결 블루투스 수만큼 생성 가능 - 다중 모니터 가능 )

int cx,cy;           //   화면 중앙의 좌표

void setup() 

  hp.begin();                     //   디스플레이 시작( 블루투스 시작)
  hp.waitDisplayStart();    // 디스플레이가 연결 될 때까지 기다림 
  hp.clear(); 

   cx=hp.width() /2;
   cy=hp.height() /2 ; 
  hp.load("");                //  clear()는 배경 이미지는 안 지워짐 ( 배경이미지는  load("")하면 없어짐 )
  hp.color(Silver);         //그리기 색 지정      4byte  Alpha R G B   ARGB_COLOR.H에 정의 되어 있음

  for(int r=180; r <360 ; r+=10)    hp.arc(0,0,200,200,r,10,true,false);
     
 hp.save("/radar.jpg");   
 hp.textAt(atCenter);
 hp.textSize(20);
 hp.text(cx,150,"현재화면이 radar.jpg로 저장됨...");
 hp.text(cx,180,"3초 후 다음으로 넘어감 ");
 for( int x=0; x<3 ; x++)
 { 
       hp.text(50+x*40,200,String(3-x)+" ");
       delay(1000);
 }
 
 hp.load("Display.png");  //앱에 내장 되어 있는 초기 화면 그림
 

 hp.color(MidnightBlue );
 hp.rec(cx-50,cy-30,cx+50,cy+30,true);
 
 hp.color(White);
 hp.textSize(28);
 hp.text(cx,cy,"아두이노");

 hp.color(Red); 
 for( int x=0; x< cx*2; x+=10)
 {
     if( x%20 )  hp.color(Red); 
     else hp.color(Blue);
     hp.line(x,0,cx,cy-30);
 }
 
 for( int y=0; y< cy*2; y+=10)
 {
  if( y%20 )  hp.color(Red); 
     else hp.color(Blue);
  hp.line(cx+50,cy,cx*2,y);
 }
 
 for( int x=cx*2; x>0; x-=10)
 {  
  if( x%20 )  hp.color(Red); 
     else hp.color(Blue);
  hp.line(x,cy*2,cx,cy+30);
 }
 
 for( int y=cy*2; y>0; y-=10)
 {   
  if( y%20 )  hp.color(Red); 
     else hp.color(Blue);
  hp.line(cx-50,cy,0,y);
 }  


} //end setup



void loop()
{
  LoadImg;
  
  hp.color(Red); 
  for(int r=180; r <350 ; r+=10)
  {
    hp.clear();   
    hp.arc(0,0,200,200,r,5,true,true);     
  }  

  for(int r=360; r >180 ; r-=10)
  {
    hp.clear();    
    hp.arc(0,0,200,200,r,5,true,true);    
  }  
   hp.color(Yellow);
   int y=50;
  for(int s=5; s< 50; s+=5)
      {
        hp.textSize( s );     
        hp.text(cx,y=y+s,"디스플레이 Arduino");
      }
      delay(1000);
}

  
 
조이스틱 예제
  #define  _BT  Serial
#include "D:\\myHeader\\Display.H"

Display hp;

bool sw=false;
int  x,y,bx,by,dx,dy;
long bc;

String toStr( int i)
{  
  if( i<10 )  return "  " + String(i);
  else if( i< 100) return " " + String(i);
  else return String(i);
}

void setup()
{
  pinMode( 2,INPUT_PULLUP);       // 조이스틱 클릭
  hp.begin();
  hp.waitDisplayStart(); 
  x=hp.width()/2;
  y=hp.height()/2;
  dx=x;
  dy=y;
  
  hp.load(""); 
  hp.textSize(10); 
  hp.color(Yellow);    
  hp.text(10,10,"X 좌표  : "); 
  hp.text(10,30,"Y 좌표  : ");   
  hp.color(Blue);
  hp.rec(60,0,80,10,true);
  hp.rec(60,20,80,30,true);
  hp.color(White);
  hp.text(60,10, toStr( x ) );  
  hp.text(60,30, toStr( y ) );  
}
 
 
void loop()
{
   int _x=analogRead(A1);      //조이스틱 x
   int _y=analogRead(A0);     // 조이스틱 y
  
   bool _sw= ! digitalRead(2);  // 풀업은  선택시 false 평상시 true
   
   if( _x >612 || _x <412)
   {    
      x+=(_x-512)/10;     //조이스틱 기울기가 클수록 많이 변화
      
      if( x< 0) x=0; 
      if( x>hp.width())x=hp.width();
     
      bc=hp.getPixel(x,y);  
      hp.color(Blue);
      hp.rec(60,0,80,10,true);
      hp.color(bc);
      hp.pixel(bx,by);
      hp.color(White);         
      hp.text(60,10, toStr( x ) );      
      hp.pixel(x,y);        
      bx=x;
      by=y;
   }

    if( _y >612 || _y <412)
   {    
       y+=(_y-512)/10;
      
      if( y< 0) y=0; 
      if( y>hp.height())y=hp.height();     
      bc=hp.getPixel(x,y);      
      hp.color(Blue);
      hp.rec(60,20,80,30,true);
      hp.color(bc);
      hp.pixel(bx,by);
      hp.color(White);         
      hp.text(60,30, toStr( y ) );      
      hp.pixel(x,y);        
      bx=x;
      by=y;      
   }


   if( _sw != sw )
   {
     hp.color(Green);
    //  if( sw ) hp.circle(x,y,10,true);     
    if( sw )
    {
      hp.line(x,y,dx,dy);  
      dx=x;
      dy=y;
    }
      
    sw=_sw;  
   }
}
원테두리에 작은 원 그리기
  #define  _BT  Serial
#include "D:\\myHeader\\Display.H"
#define _APK_
#ifdef  _APK_
  String path="/storage/emulated/0/Android/data/appinventor.ai_jhinyee.Display/files/";
#else
  String path="/storage/emulated/0/Android/data/edu.mit.appinventor.aicompanion3/files/";
#endif

Display hp;
int w,h,x=-130,d=1;

int ax( int _x )  //일반 좌표를 물리적인 디스플레이 좌표로 변환
{
  return  _x+w/2;
}

int ay( int _y)   //일반 좌표를 물리적인 디스플레이 좌표로 변환
{
  return h-(_y+h/2) ;
}
int r(int _x , int _r)  // X좌표와 거리로 Y좌표 구하기
{
  return   sqrt( _r*_r - _x*_x )   ;
}
void setup() 
{
  hp.begin();
  hp.waitDisplayStart(); 
  hp.clear();
  
  w=hp.width();
  h=hp.height();
   
  hp.textSize(20);
  hp.color(White);
  hp.text(0,20,"화면 중앙을 0,0 좌표로 설정");
  hp.text(ax(0),ay(0),"(0,0)");
  hp.text(ax(0),20,String(h/2) );
  hp.text(ax(0),h,"-"+String(h/2) );
  hp.text(0,h/2,"-"+String(w/2));
  hp.text(w-40,h/2,String(w/2)); 
  hp.color(Gray);
  hp.line(0, h/2, w, h/2);
  hp.line(w/2, 0, w/2, h);   
  hp.color(White); 
  hp.circle( ax(0), ay(0), 130,false);
  hp.save("/bk.png");

}

void loop() 
{   
   hp.load( path+ "bk.png" );
   int yy=r(x,130)*d;
   hp.color(Red);
   hp.line(ax(x),ay(yy),ax(-x),ay(-yy));
   hp.color(Yellow);
   hp.circle( ax(x) ,ay( yy  ), 10  ,true );   
   hp.color(Green);
   hp.circle( ax(-x) ,ay( -yy  ), 10  ,true );  
    
   x=x+20*d;
   if( x >130 ){ x=130; d= -1; } 
   if( x <-130 ) {  x=-130;  d=1;   }
   
}