ArduinoTFTLCD應用

ArduinoTFTLCD應用

  • ArduinoTFTLCD應用
    • 硬件連接
    • 軟件
      • 導入庫
      • 顯示數字、字符
      • 顯示漢字
        • 方案1
        • 方案2
      • 顯示圖片
    • 總結

ArduinoTFTLCD應用

對于手工喜歡DIY的人來說,Arduino驅動的TFTLCD被很多人使用,此處就總結一下,使用的是VScodePlatformIO插件驅動的Arduino,芯片使用的是ESP32

硬件連接

這里采用的是10PIN的ST7789驅動的TFTLCD屏幕,是硬件SPI驅動的。

????????TFTLCD硬件管腳
在這里插入圖片描述
????????ESP32硬件管腳
在這里插入圖片描述
我們連接的是ESP32的HSPI引腳。

功能TFTLCD引腳ESP32引腳
數據輸出MOSI13
時鐘SCLK14
片選CS15
選擇端口DC2
復位引腳RST4
背光正BL12
電源地GNDGND
背光負GNDGND
電壓正VCCVCC

有些SPI是這樣標注的,引腳都是一樣的。

字符1字符2功能
CSCS片選,低電平使能
DCRS數據/命令選擇端口,DC端口為低時,寫入的是命令;為高時,寫入的是數據
RSTRESET復位信號,低電平復位
MISOSDA從設備數據輸出
MOSISDI主設備數據輸出
SCLKSCL時鐘,由主設備發出

按照如圖所示進行硬件連接。

軟件

????????使用的是VScodePlatformIO插件驅動的Arduino,芯片使用的是ESP32

導入庫

????????安裝TFT_eSPI:TFT_eSPI 是一個用于 ESP32 和 ESP8266 上的基于圖形顯示控制器的開源軟件庫。它提供了一種簡單且高效的方式來與 TFT LCD 顯示器進行交互并創建令人驚嘆的圖形界面。

在左側文件目錄中\.pio\libdeps\esp32dev\TFT_eSPI\User_Setup.h文件中。

驅動要選擇

// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER       // Generic driver for common displays
//#define ILI9341_2_DRIVER     // Alternative ILI9341 driver, see https://github.com/Bodmer/TFT_eSPI/issues/1172
//#define ST7735_DRIVER      // Define additional parameters below for this display
//#define ILI9163_DRIVER     // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER     // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
#define ST7789_DRIVER      // Full configuration option, define additional parameters below for this display
//#define ST7789_2_DRIVER    // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
//#define RM68140_DRIVER
//#define ST7796_DRIVER
//#define SSD1351_DRIVER
//#define SSD1963_480_DRIVER
//#define SSD1963_800_DRIVER
//#define SSD1963_800ALT_DRIVER
//#define ILI9225_DRIVER
//#define GC9A01_DRIVER

屏幕尺寸

// For ST7789, ST7735, ILI9163 and GC9A01 ONLY, define the pixel width and height in portrait orientation
// #define TFT_WIDTH  80
// #define TFT_WIDTH  128
// #define TFT_WIDTH  172 // ST7789 172 x 320
// #define TFT_WIDTH  170 // ST7789 170 x 320
#define TFT_WIDTH  240 // ST7789 240 x 240 and 240 x 320
// #define TFT_HEIGHT 160
// #define TFT_HEIGHT 128
// #define TFT_HEIGHT 240 // ST7789 240 x 240
#define TFT_HEIGHT 320 // ST7789 240 x 320
// #define TFT_HEIGHT 240 // GC9A01 240 x 240

IO口

// For ESP32 Dev board (only tested with GC9A01 display)
// The hardware SPI can be mapped to any pins
#define TFT_MOSI 13 // In some display driver board, it might be written as "SDA" and so on.
#define TFT_SCLK 14
#define TFT_CS   15  // Chip select control pin
#define TFT_DC   2  // Data Command control pin
#define TFT_RST  4  // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL   12  // LED back-light

其他不做修改。

main.app文件中。導入頭文件在這里插入代碼片#include <TFT_eSPI.h>

#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI(); // 創建TFT對象
void setup()
{Serial.begin(115200);tft.init();                // 初始化// tft.fillScreen(TFT_BLACK); // 設置屏幕背景顏色// analogWrite(BLK, 150);     // 調節屏幕亮度,0最亮,255最暗
}
void loop() {}

顯示數字、字符

tft.setTextColor(TFT_WHITE, TFT_BLACK); // 參數1:字體顏色,參數2:背景色tft.setTextFont(2); // 字體大小16*16
tft.println("Hello,world");
tft.drawString("I want to eat something", 0, 50, 2);tft.setTextFont(4); // 字體大小26*26
tft.drawNumber(1234, 0, 70);
tft.drawFloat(3.14159, 5, 0, 90);

顯示漢字

方案1

利用OLED顯示漢字方法,去驅動TFTLCD顯示漢字。利用PCtoLCD2002.exe進行取模,然后導入文件中,利用點陣進行顯示。如圖所示取模方式。
在這里插入圖片描述

新建文件Chinese_32.h并導入數組。

/***************************16*16的點陣字體取模方式:共陰——列行式——逆向輸出*********/
unsigned char character[] = "第二一三四五";
uint8_t F16x16[] ={0x08, 0x04, 0x93, 0x92, 0x96, 0x9A, 0x92, 0xFA, 0x94, 0x93, 0x92, 0x96, 0xFA, 0x02, 0x02, 0x00,0x40, 0x40, 0x47, 0x24, 0x24, 0x14, 0x0C, 0xFF, 0x04, 0x04, 0x24, 0x44, 0x24, 0x1C, 0x00, 0x00, // 第",0/* (16 X 16 , 宋體 )*/0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00,0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // 二",2/* (16 X 16 , 宋體 )*/0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 一",1/* (16 X 16 , 宋體 )*/0x00, 0x04, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x04, 0x00, 0x00,0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, // 三",3/* (16 X 16 , 宋體 )*/0x00, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0x04, 0x04, 0x04, 0xFC, 0x00, 0x00,0x00, 0x7F, 0x28, 0x24, 0x23, 0x20, 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x22, 0x7F, 0x00, 0x00, // 四",4/* (16 X 16 , 宋體 )*/0x00, 0x02, 0x42, 0x42, 0x42, 0xC2, 0x7E, 0x42, 0x42, 0x42, 0x42, 0xC2, 0x02, 0x02, 0x00, 0x00,0x40, 0x40, 0x40, 0x40, 0x78, 0x47, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x40, 0x40, 0x40, 0x00, // 五",5/* (16 X 16 , 宋體 )*/
};

在main.app函數

#include <TFT_eSPI.h>
#include "Chinese_32.h"TFT_eSPI tft = TFT_eSPI(); // 創建TFT對象
#include <TJpg_Decoder.h>#define BLK 5 // 亮度控制引腳//--------------------------------------------------------------
// Prototype      : void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
// Calls          :
// Parameters     : x,y -- 起始點坐標(x:0~127, y:0~7); N:漢字在codetab.h中的索引
// Description    : 顯示codetab.h中的漢字,16*16點陣
//--------------------------------------------------------------// 顯示漢字
void OLED_ShowCN(uint8_t x, uint8_t y, uint8_t no)
{uint8_t t, j;uint16_t k;for (t = 0; t < 16; t++){k = F16x16[no * 32 + t];for (j = 0; j < 8; j++){if ((k >> j) & 0x01)tft.drawPixel(x + t, y + j, TFT_WHITE);}}for (t = 0; t < 16; t++){k = F16x16[no * 32 + 16 + t];for (j = 0; j < 8; j++){if ((k >> j) & 0x01)tft.drawPixel(x + t, y + j + 8, TFT_WHITE);}}
}uint8_t OLED_findoneCN(uint8_t ch1, uint8_t ch2, uint8_t ch3)
{uint8_t j = 0;while (character[j] != '\0'){if (ch1 == character[j] && ch2 == character[j + 1] && ch3 == character[j + 2])return j / 3 + 1;j += 3;}return 0;
}void OLED_Show(unsigned char x, unsigned char y, char ch[])
{int j = 0, k;while (ch[j] != '\0'){Serial.println(ch[j]);if (ch[j] > 0x80) // 漢字{k = OLED_findoneCN(ch[j], ch[j + 1], ch[j + 2]);if (k != 0)OLED_ShowCN((j / 3 * 2) * 8 + x, y, k - 1);j += 3;}else // ASCLL{tft.drawString((String)ch[j], (j / 3 * 2) * 8 + x, y, 2);j++;}}
}void TFT_Init()
{tft.init();                // 初始化// tft.fillScreen(TFT_BLACK); // 設置屏幕背景顏色// analogWrite(BLK, 150);     // 調節屏幕亮度,0最亮,255最暗
}void TFT_Display()
{tft.setTextColor(TFT_WHITE, TFT_BLACK); // 參數1:字體顏色,參數2:背景色tft.setTextFont(2); // 字體大小16*16tft.println("Hello,world");tft.drawString("I want to eat something", 0, 50, 2);tft.setTextFont(4); // 字體大小26*26tft.drawNumber(1234, 0, 70);tft.drawFloat(3.14159, 5, 0, 90);tft.setTextColor(TFT_WHITE, TFT_BLACK); // 參數1:字體顏色,參數2:背景色OLED_Show(0, 120, (char*)"第二一三四五");
}void setup()
{Serial.begin(115200);TFT_Init();TFT_Display();
}void loop() {}

如圖所示結果。
在這里插入圖片描述

方案2

????????導入字庫。

  1. 目錄\.pio\libdeps\esp32dev\TFT_eSPI\Tools\Create_Smooth_Font文件下有三個文件。
    其中Create_font.pde:代碼,通過該代碼來制作字庫文件。
    FontFiles : 存放我們制作出來的字庫文件,制作出來后是vlw結尾的。
    data : 存放我們的字體文件,用ttf結尾的。
  2. 去https://processing.org/ 下載processing軟件(資料中都放有)。
  3. 去自己的電腦中C:\Windows\Font文件中找到你想要的字體,放到data文件夾下。
  4. 在https://www.osgeo.cn/app/sa906網站中,將需要轉化的漢字轉成unicode編碼,然后將\u轉化成0x
  5. 使用processing打開Create_font.pde文件。
  6. 修改以下內容:將需要轉化的的漢字的unicode編碼放到specificUnicodes 數組中。
    String fontName = "simkai";  // 你的字庫的文件名字。 在130行
    String fontType = ".ttf";
    //String fontType = ".otf";// Define the font size in points for the TFT_eSPI font file
    int  fontSize = 20;
    // Font size to use in the Processing sketch display window that pops up (can be different to above)
    int displayFontSize = 20;
    static final int[] unicodeBlocks = {//0x0030, 0x0039, //Example custom range (numbers 0-9)//0x0041, 0x005A, //Example custom range (Upper case A-Z)//0x0061, 0x007A, //Example custom range (Lower case a-z)
    };
    static final int[] specificUnicodes = {
    0x56e0,0x6709,0x7740,0x4f60,0x8ddf,0x5728,0x4e00,0x8d77,0x6211,0x7231,0x683e,0x8c46,0x5f20,0x5b66,0x806a
    };
    
  7. 點擊運行,正確的話會彈出一個對話框,然后會在FontFiles 文件夾中生成一個.h的字庫。
  8. 將生成的字庫文件放入src文件夾中。
  9. 然后在主函數中:
    #include "KT_20_A.h"		//導入字庫。
    tft.loadFont(KT_20_A); 		//指定tft屏幕對象載入font_12字庫,KT_20_A為生成字庫的數組名字。
    tft.drawString("武漢",0,0) 	//在坐標0,0位置處寫武漢2個字,就可以在tft顯示出來了。
    tft.unloadFont(); 			//釋放字庫文件,節省資源。
    

顯示圖片

  1. Image2Lcd打開一張BMP或者JPG格式的圖片。
  2. 設置成如圖所示,點擊保存,注意輸出圖像位置的數字(238,320)
    在這里插入圖片描述
  3. 程序中加入:
    #include <TFT_eSPI.h>
    #include "Chinese_32.h"
    #include "BMP1.h"TFT_eSPI tft = TFT_eSPI(); // 創建TFT對象
    #include <TJpg_Decoder.h>void TFT_Display()
    {tft.pushImage(0, 0, 238, 320, (uint16_t*)gImage_demo_image1);
    }void setup()
    {tft.init();                // 初始化// tft.fillScreen(TFT_BLACK); // 設置屏幕背景顏色// analogWrite(BLK, 150);     // 調節屏幕亮度,0最亮,255最暗tft.fillScreen(TFT_BLACK);TFT_Display();
    }
    void loop() {}
    
  4. 如圖所示的效果。
    在這里插入圖片描述

總結

????????以上所有資料和應用我都放在文件中了。


資料地址:https://download.csdn.net/download/weixin_42320020/88901719

禁止轉載!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716361.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# API異步方法和返回類型:提升應用程序性能和靈活性

摘要&#xff1a; 異步編程是現代應用程序開發中不可或缺的一部分。在C#中&#xff0c;異步方法允許我們在等待操作完成時繼續執行其他任務&#xff0c;從而提高應用程序的性能和響應性。本文將介紹C# API異步方法的基本概念、原理和實際應用&#xff0c;并詳細討論異步方法的返…

【機器學習】實驗5,AAAI 會議論文聚類分析

本次實驗以AAAI 2014會議論文數據為基礎&#xff0c;要求實現或調用無監督聚類算法&#xff0c;了解聚類方法。 任務介紹 每年國際上召開的大大小小學術會議不計其數&#xff0c;發表了非常多的論文。在計算機領域的一些大型學術會議上&#xff0c;一次就可以發表涉及各個方向…

RNA-Seq 筆記 [4]

***********************該筆記為初學者筆記&#xff0c;僅供個人參考謹慎搬運代碼****************************** samtools 排序壓縮和 featureCounts 生成基因計數表 SAM文件和BAM文件 1.SAM格式&#xff1a;是一種通用的比對格式&#xff0c;用來存儲reads到參考序列的比…

2024最新算法:鳑鲏魚優化算法(Bitterling Fish Optimization,BFO)求解23個基準函數(提供MATLAB代碼)

一、鳑鲏魚優化算法 鳑鲏魚優化算法&#xff08;Bitterling Fish Optimization&#xff0c;BFO&#xff09;由Lida Zareian 等人于2024年提出。鳑鲏魚在交配中&#xff0c;雄性和雌性物種相互接近&#xff0c;然后將精子和卵子釋放到水中&#xff0c;但這種方法有一個很大的缺…

BUUCTF---[極客大挑戰 2019]Upload1

1.題目描述 2.點開鏈接&#xff0c;需要上傳文件&#xff0c;要求是image&#xff0c;上傳文件后綴為jpg的一句話木馬&#xff0c;發現被檢測到了 3.換另一個木馬試試 GIF89a? <script language"php">eval($_REQUEST[1])</script> 發現可以上傳成功 4…

ctf_show筆記篇(web入門---文件包含)

目錄 文件包含 78-79&#xff1a;最基礎的文件包含&#xff0c;使用偽協議&#xff0c;大小寫繞過或者通配符繞過&#xff0c;再或者使用其他方法 ?編輯80-81&#xff1a;可采用日志文件繞過或者大小寫繞過&#xff08;81只能日志文件繞過&#xff09; ####80-86&#xff1…

『周年紀念』- 降生CSDN三周年的碎碎念

『周年紀念』- 降生CSDN三周年的碎碎念 緣起機緣迷茫厚積薄發 一轉眼又過來一年&#xff0c;自己也已經 大四即將畢業。 感覺這一年像是開了加速鍵&#xff0c;仿佛一瞬就又過去了。統計了一下發現自己在過去的這一年就發布了 2篇文章&#xff0c;2022年發布了 117篇&#x…

PDF 解析問題調研

說點真實的感受 &#xff1a;網上看啥組件都好&#xff0c;實際測&#xff0c;啥組件都不行。效果好的不開源收費&#xff0c;開源的效果不好。測試下來&#xff0c;發現把組件融合起來&#xff0c;還是能不花錢解決問題的&#xff0c;都是麻煩折騰一些。 這里分享了目前網上能…

Python中的反射

在Python中&#xff0c;反射&#xff08;Reflection&#xff09;是一種動態地訪問對象和調用其方法的能力&#xff0c;而不需要在編寫代碼時顯式地知道對象的類或屬性。這種機制使得代碼具有更高的靈活性和可擴展性。Python通過幾種內置函數提供了反射的功能&#xff0c;主要包…

機器學習中類別不平衡問題的解決方案

類別不平衡問題 解決方案簡單方法收集數據調整權重閾值移動 數據層面欠采樣過采樣采樣方法的優劣 算法層面代價敏感集成學習&#xff1a;EasyEnsemble 總結 類別不平衡&#xff08;class-imbalance&#xff09;就是指分類任務中不同類別的訓練樣例數目差別很大的情況 解決方案…

智能分析網關V4電瓶車檢測與煙火算法,全面提升小區消防安全水平

2024年2月23日&#xff0c;南京市某小區因電瓶車停放處起火引發火災事故&#xff0c;造成巨大人員傷亡和損失。根據國家消防救援局的統計&#xff0c;2023年全國共接報電動自行車火災2.1萬起。電瓶車火災事故頻發&#xff0c;這不得不引起我們的重視和思考&#xff0c;尤其是在…

阿里云A10推理qwen

硬件配置 vCPU&#xff1a;32核 內存&#xff1a;188 GiB 寬帶&#xff1a;5 Mbps GPU&#xff1a;NVIDIA A10 24Gcuda 安裝 wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda-repo-rhel7-12-1-local-12.1.0_530.30.02-1.x86_64.rpm s…

ZDH-大數據采集-支持KETTLE任務

目錄 項目源碼 預覽地址 支持KETTLE介紹 新增KETTLE任務 配置調度KETTLE 重要說明 感謝支持 項目源碼 zdh_web:GitHub - zhaoyachao/zdh_web: 大數據采集,抽取平臺 預覽地址 后臺管理-登陸 用戶名&#xff1a;zyc 密碼&#xff1a;123456 支持KETTLE介紹 當前平臺不…

lv20 QT進程線程編程

知識點&#xff1a;啟動進程 &#xff0c;線程 &#xff0c;線程同步互斥 1 啟動進程 應用場景&#xff1a;通常在qt中打開另一個程序 process模板 QString program “/bin/ls"; QStringList arguments; arguments << "-l" << “-a";QPro…

手撕Java集合之簡易版Deque(LinkedList)

在目前&#xff0c;許多互聯網公司的面試已經要求能手撕集合源碼&#xff0c;集合源碼本身算是源碼里比較簡單的一部分&#xff0c;但是要在面試極短的10來分鐘內快速寫出一個簡易版的源碼還是比較麻煩的&#xff0c;很容易出現各種小問題。所以在平時就要注重這方面的聯系。 以…

倉儲自動化新解:托盤四向穿梭車駛入智能工廠 智能倉儲與產線緊密結合

目前&#xff0c;由于對倉庫存儲量的要求越來越高&#xff0c;揀選、輸送以及出入庫頻率等要求也越來越高&#xff0c;對此&#xff0c;在物流倉儲領域&#xff0c;自動化與智能化控制技術得以快速發展&#xff0c;貨架穿梭車在自動庫領域的應用越來越廣泛。現階段&#xff0c;…

linux之進程理解(1)

目錄 1. 馮諾依曼體系結構 2. 操作系統(OS) 2.1 概念 2.2 設計OS的目的 2.3 定位 2.4 理解管理 3. 系統調用和庫函數概念 4. 補充 1. 馮諾依曼體系結構 我們常見的計算機&#xff0c;如筆記本。我們不常見的計算機&#xff0c;如服務器&#xff0c;大部分都遵守馮諾依曼體…

chrome選項頁面options page配置

options 頁面用以定制Chrome瀏覽器擴展程序的運行參數。 通過Chrome 瀏覽器的“工具 ->更多工具->擴展程序”&#xff0c;打開chrome://extensions頁面&#xff0c;可以看到有的Google Chrome擴展程序有“選項Options”鏈接&#xff0c;如下圖所示。單擊“選項Options”…

制作鏡像與配置推送阿里云倉庫

一、制作jdk鏡像 1.1、Alpine linux簡介 Alpine Linux是一個輕量級的Linux發行版&#xff0c;專注于安全、簡潔和高效。它采用了musl libc和BusyBox&#xff0c;使得系統資源占用較少&#xff0c;啟動速度較快。 Alpine Linux也提供了一個簡單的包管理工具APK&#xff0c;(注…

【計算機網絡_應用層】協議定制序列化反序列化

文章目錄 1. TCP協議的通信流程2. 應用層協議定制3. 通過“網絡計算器”的實現來實現應用層協議定制和序列化3.1 protocol3.2 序列化和反序列化3.2.1 手寫序列化和反序列化3.2.2 使用Json庫 3.3 數據包讀取3.4 服務端設計3.5 最后的源代碼和運行結果 1. TCP協議的通信流程 在之…