숫자 폰트를 만들다...

by 이희철 | 2016-07-10 18:35
sous vide 수비드 수비드머신

첨부파일

TFT LCD를 동작시키면서 가장 불편하고 아쉬웠던 부분이 폰트...


기본 폰트는 글자가 약간만 커도 옛날 블럭격파 게임에 나오는 무식한 보기흉한 폰트가 기본으로 제공된다...


아두이노를 꽤 잘하는 (아두이노 강사와 오랜 경력의 프로그래머들) 이들에게 보기 좋은 폰트를 사용하려면 어떻게 하면되냐고 물었더니...


폰트는 구하기도 힘들 뿐더러 특히 한글을 사용하려면 무척이나 라이브러리를 찾는데 고생할 것이란 조언...


메어커톤 대회 당시 프로그램의 일부를 작성하던 친구에게 예쁜 모양의 폰트를 찾아보라고 했더니 많은 시간을 소비하면 찾아봤지만 흔하지 않아서 결국 찾지 못했다고 하길래...


화면에 맞게 폰트를 제작하라고 했더니...


머리를 세차게 흔들면서...


노가다도 이런 노가다가 없다면서 포기...


결국...


직접 만들었다...






비트이미지로 하면 유틸리티도 사용할 수 있고 편리하지만 LCD가 저가라서 너무 느려서 비트맵으로는 표시하기 힘들어...


상대적으로 속도가 빠른 Line명령으로 일일히 좌표를 지정해서 그려 냈다...


설상가상으로...


디자이너에게 받은 화면디자인에 있는 7 segment의 가로와 세로  각각의 segment가 모양이 일치 하지 않아 7개를 모두 따로 만들었다...

(원래는 디자이너에게 다시 작업을 시키면서 세그먼트의 모양을 통일시키고 위치시킨 좌표값을 달라고 해야 하는데...  디자이너가 너무 바쁜 것 같아 프로그램으로 일일히 좌표와 모양을 맞추어 주었다..)


덕분에 코드는 걸레처럼 복잡하고 길게 작성되었으며...


시간은 엄청 잡아 먹었다...


나름...


배열을 이용해 세그먼트와 숫자를 매칭시켰으며...




아주 간단한 오토마타를 작성해서 넣었다...


아두이노의 첫번째 프로젝트 치고는 덩치가 계속 커지는 것 같아 부담된다...




테스트 프로그램을 같이 첨부화일에 등록했으니 필요하신분은 다운로드 받아서 동작시켜보기 바란다...


프로그램이 길어...


더럽게 복잡해 보이는 것이 함정...



  // Define the TFT LCD digit segments from 0 - 9

byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0

                                 { 0,1,1,0,0,0,0 },  // = 1

                                 { 1,1,0,1,1,0,1 },  // = 2

                                 { 1,1,1,1,0,0,1 },  // = 3

                                 { 0,1,1,0,0,1,1 },  // = 4

                                 { 1,0,1,1,0,1,1 },  // = 5

                                 { 1,0,1,1,1,1,1 },  // = 6

                                 { 1,1,1,0,0,0,0 },  // = 7

                                 { 1,1,1,1,1,1,1 },  // = 8

                                 { 1,1,1,1,0,1,1 }   // = 9

                               };


int Diff_c_y = 30;  // Difference y is 30 pixel for segment c

int Diff_d_y = 60;  // Difference y is 60 pixel for segment d

int Diff_c_y_low = 10; // 현재온도 하위표시자리를 위한 세로축  y축 이동...

int Diff_d_y_low = 20;  // 현재온도 하위표시자리를 한 가로선 y축 동...


int MoveX_low = 19;  // Move to 18 pixel to right for 현재온도하위비트 

int MoveX = 46;  // Move to 46 pixel to right


void loop()

{


while(1)

{

  seven_seg_set_temp_high_byte(8,WHITE);

  seven_seg_set_temp_low_byte(8,WHITE);  

  seven_seg_now_temp_high_byte(8, WHITE);  // 현재온도 상위바이트 LCD 화면표시 CLEAR

  seven_seg_now_temp_low_byte(8, WHITE);  // 현재온도 하위바이트 LCD 화면표시 CLEAR


  for (int i=0; i<10; i++) {

  seven_seg_set_temp_high_byte(i,RED); // 설정온도 상위바이트 LCD 화면표시

  seven_seg_set_temp_low_byte(i,RED); // 설정온도 하위바이트 LCD 화면표시

  

  seven_seg_now_temp_high_byte(i, BLUE);  // 현재온도 상위바이트 LCD 화면표시 

  seven_seg_now_temp_low_byte(i, BLUE);  // 현재온도 상위바이트 LCD 화면표시 

  

 delay(1000);

  seven_seg_set_temp_high_byte(i,WHITE); 

  seven_seg_set_temp_low_byte(i,WHITE); 

  

  seven_seg_now_temp_high_byte(i, WHITE);  // 현재도 상위바이트 LCD 화면표시 CLEAR

    seven_seg_now_temp_low_byte(i, WHITE);  // 현재도 상위바이트 LCD 화면표시 CLEAR

 } //for

} // while


} // end of loop


//  설정온도 상위바이트 표시 

void seven_seg_set_temp_high_byte(byte HighByte, int COLOR) {


  

   byte segCount = 0;                            

                               

  //  for (byte segCount = 0; segCount < 7; ++segCount) {

         set_high_byte_segment_a (seven_seg_digits[HighByte][segCount], COLOR);

         segCount++;

         set_high_byte_segment_b (seven_seg_digits[HighByte][segCount], COLOR);   

         segCount++; 

         set_high_byte_segment_c (seven_seg_digits[HighByte][segCount], COLOR); 

         segCount++; 

         set_high_byte_segment_d (seven_seg_digits[HighByte][segCount], COLOR);

         segCount++; 

         set_high_byte_segment_e (seven_seg_digits[HighByte][segCount], COLOR);  

         segCount++; 

         set_high_byte_segment_f (seven_seg_digits[HighByte][segCount], COLOR);  

         segCount++; 

         set_high_byte_segment_g (seven_seg_digits[HighByte][segCount], COLOR);        

 //   } // for

} // end of function

 

//  설정온도 하위바이트 표시 

void seven_seg_set_temp_low_byte(byte HighByte, int COLOR) {


   byte segCount = 0;                            

                               

  //  for (byte segCount = 0; segCount < 7; ++segCount) {

         set_low_byte_segment_a (seven_seg_digits[HighByte][segCount], COLOR);

         segCount++;

         set_low_byte_segment_b (seven_seg_digits[HighByte][segCount], COLOR);   

         segCount++; 

         set_low_byte_segment_c (seven_seg_digits[HighByte][segCount], COLOR); 

         segCount++; 

         set_low_byte_segment_d (seven_seg_digits[HighByte][segCount], COLOR);

         segCount++; 

         set_low_byte_segment_e (seven_seg_digits[HighByte][segCount], COLOR);  

         segCount++; 

         set_low_byte_segment_f (seven_seg_digits[HighByte][segCount], COLOR);  

         segCount++; 

         set_low_byte_segment_g (seven_seg_digits[HighByte][segCount], COLOR);        

 //   } // for

} // end of function

 

 

 

//  현재온도 상위바이트 표시 

 void seven_seg_now_temp_high_byte(byte HighByte, int COLOR) {


   byte segCount = 0;                            

                               

  //  for (byte segCount = 0; segCount < 7; ++segCount) {

         time_high_byte_segment_a (seven_seg_digits[HighByte][segCount], COLOR);

         segCount++;

         time_high_byte_segment_b (seven_seg_digits[HighByte][segCount], COLOR);   

         segCount++; 

         time_high_byte_segment_c (seven_seg_digits[HighByte][segCount], COLOR); 

         segCount++; 

         time_high_byte_segment_d (seven_seg_digits[HighByte][segCount], COLOR);

         segCount++; 

         time_high_byte_segment_e (seven_seg_digits[HighByte][segCount], COLOR);  

         segCount++; 

         time_high_byte_segment_f (seven_seg_digits[HighByte][segCount], COLOR);  

         segCount++; 

         time_high_byte_segment_g (seven_seg_digits[HighByte][segCount], COLOR);        

 //   } // for

} // end of function


//////////////////////////////////////////////

//  현재온도 하위바이트 표시 

/////////////////////////////////////////////

 void seven_seg_now_temp_low_byte(byte HighByte, int COLOR) {


  

   byte segCount = 0;                            

                               

  //  for (byte segCount = 0; segCount < 7; ++segCount) {

         time_low_byte_segment_a (seven_seg_digits[HighByte][segCount], COLOR);

         segCount++;

         time_low_byte_segment_b (seven_seg_digits[HighByte][segCount], COLOR);   

         segCount++; 

         time_low_byte_segment_c (seven_seg_digits[HighByte][segCount], COLOR); 

         segCount++; 

         time_low_byte_segment_d (seven_seg_digits[HighByte][segCount], COLOR);

         segCount++; 

         time_low_byte_segment_e (seven_seg_digits[HighByte][segCount], COLOR);  

         segCount++; 

         time_low_byte_segment_f (seven_seg_digits[HighByte][segCount], COLOR);  

         segCount++; 

         time_low_byte_segment_g (seven_seg_digits[HighByte][segCount], COLOR);        

 //   } // for

} // end of function








 

// -------------------------------------------------

// 설정 온도상위  7 segment a

 void set_high_byte_segment_a (boolean disp,int COLOR)

  {

   if (disp) {  

    for (int i=0;i < 8 ; i++) {

        tft.drawLine(92+i,110+i,128-i,110+i,COLOR); 

      } // for

  } // if

 } // end of function

  

// -------------------------------------------------



  // 설정 온도상위  7 segment b

 void set_high_byte_segment_b (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(128-i,113+i,128-i,140-i,COLOR); 

      } // for 

      

      for (int i=0;i < 6 ; i++) {

        tft.drawLine(126-i,115+i,126-i,141-i,COLOR); 

      } // for      

    } // if

   

} // end of function



 // -------------------------------------------------

  // 설정 온도상위  7 segment c

 void set_high_byte_segment_c (boolean disp, int COLOR)

 {

    if (disp) {

        for (int i=0;i < 8 ; i++) {

        tft.drawLine(129 -i,111+Diff_c_y + i,129-i,143+Diff_c_y - i,COLOR); 

      } // for

    } // if

} // end of function



// -------------------------------------------------

// 설정 온도상위  7 segment d

void set_high_byte_segment_d (boolean disp, int COLOR)

 {

    if (disp) {

     for (int i=0;i < 8 ; i++) {

  tft.drawLine(98-i,(108 + Diff_d_y + i),119+i,(108 + Diff_d_y + i),COLOR); 

}   

    } // if

} // end of function 


// -------------------------------------------------

  // 설정 온도상위  7 segment e


 void set_high_byte_segment_e (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 8 ; i++) {

        tft.drawLine(90+i,143+i,90+i,173-i,COLOR); 

      } // for

    } // if

} // end of function


// -------------------------------------------------

  // 설정 온도상위  7 segment f

 void set_high_byte_segment_f (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(90 +i,111+i,90+i,140+i,COLOR); 

      }//for  

      

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(94+i,115+i,94+i,141-i,COLOR); 

      }  // for

    } // if

} // end of function



// -------------------------------------------------

  // 설정 온도상위  7 segment g


 void set_high_byte_segment_g (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(98-i,140+i,121+i,140+i,COLOR); 

      } //for

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(94+i,144+i,124-i,144+i,COLOR); 

      } //for   

    } // if

} // end of function


// ============================================================

//   설정온도하위비트

//=============================================================

// -------------------------------------------------

  // 설정 온도 하위  7 segment a



 void set_low_byte_segment_a (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 8 ; i++) {

        tft.drawLine(92+MoveX+i,110+i,128+MoveX-i,110+i,COLOR); 

      } // for   

     } // if

} // end of function


// -------------------------------------------------

  // 설정 온도 하위  7 segment b

 void set_low_byte_segment_b (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(129+MoveX-i,111+i,129+MoveX-i,139+i,COLOR); 

      } //for


      for (int i=0;i < 6 ; i++) {

        tft.drawLine(126+MoveX-i,115+i,126+MoveX-i,141-i,COLOR); 

      }  //for  

    } // if

} // end of function


// -------------------------------------------------

  // 설정 온도하위  7 segment c

 void set_low_byte_segment_c (boolean disp, int COLOR)

 {

    if (disp) {

       for (int i=0;i < 8 ; i++) {

        tft.drawLine(129+MoveX-i,111+Diff_c_y + i,129+MoveX-i,145+Diff_c_y - i,COLOR); 

       }  // for 

    } // if

} // end of function


// -------------------------------------------------

  // 설정 온도하위  7 segment d

 void set_low_byte_segment_d (boolean disp, int COLOR)

 {

    if (disp) {

       for (int i=0;i < 8 ; i++) {

        tft.drawLine(98+MoveX-i,(108 + Diff_d_y + i),119+MoveX+i,(108 + Diff_d_y + i),COLOR); 

      } // for

    } // if

} // end of function


// -------------------------------------------------

  // 설정 온도하위  7 segment e

 void set_low_byte_segment_e (boolean disp, int COLOR)

 {

    if (disp) {

       for (int i=0;i < 8 ; i++) {

        tft.drawLine(90+MoveX+i,143+i,90+MoveX+i,173-i,COLOR); 

       } // for

    } // if

} // end of function


// -------------------------------------------------

  // 설정 온도하위  7 segment f

 void set_low_byte_segment_f (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(90+MoveX+i,111+i,90+MoveX+i,140+i,COLOR); 

      }  // for 

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(94+MoveX+i,115+i,94+MoveX+i,141-i,COLOR); 

      }   // for      

    } // if

} // end of function


// -------------------------------------------------

  // 설정 온도하위  7 segment g



 void set_low_byte_segment_g (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(98+MoveX-i,140+i,121+MoveX+i,140+i,COLOR); 

      } // for

      for (int i=0;i < 4 ; i++) {

        tft.drawLine(94+MoveX+i,144+i,124+MoveX-i,144+i,COLOR); 

      } // for

    } // if

} // end of function


// ============================================================

//   현재 온도상위비트

//=============================================================


// -------------------------------------------------

  //  현재 온도상위  7 segment a

 void time_high_byte_segment_a (boolean disp, int COLOR)

 {

    if (disp) {

     for (int i=0;i < 3 ; i++) {

      tft.drawLine(210+i,149+i,224-i,149+i,COLOR); 

    }  // for

    } // if

} // end of function


// -------------------------------------------------

  //  현재 온도상위  7 segment b


 void time_high_byte_segment_b (boolean disp, int COLOR)

 {

    if (disp) {

       for (int i=0;i < 2 ; i++) {

        tft.drawLine(225 -i,150+i,225-i,160+i,COLOR); 

       } // for


      for (int i=0;i < 2 ; i++) {

        tft.drawLine(223-i,152+i,223-i,161-i,COLOR); 

      }  // for

    } // if

} // end of function


// -------------------------------------------------

  // 현재  온도상위  7 segment c


 void time_high_byte_segment_c (boolean disp, int COLOR)

 {

    if (disp) {

        for (int i=0;i < 4 ; i++) {

        tft.drawLine(225 -i,151+Diff_c_y_low+i,225-i,164+Diff_c_y_low - i,COLOR); 

      }  // for

    } // if

} // end of function


// -------------------------------------------------

  // 현재  온도상위  7 segment d

 void time_high_byte_segment_d (boolean disp, int COLOR)

 {

    if (disp) {

       for (int i=0;i < 3 ; i++) {

        tft.drawLine(212-i,(153 + Diff_d_y_low + i),222+i,(153 + Diff_d_y_low + i),COLOR); 

      }  // for

    } // if

} // end of function


 

// -------------------------------------------------

  // 현재  온도상위  7 segment e


 void time_high_byte_segment_e (boolean disp, int COLOR)

 {

    if (disp) {

       for (int i=0;i < 4 ; i++) {

        tft.drawLine(209+i,162+i,209+i,174-i,COLOR); 

      }  // for

    } // if

} // end of function


// -------------------------------------------------

  // 현재  온도상위  7 segment f

 void time_high_byte_segment_f (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 2 ; i++) {

        tft.drawLine(211+i,152+i,211+i,162-i,COLOR); 

      } // for

      for (int i=0;i < 2 ; i++) {

        tft.drawLine(209 +i,150+i,209+i,160+i,COLOR); 

      } // for

    } // if

} // end of function


// -------------------------------------------------

  // 현재  온도상위  7 segment g


 void time_high_byte_segment_g (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 2 ; i++) {

        tft.drawLine(214-i,160+i,220+i,160+i,COLOR); 

}

      for (int i=0;i < 2 ; i++) {

        tft.drawLine(212+i,162+i,222-i,162+i,COLOR); 

      } // for

   } // if

} // end of function



// ============================================================

//   현재 온도하위 바이트 

//=============================================================


// -------------------------------------------------

  //  현재 온도하위  7 segment a


 void time_low_byte_segment_a (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 3 ; i++) {

        tft.drawLine(210+MoveX_low+i,149+i,224+MoveX_low-i,149+i,COLOR); 

      } // for

    } // if

} // end of function


// -------------------------------------------------

  //  현재 온도하위  7 segment b


 void time_low_byte_segment_b (boolean disp, int COLOR)

 {

    if (disp) {

       for (int i=0;i < 2 ; i++) {

        tft.drawLine(225+MoveX_low-i,150+i,225+MoveX_low-i,160+i,COLOR); 

       }  // for


      for (int i=0;i < 2 ; i++) {

        tft.drawLine(223+MoveX_low-i,152+i,223+MoveX_low-i,161-i,COLOR); 

      } // for

   } // if

} // end of function


// -------------------------------------------------

  // 현재  온도하위  7 segment c


 void time_low_byte_segment_c (boolean disp, int COLOR)

 {

    if (disp) {

       for (int i=0;i < 4 ; i++) {

        tft.drawLine(225+MoveX_low-i,151+Diff_c_y_low+i,225+MoveX_low-i,164+Diff_c_y_low - i,COLOR); 

      } // for

    } // if

} // end of function


// -------------------------------------------------

  // 현재  온도하위  7 segment d

 void time_low_byte_segment_d (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 3 ; i++) {

        tft.drawLine(212+MoveX_low-i,(153 + Diff_d_y_low + i),222+MoveX_low+i,(153 + Diff_d_y_low + i),COLOR); 

      }  // for

    } // if

} // end of function


// -------------------------------------------------

  // 현재  온도하위  7 segment e


 void time_low_byte_segment_e (boolean disp, int COLOR)

 {

    if (disp) {

       for (int i=0;i < 4 ; i++) {

        tft.drawLine(209+MoveX_low+i,162+i,209+MoveX_low+i,174-i,COLOR); 

      } // for

    } // if

} // end of function


// -------------------------------------------------

  // 현재  온도하위  7 segment f


 void time_low_byte_segment_f (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 2 ; i++) {

        tft.drawLine(209+MoveX_low+i,150+i,209+MoveX_low+i,160+i,COLOR); 

      }  // for


      for (int i=0;i < 2 ; i++) {

        tft.drawLine(211+MoveX_low+i,152+i,211+MoveX_low+i,162-i,COLOR); 

      }  // for

    } // if

} // end of function


// -------------------------------------------------

  // 현재  온도하위  7 segment g


 void time_low_byte_segment_g (boolean disp, int COLOR)

 {

    if (disp) {

      for (int i=0;i < 2 ; i++) {

        tft.drawLine(214+MoveX_low-i,160+i,220+MoveX_low+i,160+i,COLOR); 

      } // for

      for (int i=0;i < 2 ; i++) {

        tft.drawLine(212+MoveX_low+i,162+i,222+MoveX_low-i,162+i,COLOR); 

      } // for

    } // if

} // end of function

댓글 0

MADE BY

이희철

요리, 전자회로설계