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

Menampilkan Gambar BMP dari Kartu SD pada TFT LCD Shield

Komponen dan persediaan

Arduino UNO
× 1

Tentang proyek ini

Halo, tutorial ini merupakan lanjutan dari 2 tutorial lainnya tentang LCD Shield 2.4″ TFT dengan Arduino UNO, jadi yang pertama tentang Interfacing dan memperbaiki masalah fungsi sentuh juga sumbu terbalik, lalu yang kedua tentang penggunaan fungsi sederhana menggambar berbagai bentuk dan cara membuat tombol sentuh untuk mengaktifkan beberapa fungsi…

Menghubungkan dan memperbaiki masalah sentuh di pelindung LCD Arduino TFT 2.4″

TFT LCD 2.4″ Tutorial pelindung layar sentuh

Tapi hari ini kita akan membaca gambar dari kartu SD dan menampilkannya di layar, pertama-tama jangan lupa mencolokkan kartu SD Anda dengan komputer Anda dan memformatnya sebagai FAT32, lalu mentransfer gambar Anda, jangan lupa bahwa itu seharusnya Format "BMP", Bitmap 24 !! Untuk mendapatkan gambar yang benar, resolusinya harus 240*320, sedikit penjelasan:

Ini adalah orientasi normal layar yang dapat Anda tampilkan gambar 240*320, ini adalah rotasi default yaitu setRotation(0);

Ini adalah orientasi layar jika Anda menyetelRotation(1); dan sekarang Anda dapat menampilkan gambar 320*240.

Jadi Anda dapat memilih apa pun yang sesuai untuk Anda, baik mengubah rotasi layar atau rotasi gambar pada PC Anda… lalu ingat atau salin nama gambar dan hanya itu, colokkan kartu SD Anda ke pelindung.

Itulah nama gambar bmp 24 bit saya di SD card untuk seperti "Img1" kami menyebutnya dalam kode dengan menggunakan "Img1.bmp".

Perpustakaan:

Ini adalah perpustakaan yang bekerja untuk saya:Unduh di sinijika Anda menggunakan perpustakaan ini tetapi ketika mencoba dengan kode contoh itu menunjukkan kepada Anda layar putih, Anda pasti harus mencari perpustakaan yang cocok untuk Anda.

Kode:

Berikut adalah kode-kode yang saya gunakan dalam format video in.ino, jangan lupa untuk mengubah nama file yang Anda gunakan. Jangan lupa untuk memeriksa tutorial jika Anda memerlukan bantuan.

  • Kode 1
  • Kode 2

Kode

  • TFT_Shield_SD_1.ino
  • TFT_Shield_SD_2.ino
TFT_Shield_SD_1.inoArduino
/*Kode ini digunakan dengan pelindung layar sentuh LCD TFT 2,4", kode ini membaca gambar bmp yang disimpan di kartu SD *dan menampilkannya di layar *Lihat SurtrTech.com untuk detail selengkapnya */#sertakan  // Pustaka grafis inti#include  // Pustaka khusus perangkat keras#include #include #define LCD_CS A3 // Pilihan Chip masuk ke Analog 3#define LCD_CD A2 // Perintah/Data masuk ke Analog 2#define LCD_WR A1 // LCD Write ke Analog 1#define LCD_RD A0 // Pembacaan LCD ke Analog 0#define SD_CS 10 //pin kartu SD pada perisai AndaAdafruit_TFTLCD tft(LCD_CS, LCD_CD , LCD_WR, LCD_RD, A4);pengaturan kosong(){ Serial.begin(9600); tft.reset(); pengenal uint16_t =tft.readID(); pinMode(10, OUTPUT); digitalWrite(10, HIGH); tft .begin(pengidentifikasi); if (!SD.begin(SD_CS)) { progmemPrintln(PSTR("gagal!")); return; } }void loop(){ bmpDraw("Logo.bmp", 0, 0); //Memanggil fungsi bmpDraw ("Name_of_your_image.bmp",x,y) (x,y) adalah posisi awal gambar drawi ng penundaan (2000); bmpDraw("Img2.bmp", 0, 0); penundaan(2000); bmpDraw("Img3.bmp", 0, 0); delay(2000);}#define BUFFPIXEL 20 //Kecepatan menggambar, 20 dimaksudkan untuk menjadi yang terbaik tetapi Anda dapat menggunakan 60 meskipun dibutuhkan banyak uno's RAM // Fungsi menggambar, membaca file dari kartu SD dan melakukan //konversi dan menggambar, juga menampilkan pesan pada monitor Serial jika ada masalah//Tidak ada yang menyentuh fungsi ini :Dvoid bmpDraw(char *nama file, int x, int y) { File bmpFile; int lebar bmp, tinggi bmp; // W+H dalam piksel uint8_t bmpDepth; // Kedalaman bit (saat ini harus 24) uint32_t bmpImageoffset; // Mulai dari data gambar dalam file uint32_t rowSize; // Tidak selalu =bmpWidth; mungkin memiliki padding uint8_t sdbuffer[3*BUFFPIXEL]; // piksel dalam buffer (R+G+B per piksel) uint16_t lcdbuffer[BUFFPIXEL]; // buffer keluar piksel (16-bit per piksel) uint8_t buffidx =sizeof(sdbuffer); // Posisi saat ini di sdbuffer boolean goodBmp =false; // Setel ke true pada header yang valid parse boolean flip =true; // BMP disimpan dari bawah ke atas int w, h, baris, col; uint8_t r, g, b; uint32_t pos =0, startTime =milis(); uint8_t lcdidx =0; boolean pertama =benar; if((x>=tft.width()) || (y>=tft.height())) kembali; Serial.println(); progmemPrint(PSTR("Memuat gambar '")); Serial.print(nama file); Serial.println('\''); // Buka file yang diminta pada kartu SD if ((bmpFile =SD.open(filename)) ==NULL) { progmemPrintln(PSTR("File tidak ditemukan")); kembali; } // Parsing header BMP if(read16(bmpFile) ==0x4D42) { // BMP signature progmemPrint(PSTR("Ukuran file:")); Serial.println(read32(bmpFile)); (batal) read32(bmpFile); // Baca &abaikan byte pembuat bmpImageoffset =read32(bmpFile); // Mulai dari program data gambarPrint(PSTR("Image Offset:")); Serial.println(bmpImageoffset, DEC); // Baca header DIB progmemPrint(PSTR("Ukuran header:")); Serial.println(read32(bmpFile)); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile) ==1) { // # planes -- harus '1' bmpDepth =read16(bmpFile); // bit per piksel progmemPrint(PSTR("Kedalaman Bit:")); Serial.println(Kedalaman bmp); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) { // 0 =tidak terkompresi goodBmp =true; // Format BMP yang didukung -- lanjutkan! progmemPrint(PSTR("Ukuran Gambar :")); Serial.print(lebar bmp); Serial.print('x'); Serial.println(bmpHeight); // Baris BMP diisi (jika diperlukan) hingga batas 4-byte rowSize =(bmpWidth * 3 + 3) &~3; // Jika bmpHeight negatif, gambar dalam urutan top-down. // Ini bukan kanon tetapi telah diamati di alam liar. if(bmpHeight <0) { bmpHeight =-bmpHeight; membalik =salah; } // Pangkas area yang akan dimuat w =bmpWidth; h =tinggi bmp; if((x+w-1)>=tft.width()) w =tft.width() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // Setel jendela alamat TFT ke batas gambar terpotong tft.setAddrWindow(x, y, x+w-1, y+h-1); for (row=0; row=sizeof(sdbuffer)) { // Memang // Dorong buffer LCD ke tampilan terlebih dahulu if(lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); lcdidx =0; pertama =salah; } bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffidx =0; // Atur indeks ke awal } // Konversi piksel dari format BMP ke TFT b =sdbuffer[buffidx++]; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; lcdbuffer[lcdidx++] =tft.color565(r,g,b); } // end pixel } // end scanline // Tulis data yang tersisa ke LCD if(lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); } progmemPrint(PSTR("Dimuat di ")); Serial.print(millis() - startTime); Serial.println("ms"); } // end goodBmp } } bmpFile.close(); if(!goodBmp) progmemPrintln(PSTR("BMP format not known."));}// Ini membaca tipe 16- dan 32-bit dari file kartu SD.// Data BMP disimpan little-endian, Arduino sedikit -endian too.// Mungkin perlu membalik urutan subscript jika porting di tempat lain.uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&hasil)[1] =f.read(); // MSB mengembalikan hasil;}uint32_t read32(File f) { hasil uint32_t; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&hasil)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSB mengembalikan hasil;}// Salin string dari flash ke port serial// Sumber string HARUS berada di dalam deklarasi PSTR()!void progmemPrint(const char *str) { char c; while(c =pgm_read_byte(str++)) Serial.print(c);}// Sama seperti di atas, dengan trailing newlinevoid progmemPrintln(const char *str) { progmemPrint(str); Serial.println();}
TFT_Shield_SD_2.inoArduino
/*Kode ini dimaksudkan untuk pelindung layar sentuh LCD TFT 2,4" dengan papan UNO * Ini membuat tampilan slide kecil dari gambar yang berubah tergantung di mana Anda menekan layar * Gambar dibaca dari kartu SD * Lihat ke SurtrTech.com untuk detail lebih lanjut */#include  // Pustaka grafis inti#include  // Pustaka khusus perangkat keras#include #include  #include  //Perpustakaan fungsi layar sentuh#if didefinisikan(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal#endif//Parameter di bawah tergantung pada pelindung Anda jadi pastikan pinnya benar#define YP A3 // harus pin analog, gunakan notasi "An"! #define XM A2 // harus pin analog, gunakan notasi "An"!#define YM 9 // bisa pin digital#define XP 8 // bisa menjadi pin digital//Jangan lupa jika fungsi sentuh Anda tidak berfungsi periksa nilai di atas mungkin (A1 A2 7 6) resp// Kalibrasi nilai yang Anda dapat ant jalankan kode kalibrasi terlebih dahulu dan tentukan titik-titik tersebut#define TS_MINX 176#define TS_MINY 159#define TS_MAXX 921#define TS_MAXY 884#define MINPRESSURE 10#define MAXPRESSURE 1000TouchScreen ts =TouchScreen(XP, YP, 300); #define LCD_CS A3 // Pemilihan Chip ke Analog 3#define LCD_CD A2 // Perintah/Data ke Analog 2#define LCD_WR A1 // Penulisan LCD ke Analog 1#define LCD_RD A0 // Pembacaan LCD ke Analog 0# define SD_CS 10 // Setel baris pilih chip ke apa pun yang Anda gunakanAdafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, A4);char x[]="x1.bmp";/*Di sini, dalam kode ini saya mendeklarasikan nama sebagai Array * Jadi saya dapat melakukan modifikasi jika saya ingin menggulir * Pastikan gambar Anda memiliki angka seperti "1" sehingga Anda dapat menambah atau menguranginya * untuk pergi ke gambar berikutnya */void setup(){ Serial.begin( 9600); tft.reset(); pengenal uint16_t =tft.readID(); pinMode(10, OUTPUT); digitalWrite(10, TINGGI); tft.begin(pengidentifikasi); if (!SD.begin(SD_CS)) { progmemPrintln(PSTR("gagal!")); kembali; } tft.setRotation(1); //Untuk melakukan rotasi 90 layar bmpDraw(x, 0, 0); //kita menggambar gambar pertama yaitu x -> "x1.bmp" seperti yang kita nyatakan}void loop(){if(x[1]<49) //Jadi kita tidak pergi ke beberapa nilai aneh yang saya tambahkan di sini reset nilaix[1]=49; //Jika kita sudah ada di gambar pertama kita tinggal di sana, sama untuk lastif(x[1]>52) //"1" di char adalah "49" dan "4" adalah "52" saya menulisnya di format ini agar saya dapat memanipulasinyax[1]=52; TSPoint p =ts.getPoint(); //memeriksa apakah pengguna menyentuh layar pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); if (pz> MINPRESSURE &&pz  0 &&py <100 ){ Serial.println("Kiri"); //Saya melakukan ini untuk menunjukkan pada monitor serial bahwa saya menekan kiri x[1]=x[1]-1; //di sini kita mengubah nama file yang ingin kita baca x[]="x1.bmp" dan x[1] adalah 1 dalam nama dan x[0] adalah x bmpDraw(x, 0, 0); //Jadi yang saya lakukan hanyalah menambahnya menjadi 2 atau menguranginya menjadi 0 (lihat "jika" pertama untuk melihat solusi untuk kasus ini karena 0 tidak ada) delay(300); //Lalu saya menggambar gambar yang sekarang memiliki nama yang berbeda tergantung di sisi mana saya menekan } //Menambahkan sedikit penundaan sehingga deteksi sentuhan tidak akan memantul lagi if(py>200 &&py <320){ Serial.println("Benar "); x[1]=x[1]+1; bmpDraw(x, 0, 0); penundaan (300); { Berkas bmp Berkas; int lebar bmp, tinggi bmp; // W+H dalam piksel uint8_t bmpDepth; // Kedalaman bit (saat ini harus 24) uint32_t bmpImageoffset; // Mulai dari data gambar dalam file uint32_t rowSize; // Tidak selalu =bmpWidth; mungkin memiliki padding uint8_t sdbuffer[3*BUFFPIXEL]; // piksel dalam buffer (R+G+B per piksel) uint16_t lcdbuffer[BUFFPIXEL]; // buffer keluar piksel (16-bit per piksel) uint8_t buffidx =sizeof(sdbuffer); // Posisi saat ini di sdbuffer boolean goodBmp =false; // Setel ke true pada header yang valid parse boolean flip =true; // BMP disimpan dari bawah ke atas int w, h, baris, col; uint8_t r, g, b; uint32_t pos =0, startTime =milis(); uint8_t lcdidx =0; boolean pertama =benar; if((x>=tft.width()) || (y>=tft.height())) kembali; Serial.println(); progmemPrint(PSTR("Memuat gambar '")); Serial.print(nama file); Serial.println('\''); // Buka file yang diminta pada kartu SD if ((bmpFile =SD.open(filename)) ==NULL) { progmemPrintln(PSTR("File tidak ditemukan")); kembali; } // Parsing header BMP if(read16(bmpFile) ==0x4D42) { // BMP signature progmemPrint(PSTR("Ukuran file:")); Serial.println(read32(bmpFile)); (batal) read32(bmpFile); // Baca &abaikan byte pembuat bmpImageoffset =read32(bmpFile); // Mulai dari program data gambarPrint(PSTR("Image Offset:")); Serial.println(bmpImageoffset, DEC); // Baca header DIB progmemPrint(PSTR("Ukuran header:")); Serial.println(read32(bmpFile)); bmpWidth =read32(bmpFile); bmpHeight =read32(bmpFile); if(read16(bmpFile) ==1) { // # planes -- harus '1' bmpDepth =read16(bmpFile); // bit per piksel progmemPrint(PSTR("Kedalaman Bit:")); Serial.println(Kedalaman bmp); if((bmpDepth ==24) &&(read32(bmpFile) ==0)) { // 0 =tidak terkompresi goodBmp =true; // Format BMP yang didukung -- lanjutkan! progmemPrint(PSTR("Ukuran Gambar :")); Serial.print(lebar bmp); Serial.print('x'); Serial.println(bmpHeight); // Baris BMP diisi (jika diperlukan) hingga batas 4-byte rowSize =(bmpWidth * 3 + 3) &~3; // Jika bmpHeight negatif, gambar dalam urutan top-down. // Ini bukan kanon tetapi telah diamati di alam liar. if(bmpHeight <0) { bmpHeight =-bmpHeight; membalik =salah; } // Pangkas area yang akan dimuat w =bmpWidth; h =tinggi bmp; if((x+w-1)>=tft.width()) w =tft.width() - x; if((y+h-1)>=tft.height()) h =tft.height() - y; // Setel jendela alamat TFT ke batas gambar terpotong tft.setAddrWindow(x, y, x+w-1, y+h-1); for (row=0; row=sizeof(sdbuffer)) { // Memang // Dorong buffer LCD ke tampilan terlebih dahulu if(lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); lcdidx =0; pertama =salah; } bmpFile.read(sdbuffer, sizeof(sdbuffer)); buffidx =0; // Atur indeks ke awal } // Konversi piksel dari format BMP ke TFT b =sdbuffer[buffidx++]; g =sdbuffer[buffidx++]; r =sdbuffer[buffidx++]; lcdbuffer[lcdidx++] =tft.color565(r,g,b); } // end pixel } // end scanline // Tulis data yang tersisa ke LCD if(lcdidx> 0) { tft.pushColors(lcdbuffer, lcdidx, first); } progmemPrint(PSTR("Dimuat di ")); Serial.print(millis() - startTime); Serial.println("ms"); } // end goodBmp } } bmpFile.close(); if(!goodBmp) progmemPrintln(PSTR("format BMP tidak dikenali."));}// Ini membaca tipe 16- dan 32-bit dari file kartu SD.// Data BMP disimpan little-endian, Arduino sedikit -endian too.// Mungkin perlu membalik urutan subscript jika porting di tempat lain.uint16_t read16(File f) { uint16_t result; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&hasil)[1] =f.read(); // MSB mengembalikan hasil;}uint32_t read32(File f) { hasil uint32_t; ((uint8_t *)&result)[0] =f.read(); // LSB ((uint8_t *)&hasil)[1] =f.read(); ((uint8_t *)&result)[2] =f.read(); ((uint8_t *)&result)[3] =f.read(); // MSB mengembalikan hasil;}// Salin string dari flash ke port serial// Sumber string HARUS berada di dalam deklarasi PSTR()!void progmemPrint(const char *str) { char c; while(c =pgm_read_byte(str++)) Serial.print(c);}// Sama seperti di atas, dengan trailing newlinevoid progmemPrintln(const char *str) { progmemPrint(str); Serial.println();}

Skema

itu tameng :D

Proses manufaktur

  1. Kartu Ucapan
  2. Kartu Kredit
  3. Liquid Crystal Display (LCD)
  4. MODUL DATA:Layar TFT ultra-meregangkan 23.1” dengan kontrol cerdas
  5. Distec:layar TFT 7 inci yang kuat dan dapat dibaca di bawah sinar matahari dari Ortustech
  6. Acceed:GPU-PC mendapatkan kinerja dari kartu grafis
  7. Pameran:Tampilan Primal
  8. Kuman TFT 3.5 RetroPie 2018
  9. AI Menghasilkan Gambar Makanan Selesai Dari Resep Sederhana Berbasis Teks
  10. Hindari The Defs!