Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

TFT Shield untuk Arduino Nano - Mulai

Komponen dan persediaan

Arduino Nano R3
× 1
2,8" TFT SPI 320x240
× 1
Pelindung TFT untuk Arduino Nano
× 1

Tentang proyek ini

Ceritanya

Hampir tidak ada orang yang belum pernah melihat dan tidak tahu apa itu tampilan warna. Dan, mungkin, banyak yang telah (atau ingin melakukan) beberapa proyek di Arduino menggunakan tampilan warna. Terlebih lagi, pajangan seperti itu saat ini sangat tersebar luas dan terjangkau. Ada banyak tampilan yang berbeda dalam resolusi, ukuran layar, antarmuka. Saya ingin membahas salah satu pajangan ini. Kami akan tertarik pada tampilan dengan antarmuka SPI, resolusi 320x240 piksel dan ukuran diagonal layar 2,8 "(serta 2,4" dan 3,2 "). Antarmuka SPI sangat nyaman untuk dihubungkan ke mikrokontroler, karena memiliki sejumlah kecil garis sinyal. Dan kecepatan SPI memungkinkan Anda memperbarui konten layar dengan cepat. Secara umum, banyak keuntungan. Tetapi ada saat-saat yang tidak nyaman. Misalnya, perlu untuk lebih mengoordinasikan level logika dalam hal menghubungkan layar ke papan Arduino dengan daya 5 volt. Untuk koneksi yang cepat dan mudah dari salah satu layar ini (dengan antarmuka SPI) ke Arduino Nano, kami akan menggunakan sedikit biaya - pelindung TFT.

Perisai ini adalah versi kedua (ringan, untuk Arduino Nano) dari TFT Shield untuk Arduino Uno, yang dapat Anda baca di sini dan di sini dan di sini.

Deskripsi singkat tentang pelindung TFT:

  • Ukuran papan adalah 64x49 mm,
  • Konektor 30-pin untuk menghubungkan Arduino Nano,
  • Konektor 14-pin untuk menyambungkan layar TFT 320x240 dengan antarmuka SPI (termasuk layar sentuh),
  • Konektor untuk kartu microSD,
  • Konektor untuk modul Bluetooth (HC-06),
  • Konektor 20-pin untuk kamera OV7670 (serta lainnya),
  • Konektor USB mini, serta konektor 2 pin terpisah untuk catu daya 5V.

Jadi, mari kita mulai.

Perakitan

Merakit papan sangat sederhana. Tetapi harus berhati-hati untuk membaca penunjukan kontak sebelum pemasangan. Pertama, Anda perlu memasang papan Arduino Nano seperti yang ditunjukkan pada foto. Setelah itu, layar terhubung, yang dapat dihubungkan baik di satu sisi papan (metode 1 ) dan di sisi lain (metode 2 ). Setelah itu, Anda dapat menghubungkan daya dengan kabel mini USB. Berikut foto-fotonya.

Metode 1:

Metode 2:

Setelah perakitan, Anda dapat melanjutkan ke pengunduhan sketsa, tetapi sebelum ini jangan lupa untuk menginstal perpustakaan yang diperlukan untuk bekerja dengan pelindung TFT. Perpustakaan terletak di tautan:https://github.com/YATFT/YATFT.

Demo 1. Grafik dan teks.

Bab ini memberikan contoh bekerja dengan teks, grafik, dan layar sentuh. Direkomendasikan untuk kenyamanan bahwa Anda terlebih dahulu memprogram papan Arduino Nano secara terpisah dan kemudian merakit perangkat (tetapi Anda juga dapat memprogram papan sebagai bagian dari perangkat). Sketsa untuk bekerja dengan teks dan grafik:

/****************************************** ************************************ PERANGKAT LUNAK DAN DOKUMENTASI DISEDIAKAN "SEBAGAIMANA ADANYA" TANPA JAMINAN APAPUN* JENIS, BAIK TERSURAT MAUPUN TERSIRAT, TERMASUK TANPA BATAS, JAMINAN* APAPUN UNTUK DIPERDAGANGKAN, JUDUL, NON-PELANGGARAN DAN KESESUAIAN UNTUK TUJUAN* TERTENTU. DALAM KEADAAN APA PUN PENULIS ATAU PEMBERI LISENSINYA TIDAK AKAN BERTANGGUNG JAWAB ATAU* DIWAJIBKAN BERDASARKAN KONTRAK, KELALAIAN, TANGGUNG JAWAB KETAT, KONTRIBUSI,* PELANGGARAN JAMINAN, ATAU TEORI SAMA HUKUM LAINNYA YANG TIDAK LANGSUNG ATAU TIDAK LANGSUNG TERHADAP KERUSAKAN SECARA TIDAK LANGSUNG ,* KERUSAKAN TIDAK LANGSUNG, HUKUMAN ATAU KONSEKUENSIAL, KEHILANGAN KEUNTUNGAN ATAU KEHILANGAN DATA,* BIAYA PENGADAAN BARANG PENGGANTI, TEKNOLOGI, JASA, ATAU* KLAIM APA PUN OLEH PIHAK KETIGA (TERMASUK NAMUN TIDAK TERBATAS PADA PIHAK KETIGA), .************************************************* ******************************/#termasuk  // Perpustakaan khusus perangkat keras#termasuk  // Sertakan library Adafruit-GFX#include  // Sertakan font Adafruit#include #include YATFT tft(0);uint32_t total_time;uint16_t Warna[4] ={BRIGHTBLUE, BRIGHTGREEN, BRIGHTRED, BRIGHTYELLOW};uint16_t Gray[7] ={GRAY0, GRAY1, GRAY2, GRAY3, GRAY4, GR AY5, GRAY6};/****************************************** **********************************/void ClearScreen (void){ tft.SetColor(HITAM); // Atur warna font tft.ClearDevice(); // Isi semua layar}pengaturan kosong(){ Serial.begin(115200); // inisialisasi port serial Serial.println("Arduino TFT_shield Contoh 1!"); tft.mulai(); // inisialisasi tampilan}void loop(){ uint16_t x, y, x2, y2, mask_gray; uint16_t saya; ClearScreen(); // Font Serial.print("1) Lihat Font ("); total_waktu =milis(); tft.SetColor(BIRU TERANG); tft.SetFont(NULL); tft.OutTextXY(5, 5, "Demonstrasi pekerjaan dengan tampilan TFT."); tft.SetColor(HIJAU CERAH); tft.SetFont(&GratisSerif9pt7b); tft.OutTextXY(5, 20, "Contohnya menggunakan font dari Adafruit."); tft.SetFont(&FreeSerifItalic24pt7b); tft.SetColor(BRIGHTCYAN); tft.OutTextXY(5, 45, "3,5''"); tft.SetColor(MERAH); tft.OutTextXY(90, 45, "QVGA"); tft.SetColor(BRIGHTMAGENTA); tft.OutTextXY(230, 45, "disp."); tft.SetColor(KUNING CERAH); tft.SetFont(&FreeSans24pt7b); tft.OutTextXY(5, 100, "A R D U I N O + T F T"); tft.SetFont(NULL); for (i =0; i <7; i++) { tft.SetColor(Abu-abu[i]); tft.OutTextXY(5, 170+10*i, "Demonstrasi pekerjaan dengan tampilan TFT."); } PrintTotalTime(); penundaan(3000); ClearScreen(); // Lingkaran Serial.print("2) Gambar lingkaran ("); total_waktu =milis(); tft.SetColor(MERAH); for (i =10; i >1; i +=10) { tft.DrawCirc(GetMaxX()>>1, GetMaxY()>>1, i); } PrintTotalTime(); penundaan (1000); // DrawFillCircle &DrawFillRect Serial.print("3) Draw FillCircle dan FillRect ("); total_waktu =milis(); tft.SetColor(MERAH); tft.DrawFillCirc(GetMaxX()>>1,GetMaxY()>>1.110); tft.SetColor(BRIGHTCYAN); tft.DrawFillRect(GetMaxX()/2-77,GetMaxY()/2-77, GetMaxX()/2+77,GetMaxY()/2+77); tft.SetColor(HIJAU CERAH); tft.DrawFillCirc(GetMaxX()>>1,GetMaxY()>>1,77); tft.SetColor(BRIGHTMAGENTA); tft.DrawFillRect(GetMaxX()/2-54,GetMaxY()/2-54, GetMaxX()/2+54,GetMaxY()/2+54); tft.SetColor(BIRU TERANG); tft.DrawFillCirc(GetMaxX()>>1,GetMaxY()>>1,54); tft.SetColor(KUNING CERAH); tft.DrawFillRect(GetMaxX()/2-37,GetMaxY()/2-37, GetMaxX()/2+37,GetMaxY()/2+37); CetakTotalWaktu(); penundaan (1000); ClearScreen(); // Arc Serial.print("4) Gambar Arc ("); total_waktu =milis(); ClearScreen(); tft.SetColor(BIRU TERANG); tft.DrawArc((GetMaxX()>>1)-60,(GetMaxY()>>1)-60,(GetMaxX()>>1)+60,(GetMaxY()>>1)+60,20, 30,0xFF); tft.SetColor(HIJAU CERAH); tft.DrawArc((GetMaxX()>>1)-40,(GetMaxY()>>1)-40,(GetMaxX()>>1)+40,(GetMaxY()>>1)+40,20, 30,0xFF); tft.SetColor(MERAH); tft.DrawArc((GetMaxX()>>1)-20,(GetMaxY()>>1)-20,(GetMaxX()>>1)+20,(GetMaxY()>>1)+20,20, 30,0xFF); CetakTotalWaktu(); penundaan (1000); Serial.print("5) Gambar FillBevel ("); total_waktu =milis(); tft.SetColor(BIRU TERANG); tft.DrawFillBevel((GetMaxX()>>1)-60,(GetMaxY()>>1)-60,(GetMaxX()>>1)+60,(GetMaxY()>>1)+60,30); tft.SetColor(HIJAU CERAH); tft.DrawFillBevel((GetMaxX()>>1)-40,(GetMaxY()>>1)-40,(GetMaxX()>>1)+40,(GetMaxY()>>1)+40,30); tft.SetColor(MERAH); tft.DrawFillBevel((GetMaxX()>>1)-20,(GetMaxY()>>1)-20,(GetMaxX()>>1)+20,(GetMaxY()>>1)+20,30); CetakTotalWaktu(); penundaan (1000); ClearScreen(); Serial.print("6) Gambar Busur ("); total_waktu =milis(); 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< 

Beberapa tangkapan layar:

Demo 2. Layar sentuh.

/****************************************** ************************************ PERANGKAT LUNAK DAN DOKUMENTASI DISEDIAKAN "SEBAGAIMANA ADANYA" TANPA JAMINAN APAPUN* JENIS, BAIK TERSURAT MAUPUN TERSIRAT, TERMASUK TANPA BATAS, JAMINAN* APAPUN UNTUK DIPERDAGANGKAN, JUDUL, NON-PELANGGARAN DAN KESESUAIAN UNTUK TUJUAN* TERTENTU. DALAM KEADAAN APA PUN PENULIS ATAU PEMBERI LISENSINYA TIDAK AKAN BERTANGGUNG JAWAB ATAU* DIWAJIBKAN BERDASARKAN KONTRAK, KELALAIAN, TANGGUNG JAWAB KETAT, KONTRIBUSI,* PELANGGARAN JAMINAN, ATAU TEORI SAMA HUKUM LAINNYA YANG TIDAK LANGSUNG ATAU TIDAK LANGSUNG TERHADAP KERUSAKAN SECARA TIDAK LANGSUNG ,* KERUSAKAN TIDAK LANGSUNG, HUKUMAN ATAU KONSEKUENSIAL, KEHILANGAN KEUNTUNGAN ATAU KEHILANGAN DATA,* BIAYA PENGADAAN BARANG PENGGANTI, TEKNOLOGI, JASA, ATAU* KLAIM APA PUN OLEH PIHAK KETIGA (TERMASUK NAMUN TIDAK TERBATAS PADA PIHAK KETIGA), .************************************************* ******************************/#termasuk  // Perpustakaan khusus perangkat keras#termasuk  // Sertakan pustaka SPI#sertakan  // Sertakan pustaka Layar Sentuh#sertakan  // Sertakan pustaka Adafruit-GFX#sertakan  // Sertakan font Adafruit#sertakan #include // Layar sentuh: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()/* Jika menggunakan perisai, semua jalur kontrol dan data diperbaiki, dan deklarasi yang lebih sederhana opsional dapat digunakan:*/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 =PUTIH;tombol uint8_t =0;uint16_t Warna[4] ={BRIGHTBLUE, BRIGHTGREEN, BRIGHTRED, BRIGHTYELLOW};uint16_t Grey[7] ={GRAY0, GRAY1, GRAY2, GRAY3, GRAY3 GRAY5, GRAY6};/****************************************** ************************************************** ***/void ClearScreen (batal){ tft.SetColor(HITAM); // Atur warna font tft.ClearDevice(); // Isi semua layar}pengaturan kosong(){ Serial.begin(115200); // inisialisasi port serial Serial.println("Arduino TFT_shield Example1!"); ts.mulai(); // Init SPI Layar Sentuh.end(); // Nonaktifkan SPI untuk pekerjaan yang benar DB2 (SS) pin tft.begin(); // menginisialisasi tampilan RefreshWindow();}void loop(){ uint16_t x, y; // Sentuh // Saat pin SS diset sebagai OUTPUT, pin dapat digunakan sebagai // port output tujuan umum (tidak mempengaruhi // operasi SPI). SPI.mulai(); if (ts.touched()) { TS_Point p =ts.getPoint(); Serial.print(F("Tekanan =")); Serial.print(hal.z); Serial.print(F(", x =")); Serial.print(p.x); Serial.print(F(", y =")); Serial.print(p.y); Serial.println(); penundaan (3); // Penundaan untuk memfilter SPI.end(); // Nonaktifkan SPI untuk pekerjaan yang benar pin DB2 (SS) // Hitung koordinat x, y dari kode ADC Serial.print(F("Pressure =")); Serial.print(hal.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); Serial.println(); jika (p.x <350) p.x =350; jika (p.x> 3850) p.x =3850; jika (p.y <250) p.y =250; jika (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); // Memfilter 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  

Beberapa tangkapan layar:

Demo 3. Permainan logika "Kolom".

/****************************************** ************************************ PERANGKAT LUNAK DAN DOKUMENTASI DISEDIAKAN "SEBAGAIMANA ADANYA" TANPA JAMINAN APAPUN* JENIS, BAIK TERSURAT MAUPUN TERSIRAT, TERMASUK TANPA BATAS, JAMINAN* APAPUN UNTUK DIPERDAGANGKAN, JUDUL, NON-PELANGGARAN DAN KESESUAIAN UNTUK TUJUAN* TERTENTU. DALAM KEADAAN APA PUN PENULIS ATAU PEMBERI LISENSINYA TIDAK AKAN BERTANGGUNG JAWAB ATAU* DIWAJIBKAN BERDASARKAN KONTRAK, KELALAIAN, TANGGUNG JAWAB KETAT, KONTRIBUSI,* PELANGGARAN JAMINAN, ATAU TEORI SAMA HUKUM LAINNYA YANG TIDAK LANGSUNG ATAU TIDAK LANGSUNG TERHADAP KERUSAKAN SECARA TIDAK LANGSUNG ,* KERUSAKAN TIDAK LANGSUNG, HUKUMAN ATAU KONSEKUENSIAL, KEHILANGAN KEUNTUNGAN ATAU KEHILANGAN DATA,* BIAYA PENGADAAN BARANG PENGGANTI, TEKNOLOGI, JASA, ATAU* KLAIM APA PUN OLEH PIHAK KETIGA (TERMASUK NAMUN TIDAK TERBATAS PADA PIHAK KETIGA), .************************************************* ******************************/#sertakan #sertakan #sertakan #sertakan  // Pustaka grafis inti#sertakan #sertakan #define CS_PIN A0// MOSI=11, MISO=12, SCK=13XPT2046_Touchscreen ts (CS_PIN, 255);YATFT tft(0);/* Jika menggunakan pelindung, semua jalur kontrol dan data diperbaiki, dan deklarasi yang lebih sederhana dapat digunakan secara opsional :*/long randNumber;#menentukan KEY_EMPTY 0#mendefinisikan KEY_SWAP 1#menentukan KEY_FALL 2#menentukan KEY_LEFT 3#menentukan KEY_RIGHT 4#menentukan DISPLAY_MAX_X 320#menentukan DISPLAY_MAX_Y 240#menentukan MaxCol 8 #menentukan MaxCol 8 #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 + 2)#definisikan 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, Level Lama, tr, flfirst=1;uint16_t MasCol[]={PUTIH, HITAM, TERANG , BRIGHTBLUE, BRIGHTGREEN, BRIGHTYELLOW, BRIGHTMAGENTA, BRIGHTCYAN};Penghitung panjang yang tidak ditandatangani,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 MasSpeed[MaxLevel]={500,450,400,350,300,250,200,100};/************ ************************************************** ****/void setup(void){ // menginisialisasi port serial Serial.begin(115200); Serial.println("Contoh TFT_shield_Game1!"); ts.mulai(); // Init SPI Layar Sentuh.end(); tft.mulai(); // menginisialisasi tampilan randomSeed(analogRead(5)); tft.SetColor(PUTIH); tft.ClearDevice(); tft.SetColor(MERAH); tft.SetFont(&GratisSerif9pt7b); tft.OutTextXY( 20, 20, "TINGKAT"); tft.OutTextXY(240, 20, "BERIKUTNYA"); tft.OutTextXY( 20, 75, "SCORE"); tft.OutTextXY( 25, 130, "ATAS"); FlBaru =benar; LihatStacan(); DapatkanSelanjutnya(); penundaan(100); tft.SetColor(HITAM); 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);}void loop(void){ if (Demo) ProcDemo(); else { if (Arbeiten) { penundaan saya(kecepatan suhu); figmove(0,1); } else if (mypush()==KEY_SWAP) NewGame(); }}uint8_t mypush(void){ unsigned long tpr =milis(); uint8_t res =KUNCI_KOSONG; tombol uint8_t =0; uint8_t button_old statis; statis uint8_t cnt =0; tombol =Sentuh(); if (tombol) { cnt =5; Serial.print("Tombol Pindai:"); Serial.print(tombol, HEX); Serial.println(); if (button !=button_old) { if (button &0x01) res =KEY_SWAP; if (tombol &0x02) res =KEY_FALL; if (tombol &0x04) {}; if (tombol &0x08) res =KEY_LEFT; if (tombol &0x10) res =KUNCI_KANAN; button_old =tombol; } } if (!cnt) { button_old =tombol; } else { cnt--; } kembali(res); }void ViewQuad(uint8_t i,uint8_t j,uint8_t mycolor){ if (j<3) kembali; uint16_t wy =DISP_TOP + SmeY + (j-3)*razmer - j; uint16_t wx =DISP_LEFT + SmeX + i*razmer - i; if (warnaku!=0) { tft.SetColor(HITAM); tft.DrawRect(wx, wy, wx+razmer-1, wy+razmer-1); tft.SetColor(MasCol[warnaku]); tft.DrawFillRect(wx+1, wy+1, wx+1+razmer-3, wy+1+razmer-3); } else { tft.SetColor(PUTIH); tft.DrawFillRect(wx+1, wy+0, wx+1+razmer-3, wy+1+razmer-3); }}void ViewStacan(void){ char myStr2[5]; uint8_t h =tft.GetTextHeight(&FreeMonoBoldOblique12pt7b); tft.SetFont(&GratisMonoBoldOblique12pt7b); if (Skor Lama!=Skor || FlBaru) { sprintf(myStr2,"%05d",Skor); int16_t w =tft.GetTextWidth(myStr2, &FreeMonoBoldOblique12pt7b); tft.SetColor(PUTIH); tft.DrawFillRect(20,100,20+w+5,100+h); tft.SetColor(HIJAU); tft.OutTextXY(20.100,myStr2); Skor Lama=Nilai; } if (OldRecord!=Record || FlNew) { sprintf(myStr2,"%05d",Record ); int16_t w =tft.GetTextWidth(myStr2, &FreeMonoBoldOblique12pt7b); tft.SetColor(PUTIH); tft.DrawFillRect(20,155,20+w+5,155+j); tft.SetColor(HIJAU); tft.OutTextXY(20,155,myStr2); OldRecord=Rekam; } if (Level Lama!=Level || FlBaru) { sprintf(myStr2,"%01d",Level ); int16_t w =tft.GetTextWidth(myStr2, &FreeMonoBoldOblique12pt7b); tft.SetColor(PUTIH); tft.DrawFillRect(25,45,25+w+5,45+h); tft.SetColor(HIJAU); tft.OutTextXY(25,45,myStr2); Tingkat Lama=Tingkat; } FlBaru=salah; for (byte j=3;j=0 &&ny>=0 &&nx1 || MasTmp[i][j]>2 )) { MasTmp[nx][ny]=3; MasTmp[i][j]=3; } else if (mode==3 &&MasTmp[nx][ny]==3) { if (MasTmp[i][j]!=3) { MasTmp[i][j]=3; f =benar; } } }}void Sos(int i,int j, mode byte){ for (byte k=0;k<4;k++) Sosed(i,j,mmm[k][0],mmm[k][1 ],mode); }bool FindFull(void){ byte i,j,k; bool res; res =salah; for (byte k=2;k<8;k++) { ClearMas(MasTmp); for (j=3;j1) Sos(i,j,2); lakukan { fl=salah; for (j=3;j0) Sos(i,j,3); } sementara (fl); for (j=3;j0) { ViewStacan(); FlZ=benar; penundaan lama(500); } for (j=0;jMaxLevel) Level=Level Maks; } tempspeed=MasSpeed[Level-1]; }}kosongkan SkorSaya(kosong){ TScore=0; while(FindFull()) { jika (TScore>7) Skor=Skor+TScore+(TScore-8)*2; lain Skor =Skor + TScore; LihatStacan(); FlZ=benar; penundaan lama(1000); } FlZ=false;}batal ProcDemo(batal){ Skor=0; DapatkanSelanjutnya(); untuk (byte j=3;jMaxCol-1) return(false); if (dx!=0) if (MasSt[x+dx][y+dy+2]==0) return(true); lain kembali (salah); if (dy>0) { if (y+dy+2>MaxRow-1 || MasSt[x+dx][y+dy+2]>0) { if (y<3) gameover(); lain ff=benar; } else { for (byte i=0;i<3;i++) MasSt[x][y+2-i+dy]=MasSt[x][y+2-i]; MasSt[x][y]=0; y=y+dy; } if (ff) { Skorku(); DapatkanSelanjutnya(); } ViewStacan(); } return(true);}uint8_t Sentuh(void){ uint16_t x, y; tombol uint8_t =0; // Sentuh // Saat pin SS diset sebagai OUTPUT, pin dapat digunakan sebagai // port output tujuan umum (tidak mempengaruhi // operasi SPI). SPI.mulai(); if (ts.touched()) { TS_Point p =ts.getPoint(); penundaan (3); // Penundaan untuk memfilter SPI.end(); // Hitung koordinat x,y dari kode ADC jika (p.x <450) p.x =450; jika (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) { // Tombol kiri =0x08; } else if (x> 240) { // Tombol kanan =0x10; } else if (y <120) { // Tombol tukar =0x01; } tombol lain =0x02; // Jatuh } SPI.end(); tombol kembali;} 

Beberapa tangkapan layar:

Video demo

Bersambung.

Terima kasih atas perhatiannya!

Artikel sebelumnya:

1) Perisai TFT Unik untuk Arduino Uno - Mulai,

2) Perisai TFT Unik untuk Arduino Uno - Tampilan Langsung Cam OV7670,

3) Perisai TFT Unik untuk Arduino Uno - Kamera Bluetooth Arduino (ABC).

Artikel berikutnya:

4) Foto dan video RGB pada layar TFT SPI.

Pembaruan 01.04.2021:

Halo lagi! Ada perpustakaan yang diperbarui untuk serangkaian layar, yang saat ini terdiri dari dua perisai dan dua papan breakout. Sketsa dikompilasi tergantung pada versi yang dipilih (dari 1 hingga 4) dan jenis mikrokontroler (MegaAVR atau ESP-32). Menambahkan foto, contoh. Informasi lebih lanjut dapat ditemukan di https://github.com/Ekaburg/EkaTFT.

Kode

Perpustakaan
https://github.com/YATFT/YATFT

Proses manufaktur

  1. Animasi Bitmap Pada ILI9341 TFT Touchscreen Display Shield
  2. Pengontrol DMX yang Dioperasikan Web
  3. Arduino Spybot
  4. Bunga - Arduino Nano, CrazyCircuits, DFRobot
  5. Arduino Nano:Kontrol 2 Motor Stepper Dengan Joystick
  6. MULAI:Terminal ARduino STandalone
  7. Penghitung Geiger Genggam dengan Arduino Nano
  8. Pemantauan Suhu CERDAS untuk Sekolah
  9. Perpustakaan Port IO 8-Bit untuk Arduino
  10. BLUE_P:Perisai Pemrograman Arduino Nirkabel