成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Arduino開發(fā)-TFT_eSPI庫學(xué)習(xí)

lijy91 / 6161人閱讀

摘要:對于模式開發(fā)的屏幕開發(fā)既便捷又穩(wěn)定。同時開發(fā)的底層驅(qū)動接口也是使用庫的。庫安裝以及配置基于講解。直接在文件中取消驅(qū)動芯片的頭文件注釋即可。默認(rèn)情況下,精靈使用位顏色,位深度可以設(shè)置為位色或位任意種顏色以減少所需的。

TFT_eSPI庫學(xué)習(xí)

TFT_eSPI庫是通過SPI方式驅(qū)動LCD屏幕的一個Arduino庫,并且支持PlatformIOIDE一鍵下載使用。對于Arduino模式開發(fā)的屏幕開發(fā)既便捷又穩(wěn)定。
同時LVGLGUI開發(fā)的底層驅(qū)動接口也是使用TFT_eSPI庫的API。

TFT_eSPI庫安裝以及配置

基于PlatformIO IDE 講解。

首先在Libraries里面搜索安裝TFT_eSPI庫到你的工程文件里面。

TFT_eSPI庫文件目錄

文件目錄
最重要的幾個文件(夾):
  • TFT_Drivers
  • User_Setups
  • User_Setup_Select.h
  • User_Setup_.h

這幾個文件是最基本的配置文件(夾),因為不同的LCD屏幕所用的驅(qū)動芯片型號和RGB調(diào)色模式是不同的。所以在安裝完庫后,我們第一步就需要根據(jù)自己LCD屏幕的具體參數(shù)在配置文件里面進(jìn)行相應(yīng)的修改

TFT_eSPI是基于SPI通信的圖形驅(qū)動庫,所以,使用時需要芯片支持SPI通信,并且確保工程中已經(jīng)引入了Arduino的 SPI.h 等SPI通信的庫文件。

配置文件

有兩種方法,一種就是通過User_Setup_.h進(jìn)行配置,可以配置驅(qū)動型號以及所有需要修改的信息。
另一種就是在User_Setup_Select.h中先選擇驅(qū)動芯片型號,然后在TFT_Driver文件夾中的驅(qū)動配置文件中配置各種信息。

1.User_Setup_.h

  1. 首先選擇驅(qū)動型號 如:#define ST7789_2_DRIVER ,將注釋去掉即可。

  2. 配置屏幕大小

  3. 設(shè)置GBR顯示的LCD屏幕的顯示轉(zhuǎn)換

  4. 配置引腳
    文件中已經(jīng)定義好了可以使用的引腳,如果需要修改的話,取消注釋后修改相應(yīng)引腳的值即可

  5. 配置SPI速率
    設(shè)置SPI的通信速率,根據(jù)硬件芯片的性能設(shè)置(一般保持默認(rèn)即可)

2. User_Setup_Select.h

對于學(xué)習(xí),小作品開發(fā)不推薦,最好在User_Setup.h中進(jìn)行配置,便于修改和查找。

  1. 直接在文件中取消LCD驅(qū)動芯片的頭文件注釋即可。引腳定義按照默認(rèn),或者在文件中進(jìn)行修改(沒有使用過)。

3. Rotation.h- 鏡像設(shè)置

//屏幕選擇函數(shù)TFT_eSPI tft = TFT_eSPI();tft.setRotation(4);//1-3是90度到270度旋轉(zhuǎn)/*要實現(xiàn)鏡像的話需要在驅(qū)動的Rotation.h里面進(jìn)行設(shè)置在switch語句中添加case 4選項代碼如下*/   case 4: // Inverter portrait & Mirror Y#ifdef CGRAM_OFFSET	if (_init_width == 135)	{		colstart = 53;		rowstart = 40;	}	else	{		colstart = 0;		rowstart = 0;	}#endif	writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER);	_width = _init_width;	_height = _init_height;	break;/*然后使用函數(shù)tft.setRotation(4);即可。*/

TFT_eSPI庫常用API

初始化

  1. 屏幕對象實例化
TFT_eSPI::TFT_eSPI(int16_t w, int16_t h)//設(shè)定屏幕大小TFT_eSPI tft = TFT_eSPI(240, 240);

參數(shù):寬度和高度

  1. 初始化
tft.init();
  1. 設(shè)置屏幕方向
tft.serRotation(3);

參數(shù)為:0, 1, 2, 3 分別代表 0°、90°、180°、270°,可設(shè)置4為鏡像。

  1. RGB顏色轉(zhuǎn)GBR565
uint16_t TFT_eSPI::color565(uint8_t r, uint8_t g, uint8_t b)// 顏色轉(zhuǎn)換uint16_t yellow = tft.color565(255, 255, 0);tft.setTextColor(yellow); //
  1. 清屏函數(shù)
void TFT_eSPI::fillScreen(uint32_t color)//清理屏幕 默認(rèn)顏色,可以設(shè)置不同的顏色tft.fillScreen(TFT_BLACK);

常用函數(shù)

1. eSPI類

文字

void TFT_eSPI::setTextSize(uint8_t s)//設(shè)置字體大小為2tft.setTextSize(2);void TFT_eSPI::setTextColor(uint16_t c)//字體顏色 綠色tft.setTextColor(TFT_GREEN);void TFT_eSPI::setCursor(int16_t x, int16_t y)//設(shè)置文字開始坐標(biāo)(0,0)tft.setCursor(0, 0);void TFT_eSPI::setTextDatum(uint8_t d)// 引用數(shù)據(jù)tft.setTextDatum(MC_DATUM);int16_t TFT_eSPI::drawString(const String& string, int32_t poX, int32_t poY)//顯示文字 Moonbeam (10,10)位置tft.drawString("Moonbeam ", 10, 10);/*此外還有文字居中,居右,繪制浮點數(shù)或者整數(shù)等函數(shù)都位于 頭文件 TFT_eSPI.h 中*/

圖片

圖片取模的畫,好多博客,按照bmp格式取RGB565的數(shù)組即可
如果要顯示jpg圖片的話需要用到圖片解碼庫

/*  */void TFT_eSPI::setSwapBytes(bool swap)// 開啟顯示,一般需要圖片顯示的時候都加上這個函數(shù)即可tft.setSwapBytes(true);void TFT_eSPI::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)void TFT_eSPI::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor)

繪制圖形

uint16_t TFT_eSPI::alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc)// 半透明顏色  tft.alphaBlend(a, TFT_RED,   TFT_WHITE);void TFT_eSPI::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color)//繪制線  tft.drawFastHLine(204, a, 12, tft.alphaBlend(a, TFT_RED,   TFT_WHITE));void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color)//畫點tft.drawPixel(204,10,TFT_RED);//畫豎線void TFT_eSPI::drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color)//畫圓void TFT_eSPI::drawCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color)tft.drawCircle(100,100,50,TFT_RED);//畫實心圓void TFT_eSPI::fillCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color)//畫矩形void TFT_eSPI::drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color)void TFT_eSPI::fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color)//畫三角型void TFT_eSPI::drawTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color)void TFT_eSPI::fillTriangle( int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color)

2. Sprite 類

Sprite 理論上是一個不可見的圖形屏幕,它保存在處理器 RAM 中。圖形可以繪制到 Sprite 中,就像它們可以直接繪制到屏幕上一樣。Sprite 完成后,可以將其繪制到屏幕上的任何位置。如果有足夠的 RAM,則 Sprite 可以與屏幕大小相同并用作幀緩沖區(qū)。默認(rèn)情況下,精靈使用 16 位顏色,位深度可以設(shè)置為 8 位(256 色)或 1 位(任意 2 種顏色)以減少所需的 RAM。在 ESP8266 上,可以創(chuàng)建的最大 16 位彩色 Sprite 大約為 160x128 像素,這會消耗 40 KB 的 RAM。在 ESP32 上,16 位色深的 Sprite 限制為約 200x200 像素(~ 80KB),8 位色深的 sprite 限制為 320x240 像素(~76KB)。
?? 可以創(chuàng)建一個或多個Sprite ,Sprite 可以是任何像素寬度和高度,僅受可用 RAM 的限制。16 位色深 Sprite 所需的 RAM 為(2 x 寬 x 高)字節(jié),8 位色深 Sprite 所需的 RAM 為(寬 x 高)字節(jié)。 Sprite 可以根據(jù)需要在程序中動態(tài)創(chuàng)建和刪除,這意味著可以在 Sprite 繪制在屏幕上后釋放 RAM,然后可以運行更多 RAM 密集型基于 WiFi 的代碼,并且正常的圖形操作仍然可以工作。
?? 將圖形繪制到Sprite 中的速度非???,對于熟悉示例 Adafruit “graphicstest”的人來說,用 160x128 Sprite 可以在 18ms 內(nèi)完成整個測試。Sprite 使用示例可以在“examples/Sprite”文件夾中找到。Sprite 可以繪制到 TFT 中,其中一種顏色被指定為“透明”,這需要看 Transparent_Sprite_Demo 示例。
?? 如果 ESP32 開發(fā)板安裝了 SPIRAM(即 PSRAM),那么 Sprite 將使用 PSRAM 內(nèi)存,并且可以創(chuàng)建大型全屏緩沖區(qū) Sprite。全屏Sprite需要更長的時間來渲染(320 x 240 16 位Sprite大約需要 45 毫秒)?。?!
?? ------------------官方解釋--------------------------

sprite類API

人話:可以解決刷新閃屏的問題-暫時就這樣。

/*實例化*/TFT_eSprite clk = TFT_eSprite(&tft);//創(chuàng)建一個 寬x高像素 的sprite,返回一個指向RAM的指針//如果需要,Sketch 可以將返回值轉(zhuǎn)換為 (uint16_t*) 以獲得 16 位深度void*  createSprite(int16_t width, int16_t height, uint8_t frames = 1);void*  getPointer(void);//如果未創(chuàng)建,則返回一個指向精靈或 nullptr 的指針,用戶必須轉(zhuǎn)換為指針類型bool   created(void);   //如果精靈已經(jīng)創(chuàng)建,則返回真void   deleteSprite(void);//刪除精靈以釋放 RAM //設(shè)置或獲取顏色深度為 4、8 或 16 位??捎糜诟默F(xiàn)有精靈的深度,但會將其清除為黑色,如果重新創(chuàng)建精靈,則返回一個新指針。 void*  setColorDepth(int8_t b);int8_t getColorDepth(void);void     drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t font);//在 Adafruit GLCD 或 freefont 中繪制單個字符//在屏幕上繪制一個 unicode 字形。任何 UTF-8 解碼都必須在調(diào)用 drawChar() 之前完成 int16_t  drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font);int16_t  drawChar(uint16_t uniCode, int32_t x, int32_t y);//設(shè)置滾動區(qū)域,從左上角定義x,y,寬度和高度。顏色(可選,默認(rèn)為黑色)用于填充滾動后的間隙void 	 setScrollRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t color = TFT_BLACK);//滾動 定義區(qū)域 dx,dy 像素。負(fù)值向上、左滾動;正值向右、下滾動。向上、向下滾動是可選的(默認(rèn)是沒有向上/向下滾動)。//Sprite 坐標(biāo)系不移動,移動的是像素void     scroll(int16_t dx, int16_t dy = 0),void     setRotation(uint8_t rotation);//設(shè)置Sprite 的旋轉(zhuǎn)坐標(biāo)(僅適用于 1位色深的Sprite )  顯示器內(nèi)部硬件中的 CGRAM 旋轉(zhuǎn)uint8_t  getRotation(void);//將 Sprite 的旋轉(zhuǎn)副本推送到具有可選透明顏色的 TFT bool     pushRotated(int16_t angle, uint32_t transp = 0x00FFFFFF);   // Using fixed point maths//將 Sprite 的旋轉(zhuǎn)副本推送到另一個具有可選透明顏色的不同 Spritebool     pushRotated(TFT_eSprite *spr, int16_t angle, uint32_t transp = 0x00FFFFFF);   //獲取此 Sprite 旋轉(zhuǎn)副本的 TFT 邊界框 bool     getRotatedBounds(int16_t angle, int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y);//獲取此 Sprite 的旋轉(zhuǎn)副本的目標(biāo) Sprite 邊界框bool     getRotatedBounds(TFT_eSprite *spr, int16_t angle, int16_t *min_x, int16_t *min_y,                                                           int16_t *max_x, int16_t *max_y);                                                          //獲取旋轉(zhuǎn)的 Sprite wrt 樞軸的 TFT 邊界框void     getRotatedBounds(int16_t angle, int16_t w, int16_t h, int16_t xp, int16_t yp,                          int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y);                          uint16_t readPixel(int32_t x0, int32_t y0);//讀取 x,y 處像素的顏色并以 565 格式返回值uint16_t readPixelValue(int32_t x, int32_t y);//返回 x,y 處像素的數(shù)值(滾動時使用)

其他的eSPI庫的函數(shù)都是可以在sprite類中通用的,不在復(fù)述。

示例代碼

void TFT_init(){  tft.init();                tft.setRotation(4);                 //初始化  Serial.println("TFT_INIT_OK");  }/******************************************************************************/void drawAr(){    clk.setColorDepth(8);  clk.createSprite(64, 64);//創(chuàng)建窗口  clk.fillSprite(0x0000);   //填充率  clk.setTextDatum(CC_DATUM);   //設(shè)置文本數(shù)據(jù)  clk.setTextColor(TFT_WHITE, bgColor);  clk.setSwapBytes(true);  clk.pushImage(0, 0,  64, 64, Astronaut[i]);   clk.println("ok");  clk.pushSprite(64,64);  //窗口位置  clk.deleteSprite();// (10,55) 顯示 64 × 64 像素的圖片  if(millis() - imgtime>150){	    imgtime = millis();		//延時    i+=1;								//下一幀    if(i>8){i=0;}	}}/**********************************************************************************************/void setup() {  Serial.begin(115200); TFT_init();  Serial.println("OKKKK");   tft.fillScreen(TFT_BLACK);   scanNetworks();						//掃描wifi并打印信息   connect();							//連接到指定wifi   timeClient.begin();                 //連接NTP服務(wù)器   timeClient.setTimeOffset(28800);    //時區(qū)偏移   wea.Get();//    Serial.println(land.post(IPdata,land.url_land));//    delay(5000);//    land.post(IPdata,land.url_unland);   //imu.init();                      //獲取天氣}void loop() {  clk.loadFont(MY_FONT_Z);  clk.setColorDepth(8);  clk.createSprite(128, 128);//創(chuàng)建窗口  clk.fillSprite(0x0000);   //填充率  clk.setTextDatum(CC_DATUM);   //設(shè)置文本數(shù)據(jù)  clk.setTextColor(TFT_WHITE, bgColor);   clk.setCursor(20,20,2);  clk.setSwapBytes(true);  //Serial.println(timeClient.getFormattedTime());  clk.println(timeClient.getFormattedTime());  clk.println(wea.now_address);  clk.println(wea.now_weather);    clk.println(wea.now_temperature+"℃");  clk.pushImage(60, 55,  64, 64, Astronaut[i]); // (10,55) 顯示 64 × 64 像素的圖片  clk.pushSprite(0,0);  //窗口位置  clk.deleteSprite();  clk.unloadFont();    if(millis() - imgtime>150){	    imgtime = millis();		//延時    i+=1;								//下一幀    if(i>8){i=0;}	    }

顯示效果

基于ESP32 開發(fā)太空人小電視時的eSPI庫學(xué)習(xí)成果
做了鏡像翻轉(zhuǎn)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/121081.html

相關(guān)文章

  • ESP32開源驅(qū)動Easyio的使用,基于ESP-IDF開發(fā)框架,非Arduino

    摘要:是一款適配于框架的開源驅(qū)動庫,以支持的簡便開發(fā)。目的是簡化樂鑫開發(fā)框架的使用難度。相關(guān)教程本專欄內(nèi)容開發(fā)環(huán)境搭建開發(fā)環(huán)境搭建,下基于插件的開發(fā)環(huán)境搭建樂鑫在線幫助文檔快速入門編程指南硬件設(shè)計參考 ...

    Harriet666 評論0 收藏0
  • 01.ESP8266開發(fā)方式知多少

    摘要:開發(fā)方式是樂鑫為開發(fā)者提供的物聯(lián)應(yīng)開發(fā)平臺,包括基礎(chǔ)平臺以及上層應(yīng)開發(fā)示例,如智能燈智能開關(guān)等。指令開發(fā)方式作為芯片,指令開發(fā)也是必不可少的。開發(fā)方式即,意為運行在單片機(jī)上的。 ...

    sushi 評論0 收藏0
  • 2021-09-08

    摘要:基礎(chǔ)入門教程無奈的吐槽一轉(zhuǎn)眼大學(xué)就快結(jié)束了,這是我第一次在上寫博客。由一個歐洲開發(fā)團(tuán)隊于年冬季開發(fā)。其成員包括和等。它構(gòu)建于開放原始碼介面版,并且具有使用類似語言的開發(fā)環(huán)境。首先是程序部分。 ...

    JinB 評論0 收藏0
  • 單片機(jī)入門指南

    摘要:單片機(jī)入門指南本文基于常神文章基礎(chǔ)上將單片機(jī)入門部分進(jìn)行細(xì)化盡可能細(xì)節(jié)做到可實施性先引用一下常神的文章首先假設(shè)大家已經(jīng)對高中物理的電路部分有所了解。單片機(jī),如,是一種根據(jù)程序控制引腳高低電平的可編程器件,有些場合又將這種行為稱作嵌入式。 ...

    nevermind 評論0 收藏0
  • Serialport.js 連接 web 和硬件設(shè)備編程

    摘要:連接建立成功,就會觸發(fā)事件事件稍后再解說。當(dāng)連接建立時當(dāng)接收到數(shù)據(jù)時當(dāng)出現(xiàn)錯誤時事件監(jiān)聽,主要用來在合適的時間點發(fā)送數(shù)據(jù),以及處理接收到來自串口的數(shù)據(jù)信息。數(shù)據(jù)會經(jīng)串口發(fā)送至與連接的硬件設(shè)備,比如板,或者板等等。 Serialport 簡介 想象這樣一個世界,在那里你能用 JavaScript 代碼控制榨汁機(jī),燈,安防系統(tǒng),甚至機(jī)器人。嗯,是機(jī)器人!你會不會覺得很新奇以致興奮? Ser...

    myshell 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<