산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino Nano용 TFT Shield - 시작

구성품 및 소모품

Arduino Nano R3
× 1
2,8" TFT SPI 320x240
× 1
Arduino Nano용 TFT 실드
× 1

이 프로젝트 정보

이야기

본 적이 없고 컬러 디스플레이가 무엇인지 모르는 사람은 거의 없을 것입니다. 그리고 아마도 많은 사람들이 컬러 디스플레이를 사용하여 Arduino에서 일부 프로젝트를 수행했거나 하고 싶어할 것입니다. 더욱이, 오늘날 그러한 디스플레이는 매우 광범위하고 저렴합니다. 해상도, 화면 크기, 인터페이스가 다른 많은 디스플레이가 있습니다. 나는 이러한 디스플레이 중 하나에 대해 이야기하고 싶습니다. 우리는 SPI 인터페이스, 320x240 픽셀의 해상도 및 2.8 "(및 2.4" 및 3.2 ")의 화면 대각선 크기를 가진 디스플레이에 관심을 가질 것입니다. SPI 인터페이스는 마이크로 컨트롤러에 연결하는 데 매우 편리합니다. 적은 수의 신호 라인을 가지고 있습니다.그리고 SPI의 속도는 화면의 내용을 빠르게 업데이트 할 수 있습니다.일반적으로 많은 이점이 있습니다.그러나 불편한 순간이 있습니다.예를 들어 논리 수준을 추가로 조정할 필요가 있습니다. 디스플레이를 5볼트 전원으로 Arduino 보드에 연결하는 경우 이러한 디스플레이 중 하나(SPI 인터페이스 포함)를 Arduino Nano에 빠르고 쉽게 연결하려면 약간의 수수료(TFT 실드)를 사용합니다.

이 쉴드는 Arduino Uno용 TFT Shield의 두 번째(Arduino Nano용 경량) 버전으로 여기와 여기, 여기에서 읽을 수 있습니다.

TFT 실드에 대한 간략한 설명:

<울>
  • 보드의 크기는 64x49mm입니다.
  • <울>
  • Arduino Nano 연결용 30핀 커넥터,
  • <울>
  • TFT 디스플레이 320x240을 SPI 인터페이스(터치 스크린 포함)와 연결하기 위한 14핀 커넥터,
  • <울>
  • microSD 카드용 커넥터,
  • <울>
  • Bluetooth 모듈용 커넥터(HC-06),
  • <울>
  • 카메라 OV7670(및 기타)용 20핀 커넥터,
  • <울>
  • 미니 USB 커넥터 및 5V 전원 공급을 위한 별도의 2핀 커넥터
  • 자, 시작하겠습니다.

    어셈블리

    보드 조립은 매우 간단합니다. 그러나 설치하기 전에 접점 지정을 읽고 주의해야 합니다. 먼저 사진과 같이 Arduino Nano 보드를 설치해야 합니다. 그 후, 보드의 한쪽 면에 모두 연결할 수 있는 디스플레이가 연결됩니다(방법 1 ) 및 다른 하나(방법 2 ). 그 후 미니 USB 케이블로 전원을 연결하시면 됩니다. 아래는 사진입니다.

    방법 1:

    방법 2:

    조립 후 스케치 다운로드를 진행할 수 있지만 그 전에 TFT 실드 작업에 필요한 라이브러리를 설치하는 것을 잊지 마십시오. 라이브러리는 https://github.com/YATFT/YATFT 링크에 있습니다.

    데모 1. 그래픽 및 텍스트.

    이 장에서는 텍스트, 그래픽 및 터치 스크린을 사용한 작업의 예를 제공합니다. 편의를 위해 먼저 Arduino Nano 보드를 별도로 프로그래밍한 다음 장치를 조립하는 것이 좋습니다(그러나 보드를 장치의 일부로 프로그래밍할 수도 있음). 텍스트 및 그래픽 작업을 위한 스케치:

    <사전><코드>/************************************************ ************************************ 소프트웨어와 문서는 어떠한 보증도 없이 "있는 그대로" 제공됩니다* 명시적이든 묵시적이든 상품성, 소유권, 비침해 및 특정* 목적에의 적합성에 대한 보증*을 포함하되 이에 국한되지 않습니다. 어떤 경우에도 저자 또는 그의 라이선스 제공자는 계약, 태만, 엄격한 책임, 공헌*, 보증 위반 또는 기타 법적 형평성 이론에 따라 직접적 또는 간접적* 손해에 대해 책임을 지지 않거나 의무를 지지 않습니다. ,* 간접, 징벌적 또는 결과적 손해, 이익 손실 또는 데이터 손실,* 대체 상품, 기술, 서비스 또는 제3자의 모든* 클레임 조달 비용(한도로 제한되지 않음)* .**************************************************** ******************************/#include // 하드웨어별 라이브러리#include // Adafruit-GFX 라이브러리 포함#include // Adafruit 글꼴 포함#include #include YATFT tft(0);uint32_t total_timet; 색상[4] ={BRIGHTBLUE, BRIGHTGREEN, BRIGHTRED, BRIGHTYELLOW};uint16_t 회색[7] ={GRAY0, GRAY1, GREY2, GREY3, GREY4, GR AY5, GREY6};/******************************************** **********************************/void ClearScreen(무효){ tft.SetColor(BLACK); // 폰 색상 설정 tft.ClearDevice(); // 전체 화면 채우기}void setup(){ Serial.begin(115200); // 직렬 포트 초기화 Serial.println("Arduino TFT_shield 예제 1!"); tft.begin(); // 디스플레이 초기화}void loop(){ uint16_t x, y, x2, y2, mask_gray; uint16_t 나; 클리어스크린(); // 글꼴 Serial.print("1) 글꼴 보기("); total_time =밀리(); tft.SetColor(밝은 파란색); tft.SetFont(NULL); tft.OutTextXY(5, 5, "TFT 디스플레이 작업 시연."); tft.SetColor(밝은 녹색); tft.SetFont(&FreeSerif9pt7b); tft.OutTextXY(5, 20, "예제는 Adafruit의 글꼴을 사용합니다."); tft.SetFont(&FreeSerifItalic24pt7b); tft.SetColor(밝은 청록색); tft.OutTextXY(5, 45, "3,5''"); tft.SetColor(밝은 빨간색); tft.OutTextXY(90, 45, "QVGA"); tft.SetColor(브라이트마젠타); tft.OutTextXY(230, 45, "표시"); tft.SetColor(밝은 노란색); tft.SetFont(&FreeSans24pt7b); tft.OutTextXY(5, 100, "AR D U I NO + T F T"); tft.SetFont(NULL); for (i =0, i <7, i++) { tft.SetColor(회색[i]); tft.OutTextXY(5, 170+10*i, "TFT 디스플레이 작업 시연."); } PrintTotalTime(); 지연(3000); 클리어스크린(); // Circle Serial.print("2) 원 그리기("); total_time =밀리(); tft.SetColor(밝은 빨간색); (i =10, i >1, i +=10) { tft.DrawCirc(GetMaxX()>>1, GetMaxY()>>1, i); } PrintTotalTime(); 지연(1000); // DrawFillCircle &DrawFillRect Serial.print("3) FillCircle 및 FillRect 그리기("); total_time =밀리(); tft.SetColor(밝은 빨간색); tft.DrawFillCirc(GetMaxX()>>1,GetMaxY()>>1,110); tft.SetColor(밝은 청록색); tft.DrawFillRect(GetMaxX()/2-77,GetMaxY()/2-77, GetMaxX()/2+77,GetMaxY()/2+77); tft.SetColor(밝은 녹색); tft.DrawFillCirc(GetMaxX()>>1,GetMaxY()>>1,77); tft.SetColor(브라이트마젠타); tft.DrawFillRect(GetMaxX()/2-54,GetMaxY()/2-54, GetMaxX()/2+54,GetMaxY()/2+54); tft.SetColor(밝은 파란색); tft.DrawFillCirc(GetMaxX()>>1,GetMaxY()>>1,54); tft.SetColor(밝은 노란색); tft.DrawFillRect(GetMaxX()/2-37,GetMaxY()/2-37, GetMaxX()/2+37,GetMaxY()/2+37); PrintTotalTime(); 지연(1000); 클리어스크린(); // Arc Serial.print("4) Arc 그리기("); total_time =밀리(); 클리어스크린(); tft.SetColor(밝은 파란색); tft.DrawArc((GetMaxX()>>1)-60,(GetMaxY()>>1)-60,(GetMaxX()>>1)+60,(GetMaxY()>>1)+60,20, 30,0xFF); tft.SetColor(밝은 녹색); tft.DrawArc((GetMaxX()>>1)-40,(GetMaxY()>>1)-40,(GetMaxX()>>1)+40,(GetMaxY()>>1)+40,20, 30,0xFF); tft.SetColor(밝은 빨간색); tft.DrawArc((GetMaxX()>>1)-20,(GetMaxY()>>1)-20,(GetMaxX()>>1)+20,(GetMaxY()>>1)+20,20, 30,0xFF); PrintTotalTime(); 지연(1000); Serial.print("5) FillBevel 그리기("); total_time =밀리(); tft.SetColor(밝은 파란색); tft.DrawFillBevel((GetMaxX()>>1)-60,(GetMaxY()>>1)-60,(GetMaxX()>>1)+60,(GetMaxY()>>1)+60,30); tft.SetColor(밝은 녹색); tft.DrawFillBevel((GetMaxX()>>1)-40,(GetMaxY()>>1)-40,(GetMaxX()>>1)+40,(GetMaxY()>>1)+40,30); tft.SetColor(밝은 빨간색); tft.DrawFillBevel((GetMaxX()>>1)-20,(GetMaxY()>>1)-20,(GetMaxX()>>1)+20,(GetMaxY()>>1)+20,30); PrintTotalTime(); 지연(1000); 클리어스크린(); Serial.print("6) 호 그리기("); total_time =밀리(); for (i =0, i <4, i++) { tft.SetColor(Color[i]); tft.DrawArc((GetMaxX()>>1),(GetMaxY()>>1)-50,(GetMaxX()>>1),(GetMaxY()>>1)+50,50,60,0x11<>1),(GetMaxY()>>1)-30,(GetMaxX()>>1),(GetMaxY()>>1)+30,35,45,0x11<>1),(GetMaxY()>>1),(GetMaxX()>>1),(GetMaxY()>>1),20,30,0x11<

    일부 스크린샷:

    데모 2. 터치스크린.

    <사전><코드>/************************************************ ************************************ 소프트웨어와 문서는 어떠한 보증도 없이 "있는 그대로" 제공됩니다* 명시적이든 묵시적이든 상품성, 소유권, 비침해 및 특정* 목적에의 적합성에 대한 보증*을 포함하되 이에 국한되지 않습니다. 어떤 경우에도 저자 또는 그의 라이선스 제공자는 계약, 태만, 엄격한 책임, 공헌*, 보증 위반 또는 기타 법적 형평성 이론에 따라 직접적 또는 간접적* 손해에 대해 책임을 지지 않거나 의무를 지지 않습니다. ,* 간접, 징벌적 또는 결과적 손해, 이익 손실 또는 데이터 손실,* 대체 상품, 기술, 서비스 또는 제3자의 모든* 클레임 조달 비용(한도로 제한되지 않음)* .**************************************************** ******************************/#include // 하드웨어별 라이브러리#include // SPI 라이브러리 포함#include // 터치스크린 라이브러리 포함#include // Adafruit-GFX 라이브러리 포함#include // Adafruit 글꼴 포함#include #include // 터치스크린:MOSI=11, MISO=12, SCK=13, CS=2#define CS_PI N A0XPT2046_Touchscreen ts(CS_PIN, 255);YATFT tft(0);#define Y_BAR_TOP (GetMaxY()-50)#define Y_BAR_BOT GetMaxY()/* 쉴드를 사용하면 모든 제어 및 데이터 라인이 고정되고 선언이 간단해집니다. 선택적으로 사용할 수 있습니다.*/uint16_t pos_x[] ={0,0,0,0};uint16_t pos_y[] ={0,0,0,0};uint8_t pos_x_cnt =0;uint8_t pos_y_cnt =0;uint16_t pos_x_mid 0;uint16_t pos_y_mid =0;uint16_t color_paint =WHITE;uint8_t 버튼 =0;uint16_t 색상[4] ={BRIGHTBLUE, BRIGHTGREEN, BRIGHTRED, BRIGHTYELLOW};uint16_t 회색[7] ={GRAY1,4,GRAY 그레이5, 그레이6};/******************************************** ************************************************** ***/무효 ClearScreen(무효){ tft.SetColor(BLACK); // 폰 색상 설정 tft.ClearDevice(); // 전체 화면 채우기}void setup(){ Serial.begin(115200); // 직렬 포트 초기화 Serial.println("Arduino TFT_shield Example1!"); ts.begin(); // 터치스크린 초기화 SPI.end(); // 올바른 작업을 위해 SPI 비활성화 DB2(SS) pin tft.begin(); // 디스플레이 초기화 RefreshWindow();}void loop(){ uint16_t x, y; // Touch // SS 핀이 OUTPUT으로 설정되면 범용 출력 포트로 // 사용할 수 있습니다(SPI 작업에는 // 영향을 미치지 않음). SPI.begin(); if (ts.touched()) { TS_Point p =ts.getPoint(); Serial.print(F("압력 =")); Serial.print(p.z); Serial.print(F(", x =")); Serial.print(p.x); Serial.print(F(", y =")); Serial.print(p.y); 직렬.println(); 지연(3); // 필터링을 위한 지연 SPI.end(); // 올바른 작업을 위해 SPI 비활성화 DB2(SS) 핀 // ADC 코드에서 좌표 x, y 계산 Serial.print(F("Pressure =")); Serial.print(p.z); Serial.print(F(", x =")); Serial.print(p.x); Serial.print(F(", ")); Serial.print(x); Serial.print(F(", y =")); Serial.print(p.y); Serial.print(F(", ")); Serial.print(y); 직렬.println(); if (p.x <350) p.x =350; 만약 (p.x> 3850) p.x =3850; if (p.y <250) p.y =250; if (p.y> 3850) p.y =3850; x =(uint16_t)(320L - ((uint32_t)p.x - 350L)*100L/1094L); y =(uint16_t)(240L - ((uint32_t)p.y - 250L)*100L/1510L); // 필터링 pos_x_mid =(pos_x[0] + pos_x[1] + pos_x[2] + pos_x[3])/4; pos_y_mid =(pos_y[0] + pos_y[1] + pos_y[2] + pos_y[3])/4; pos_x[pos_x_cnt++] =x; pos_y[pos_y_cnt++] =y; pos_x_cnt &=0x03; pos_y_cnt &=0x03; if (x> (pos_x_mid - 10) &&x <(pos_x_mid + 10) &&y> (pos_y_mid - 10) &&y <(pos_y_mid + 10 )) { if (y> Y_BAR_TOP &&y

    일부 스크린샷:

    데모 3. 논리 게임 "열".

    <사전><코드>/************************************************ ************************************ 소프트웨어와 문서는 어떠한 보증도 없이 "있는 그대로" 제공됩니다* 명시적이든 묵시적이든 상품성, 소유권, 비침해 및 특정* 목적에의 적합성에 대한 보증*을 포함하되 이에 국한되지 않습니다. 어떤 경우에도 저자 또는 그의 라이선스 제공자는 계약, 태만, 엄격한 책임, 공헌*, 보증 위반 또는 기타 법적 형평성 이론에 따라 직접적 또는 간접적* 손해에 대해 책임을 지지 않거나 의무를 지지 않습니다. ,* 간접, 징벌적 또는 결과적 손해, 이익 손실 또는 데이터 손실,* 대체 상품, 기술, 서비스 또는 제3자의 모든* 클레임 조달 비용(한도로 제한되지 않음)* .**************************************************** ******************************/#include #include #include #include // 핵심 그래픽 라이브러리#include #include #define CS_PIN A0// MOSI=11, MISO=12, SCK=13XPT2046_Touch (CS_PIN, 255);YATFT tft(0);/* 쉴드를 사용하면 모든 제어 및 데이터 라인이 고정되며, 선택적으로 더 간단한 선언을 사용할 수 있습니다. :*/long randNumber;#define KEY_EMPTY 0#define KEY_SWAP 1#define KEY_FALL 2#define KEY_LEFT 3#define KEY_RIGHT 4#define DISPLAY_MAX_X 320#define DISPLAY_MAX_Y 240#define MaxCol 8 #define MaxCol 8 #define #define razmer 15#define LL 250#define NumCol 6#define MaxLevel 8#define PeriodLevel 80#define DISP_LEFT ((DISPLAY_MAX_X - MaxCol*razmer)/2 - 2)#define DISP_RIGHT ((DISPLAY_MAX_X + MaxCol*razmer) 2)#define DISP_TOP((DISPLAY_MAX_Y - (MaxRow-4)*razmer)/2 - 2 - 10)#define DISP_BOT((DISPLAY_MAX_Y + (MaxRow-4)*razmer)/2 + 2 - 10)uint8_t MasSt[MaxCol ][MaxRow], MasTmp[MaxCol][MaxRow], MasOld[MaxCol][MaxRow], fignext[3];uint8_t Level=1, OldLevel, tr, flfirst=1;uint16_t MasCol[]={WHITE, BLACK, BRIGHTRED , BRIGHTBLUE, BRIGHTGREEN, BRIGHTYELLOW, BRIGHTMAGENTA, BRIGHTCYAN}; unsigned long Counter,Score=0, TScore=0, Record=0, OldRecord, OldScore, myrecord;uint16_t tempspeed;bool fl, Demo=true, myfl=false, Arbeiten=false 거짓, FlNew, FlZ=false;int8_t VAL, Mp, x,y;int8_t mmm [4][2]={ {-1,0},{0,-1},{1,0},{0,1}};uint16_t 질량속도[MaxLevel]={500,450,400,350,300,250,200,100};/************ ************************************************** ****/void setup(void){ // 직렬 포트 초기화 Serial.begin(115200); Serial.println("TFT_shield_Game1 예제입니다!"); ts.begin(); // 터치스크린 초기화 SPI.end(); tft.begin(); // 디스플레이 초기화 randomSeed(analogRead(5)); tft.SetColor(흰색); tft.ClearDevice(); tft.SetColor(빨간색); tft.SetFont(&FreeSerif9pt7b); tft.OutTextXY( 20, 20, "레벨"); tft.OutTextXY(240, 20, "다음"); tft.OutTextXY( 20, 75, "점수"); tft.OutTextXY( 25, 130, "TOP"); FlNew =참; 뷰스타칸(); 다음 가져오기(); 지연(100); tft.SetColor(검정); tft.DrawLine(DISP_LEFT + 1, DISP_TOP + 0, DISP_LEFT + 1, DISP_BOT - 1); tft.DrawLine(DISP_LEFT + razmer*MaxCol+5-MaxCol,DISP_TOP + 0,DISP_LEFT + razmer*MaxCol+5-MaxCol, DISP_BOT - 1); tft.DrawLine(DISP_LEFT + 1, DISP_BOT - 1, DISP_LEFT + 1+razmer*MaxCol+5-MaxCol-1, DISP_BOT - 1);} 무효 루프(무효){ if (데모) ProcDemo(); else { if (Arbeiten) { mydelay(tempspeed); figmove(0,1); } else if (mypush()==KEY_SWAP) NewGame(); }}uint8_t mypush(void){ unsigned long tpr =millis(); uint8_t res =KEY_EMPTY; uint8_t 버튼 =0; 정적 uint8_t button_old; 정적 uint8_t cnt =0; 버튼 =터치(); if (버튼) { cnt =5; Serial.print("검색 버튼:"); Serial.print(버튼, HEX); 직렬.println(); if (버튼 !=button_old) { if (버튼 &0x01) res =KEY_SWAP; if (버튼 &0x02) res =KEY_FALL; if (버튼 &0x04) {}; if (버튼 &0x08) res =KEY_LEFT; if (버튼 &0x10) res =KEY_RIGHT; button_old =버튼; } } if (!cnt) { button_old =버튼; } else { cnt--; } 반환(res); } 무효 ViewQuad(uint8_t i,uint8_t j,uint8_t mycolor){ if (j<3) 반환; uint16_t wy =DISP_TOP + SmeY + (j-3)*razmer - j; uint16_t wx =DISP_LEFT + SmeX + i*razmer - i; if (mycolor!=0) { tft.SetColor(BLACK); tft.DrawRect(wx, wy, wx+razmer-1, wy+razmer-1); tft.SetColor(MasCol[마이컬러]); tft.DrawFillRect(wx+1, wy+1, wx+1+razmer-3, wy+1+razmer-3); } else { tft.SetColor(흰색); tft.DrawFillRect(wx+1, wy+0, wx+1+razmer-3, wy+1+razmer-3); }} 무효 ViewStacan(무효){ char myStr2[5]; uint8_t h =tft.GetTextHeight(&FreeMonoBoldOblique12pt7b); tft.SetFont(&FreeMonoBoldOblique12pt7b); if (OldScore!=점수 || FlNew) { sprintf(myStr2,"%05d",Score); int16_t w =tft.GetTextWidth(myStr2, &FreeMonoBoldOblique12pt7b); tft.SetColor(흰색); tft.DrawFillRect(20,100,20+w+5,100+h); tft.SetColor(녹색); tft.OutTextXY(20,100, myStr2); OldScore=점수; } if (OldRecord!=기록 || FlNew) { sprintf(myStr2,"%05d",Record ); int16_t w =tft.GetTextWidth(myStr2, &FreeMonoBoldOblique12pt7b); tft.SetColor(흰색); tft.DrawFillRect(20,155,20+w+5,155+h); tft.SetColor(녹색); tft.OutTextXY(20,155,myStr2); OldRecord=기록; } if (OldLevel!=레벨 || FlNew) { sprintf(myStr2,"%01d",Level ); int16_t w =tft.GetTextWidth(myStr2, &FreeMonoBoldOblique12pt7b); tft.SetColor(흰색); tft.DrawFillRect(25,45,25+w+5,45+h); tft.SetColor(녹색); tft.OutTextXY(25,45,myStr2); OldLevel=레벨; } FlNew=거짓; for (byte j=3;j=0 &&ny>=0 &&nx1 || MasTmp[i][j]>2 )) { MasTmp[nx][ny]=3; MasTmp[i][j]=3; } else if (모드==3 &&MasTmp[nx][ny]==3) { if (MasTmp[i][j]!=3) { MasTmp[i][j]=3; fl=참; } } }} void Sos(int i,int j, 바이트 모드){ for (byte k=0;k<4;k++) Sosed(i,j,mmm[k][0],mmm[k][1 ],방법); }bool FindFull(무효){ 바이트 i,j,k; 부울 해상도; 해상도 =거짓; for (byte k=2;k<8;k++) { ClearMas(MasTmp); for (j=3;j1) Sos(i,j,2); do { fl=거짓; for (j=3;j0) Sos(i,j,3); } 동안(fl); for (j=3;j0) { ViewStacan(); FlZ=참; mydelay(500); } for (j=0;j최대레벨) 레벨=최대레벨; } tempspeed=질량속도[레벨-1]; }}무효 MyScore(무효){ TScore=0; while(FindFull()) { if (TScore>7) Score=Score+TScore+(TScore-8)*2; else 점수=점수+TS점수; 뷰스타칸(); FlZ=참; mydelay(1000); } FlZ=false;}ProcDemo 무효(무효){ 점수=0; 다음 가져오기(); for (byte j=3;jMaxCol-1) return(false); if (dx!=0) if (MasSt[x+dx][y+dy+2]==0) return(true); 그렇지 않으면 반환(거짓); if (dy>0) { if (y+dy+2>MaxRow-1 || MasSt[x+dx][y+dy+2]>0) { if (y<3) gameover(); 그렇지 않으면 fff=참; } else { for (byte i=0;i<3;i++) MasSt[x][y+2-i+dy]=MasSt[x][y+2-i]; 질량[x][y]=0; y=y+dy; } if (ff) { MyScore(); 다음 가져오기(); } 뷰스타칸(); } return(true);}uint8_t 터치(무효){ uint16_t x, y; uint8_t 버튼 =0; // Touch // SS 핀이 OUTPUT으로 설정되면 범용 출력 포트로 // 사용할 수 있습니다(SPI 작업에는 // 영향을 미치지 않음). SPI.begin(); if (ts.touched()) { TS_Point p =ts.getPoint(); 지연(3); // 필터링을 위한 지연 SPI.end(); // ADC 코드로부터 좌표 x, y 계산 if (p.x <450) p.x =450; if (p.y <500) p.y =500; x =(uint16_t)(320L - ((uint32_t)p.x - 450L)*10L/106L); y =(uint16_t)(240L - ((uint32_t)p.y - 500L)*10L/140L); if (x <80) { // 왼쪽 버튼 =0x08; } else if (x> 240) { // 오른쪽 버튼 =0x10; } else if (y <120) { // 버튼 교체 =0x01; } 그렇지 않으면 버튼 =0x02; // 가을 } SPI.end(); 리턴 버튼;}

    일부 스크린샷:

    데모 비디오

    계속됩니다.

    관심을 가져 주셔서 감사합니다!

    이전 기사:

    1) Arduino Uno용 고유 TFT 쉴드 - 시작,

    2) Arduino Uno를 위한 고유한 TFT Shield - OV7670 Cam Live View,

    3) Arduino Uno를 위한 고유한 TFT Shield - Arduino Bluetooth 카메라(ABC).

    다음 기사:

    4) TFT SPI 디스플레이의 사진 및 RGB 비디오.

    2021년 4월 1일 업데이트:

    다시 안녕! 현재 두 개의 실드와 두 개의 브레이크아웃 보드로 구성된 일련의 화면에 대한 업데이트된 라이브러리가 있습니다. 스케치는 선택한 버전(1~4)과 마이크로 컨트롤러 유형(MegaAVR 또는 ESP-32)에 따라 컴파일됩니다. 사진, 예를 추가했습니다. 자세한 내용은 https://github.com/Ekaburg/EkaTFT에서 확인할 수 있습니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    라이브러리
    https://github.com/YATFT/YATFT

    제조공정

    1. ILI9341 TFT 터치스크린 디스플레이 실드의 비트맵 애니메이션
    2. 웹 운영 DMX 컨트롤러
    3. Arduino 스파이봇
    4. 꽃 - Arduino Nano, CrazyCircuits, DFRobot
    5. Arduino Nano:조이스틱으로 2개의 스테퍼 모터 제어
    6. START:독립형 ARduino 터미널
    7. Arduino Nano가 있는 휴대용 가이거 계수기
    8. 학교를 위한 SMART 온도 모니터링
    9. Arduino용 8비트 IO 포트 라이브러리
    10. BLUE_P:무선 Arduino 프로그래밍 실드