這篇文章來(lái)源于DevicePlus.com英語(yǔ)網(wǎng)站的翻譯稿。
點(diǎn)擊此處閱讀本文的第1部分 >
在第1部分中,我們能夠獲取KX022-1020加速度計(jì)的數(shù)值并將其顯示到TFT液晶LCD面板上。在第2部分中,我們將展示如何在讀取程序內(nèi)容的同時(shí)控制TFT顯示屏!
今天的電子食譜
預(yù)計(jì)完成時(shí)間:60分鐘
所需部件:
Arduino 主體 (Arduino UNO R3)
羅姆傳感器評(píng)估套件https://www.rohm.com/web/global/sensor-shield-support
TFT 液晶面板 (sainsmart 1.8) https://www.sainsmart.com/sainsmart-1-8-spi-lcd-module-with-microsd-led-backlight-for-arduino-mega-atmel-atmega.html
※ 您可以從以下站點(diǎn)購(gòu)買(mǎi)羅姆傳感器評(píng)估套件!
Chip One Stop
Mouser Electronics
通過(guò)Arduino在TFT液晶顯示屏上顯示數(shù)據(jù)
和之前一樣,我們使用SainSmart ST7735RTFT顯示屏。這是一款緊湊的LCD顯示屏,可兼容Arduino和Raspberry Pi。該顯示屏具有內(nèi)置microSD卡插槽,因此除了讀取和寫(xiě)入數(shù)據(jù)外,還可以存儲(chǔ)和加載圖像。在本教程中,我們將僅嘗試在該TFT顯示屏上顯示數(shù)值。
我們開(kāi)始吧!首先,將TFT顯示屏與Arduino連接起來(lái)。
圖1 SainSmart ST7735R TFT顯示屏
圖2 TFT顯示屏的背面
TFT 引腳定義:
VCC – 供電電壓
GND – 地
SCL – 串行時(shí)鐘線
SDA – 串行數(shù)據(jù)線
RES – 控制器復(fù)位
CS – TF卡的片選信號(hào)
將Arduino連至TFT顯示屏之后,我們來(lái)運(yùn)行示例程序。
將TFT顯示屏庫(kù)文件應(yīng)用于Arduino
正如文章第1部分中提到的,我們需要對(duì)庫(kù)文件(ST7735R)進(jìn)行一些小的修改,以便讓TFT顯示屏兼容Arduino系統(tǒng)。
用于Arduino的SainSmart 1.8 ST7735R TFT液晶顯示屏,搭載MicroSD卡槽和LED背光
Raspberry Pi 庫(kù) (ST7735R V0.2)
上述URL的頁(yè)面底部有一個(gè)下載鏈接。單擊頁(yè)面上標(biāo)有 “Download Link” 的鏈接,下載完整的庫(kù)、示例代碼及文檔等。下載完成后,解壓文件并重新編寫(xiě)必要的文件。
請(qǐng)用能夠編輯文本的編輯器打開(kāi) “ST7735.h” ,然后更改下圖所示的部分。您也可以使用Arduino IDE。
更改完成后,用zip再次壓縮 “TFT 18” 目錄,然后在Arduino(或Arduino Create)Add Library中將其作為一個(gè)庫(kù)添加;或者將其放置在Arduino安裝目錄的“l(fā)ibraries”目錄下并加載該庫(kù)。
導(dǎo)入庫(kù)之后,請(qǐng)嘗試在示例程序中移動(dòng) “TFT 18” – “graphictest” 。
您會(huì)看到示例程序的顯示非常流暢。
示例程序 – graphictest
//Pin setting #define sclk 4 #define mosi 5 #define cs 6 #define dc 7 #define rst 8 //Color numbering #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #include #include ST7735 tft = ST7735(cs, dc, mosi, sclk, rst); void fillpixelbypixel(uint16_t color) { for (uint8_t x=0; x < tft.width; x++) { for (uint8_t y=0; y < tft.height; y++) { tft.drawPixel(x, y, color); } } delay(100); } void setup(void) { Serial.begin(9600); Serial.print("hello!"); tft.initR(); // initialize a ST7735R chip Serial.println("init"); tft.writecommand(ST7735_DISPON); uint16_t time = millis(); tft.fillScreen(BLACK); time = millis() - time; Serial.println(time, DEC); delay(500); // tft.fillScreen(BLACK); testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", WHITE); delay(1000); //a single pixel tft.drawPixel(tft.width/2, tft.height/2, GREEN); delay(500); // line draw test testlines(YELLOW); delay(500); // optimized lines testfastlines(RED, BLUE); delay(500); testdrawrects(GREEN); delay(500); testfillrects(YELLOW, MAGENTA); delay(500); tft.fillScreen(BLACK); testfillcircles(10, BLUE); testdrawcircles(10, WHITE); Serial.println("done"); delay(1000); } void loop() { tft.writecommand(ST7735_INVON); delay(500); tft.writecommand(ST7735_INVOFF); delay(500); } void testlines(uint16_t color) { tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawLine(0, 0, x, tft.height-1, color); } for (uint16_t y=0; y < tft.height; y+=6) { tft.drawLine(0, 0, tft.width-1, y, color); } tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawLine(tft.width-1, 0, x, tft.height-1, color); } for (uint16_t y=0; y < tft.height; y+=6) { tft.drawLine(tft.width-1, 0, 0, y, color); } tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawLine(0, tft.height-1, x, 0, color); } for (uint16_t y=0; y < tft.height; y+=6) { tft.drawLine(0, tft.height-1, tft.width-1, y, color); } tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawLine(tft.width-1, tft.height-1, x, 0, color); } for (uint16_t y=0; y < tft.height; y+=6) { tft.drawLine(tft.width-1, tft.height-1, 0, y, color); } } void testdrawtext(char *text, uint16_t color) { tft.drawString(0, 0, text, color); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(BLACK); for (uint16_t y=0; y < tft.height; y+=5) { tft.drawHorizontalLine(0, y, tft.width, color1); } for (uint16_t x=0; x < tft.width; x+=5) { tft.drawVerticalLine(x, 0, tft.height, color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawRect(tft.width/2 -x/2, tft.height/2 -x/2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(BLACK); for (uint16_t x=tft.width-1; x > 6; x-=6) { tft.fillRect(tft.width/2 -x/2, tft.height/2 -x/2 , x, x, color1); tft.drawRect(tft.width/2 -x/2, tft.height/2 -x/2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (uint8_t x=radius; x < tft.width; x+=radius*2) { for (uint8_t y=radius; y < tft.height; y+=radius*2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (uint8_t x=0; x < tft.width+radius; x+=radius*2) { for (uint8_t y=0; y < tft.height+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } }
該TFT顯示屏的主要功能如下所示:
tft.drawPixel(x,y,color); – 在指定位置(x,y)顯示指定顏色(color)的點(diǎn)。
tft.drawCircle(x, y, radius, color); – 在指定位置(x,y)用指定半徑(radius)畫(huà)一個(gè)圓。
tft.fillRect(x1,y1, x2, y2, color); – 填充指定位置1(x1, y1)至指定位置2(x2, y2)之間的矩形。
tft.drawString(x, y, text, color); – 在指定位置(x,y)用指定顏色(color)顯示文本。
tft.fillScreen(0x0000); – 用指定顏色填充整個(gè)顯示屏。
盡管還有其他功能,但是上述主要功能已經(jīng)能夠滿足幾乎所有我們的顯示要求。
將加速度計(jì)的數(shù)值繪制成圖形
接下來(lái),讓我們?cè)赥FT顯示屏上顯示加速度計(jì)的數(shù)值!基本上,就傳感器評(píng)估套件而言,我們無(wú)需更改TFT顯示屏這邊的連線。只需將KX022-1020加速度計(jì)插入傳感器開(kāi)發(fā)板即可。
圖3 加速度計(jì)和TFT顯示屏
顯示加速度計(jì)數(shù)值的程序如下:
#include #include #include #include // You can use any (4 or) 5 pins #define sclk 4 #define mosi 5 #define cs 6 #define dc 7 #define rst 8 // you can also connect this to the Arduino reset // Color definitions #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF ST7735 tft = ST7735(cs, dc, mosi, sclk, rst); KX022 kx022(KX022_DEVICE_ADDRESS_1E); int _cnt = 0; //Graph initial position int _xc = 120; int _yc = 130; int _zc = 140; void fillpixelbypixel(uint16_t color) { for (uint8_t x=0; x < tft.width; x++) { for (uint8_t y=0; y < tft.height; y++) { tft.drawPixel(x, y, color); } } delay(100); } void setup(void) { byte rc; Serial.begin(9600); while (!Serial); Wire.begin(); tft.initR(); // initialize a ST7735R chip rc = kx022.init(); tft.fillScreen(BLACK); 1.DEVICE PLUS testdrawtext("DEVICE PLUS!!", WHITE,25,50); delay(1000); tft.fillScreen(BLACK); } void loop() { //KX022 byte rc; float acc[3]; //2.Acquire accelerometer values rc = kx022.get_val(acc); if (rc == 0) { Serial.write("KX022 (X) = "); Serial.print(acc[0]); Serial.println(" [g]"); Serial.write("KX022 (Y) = "); Serial.print(acc[1]); Serial.println(" [g]"); Serial.write("KX022 (Z) = "); Serial.print(acc[2]); Serial.println(" [g]"); Serial.println(); //Convert float type to char type char xVal[10]; dtostrf(acc[0], 5, 2, xVal); char yVal[10]; dtostrf(acc[1], 5, 2, yVal); char zVal[10]; dtostrf(acc[2], 5, 2, zVal); //Convert to TFT liquid crystal //tft.fillScreen(BLACK); tft.fillRect(0,0, 120, 60, BLACK); testdrawtext("X:", RED, 5, 15); testdrawtext(xVal, WHITE, 30, 15); testdrawtext("Y:", BLUE, 5, 30); testdrawtext(yVal, WHITE, 30, 30); testdrawtext("Z:", GREEN, 5, 45); testdrawtext(zVal, WHITE, 30, 45); //3.Draw a graph int x = int(acc[0]*100)+120; int y = int(acc[1]*100)+130; int z = int(acc[2]*100)+40; tft.drawLine(_cnt-1, _xc, _cnt, x, RED); tft.drawLine(_cnt-1, _yc, _cnt, y, BLUE); tft.drawLine(_cnt-1, _zc, _cnt, z, GREEN); _cnt++; //Reset to the end of the screen if(_cnt > 120){ _cnt = 0; tft.fillScreen(BLACK); } _xc = x; _yc = y; _zc = z; delay(10); } delay(10); } void testlines(uint16_t color) { tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawLine(0, 0, x, tft.height-1, color); } for (uint16_t y=0; y < tft.height; y+=6) { tft.drawLine(0, 0, tft.width-1, y, color); } tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawLine(tft.width-1, 0, x, tft.height-1, color); } for (uint16_t y=0; y < tft.height; y+=6) { tft.drawLine(tft.width-1, 0, 0, y, color); } tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawLine(0, tft.height-1, x, 0, color); } for (uint16_t y=0; y < tft.height; y+=6) { tft.drawLine(0, tft.height-1, tft.width-1, y, color); } tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawLine(tft.width-1, tft.height-1, x, 0, color); } for (uint16_t y=0; y < tft.height; y+=6) { tft.drawLine(tft.width-1, tft.height-1, 0, y, color); } } void testdrawtext(char *text, uint16_t color,int x,int y) { tft.drawString(x, y, text, color); } void testfastlines(uint16_t color1, uint16_t color2) { tft.fillScreen(BLACK); for (uint16_t y=0; y < tft.height; y+=5) { tft.drawHorizontalLine(0, y, tft.width, color1); } for (uint16_t x=0; x < tft.width; x+=5) { tft.drawVerticalLine(x, 0, tft.height, color2); } } void testdrawrects(uint16_t color) { tft.fillScreen(BLACK); for (uint16_t x=0; x < tft.width; x+=6) { tft.drawRect(tft.width/2 -x/2, tft.height/2 -x/2 , x, x, color); } } void testfillrects(uint16_t color1, uint16_t color2) { tft.fillScreen(BLACK); for (uint16_t x=tft.width-1; x > 6; x-=6) { tft.fillRect(tft.width/2 -x/2, tft.height/2 -x/2 , x, x, color1); tft.drawRect(tft.width/2 -x/2, tft.height/2 -x/2 , x, x, color2); } } void testfillcircles(uint8_t radius, uint16_t color) { for (uint8_t x=radius; x < tft.width; x+=radius*2) { for (uint8_t y=radius; y < tft.height; y+=radius*2) { tft.fillCircle(x, y, radius, color); } } } void testdrawcircles(uint8_t radius, uint16_t color) { for (uint8_t x=0; x < tft.width+radius; x+=radius*2) { for (uint8_t y=0; y < tft.height+radius; y+=radius*2) { tft.drawCircle(x, y, radius, color); } } }
運(yùn)行上述程序后,顯示屏?xí)⒓铀俣扔?jì)的數(shù)值用圖形顯示出來(lái)。
該程序流程摘要如下:
啟動(dòng)時(shí)顯示 “DEVICE PLUS !!” 字符
獲取加速度計(jì)的數(shù)值并將其轉(zhuǎn)換為整數(shù)
根據(jù)數(shù)值顯示圖形和文本
每一幀我們給x軸加1,以便從左到右繪制圖形。
當(dāng)畫(huà)面到達(dá)120px顯示屏的邊緣時(shí),程序會(huì)用drawrect清除圖形。屏幕上方的數(shù)字以相同的方式通過(guò)drawrect進(jìn)行每幀更新。
至此,利用TFT液晶顯示屏顯示加速度計(jì)的數(shù)值并繪制相關(guān)圖形的教程就結(jié)束了!我們還可以考慮開(kāi)發(fā)更多的附帶項(xiàng)目。比如,我們可以將此TFT顯示屏與Arduino Pro Mini組合在一起,制作具有小型游戲功能的手表等;還可以利用傳感器評(píng)估套件中的不同傳感器來(lái)制作數(shù)據(jù)記錄器。
點(diǎn)擊此處閱讀本文的第1部分 >
DevicePlus 編輯團(tuán)隊(duì)
設(shè)備升級(jí)版適用于所有熱愛(ài)電子和機(jī)電一體化的人。
審核編輯黃宇
-
液晶面板
+關(guān)注
關(guān)注
10文章
471瀏覽量
39986 -
TFT
+關(guān)注
關(guān)注
10文章
385瀏覽量
111098 -
加速度計(jì)
+關(guān)注
關(guān)注
6文章
702瀏覽量
45897
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論