การใช้งาน IOXESP32 Mini LCD shield กับ ArduinoIDE
เขียนโปรแกรมแสดงผลข้อความ รูปภาพ บนจอ LCD และใช้งานสวิตช์
การเขียนโปรแกรมจะแบ่งเป็น 2 ส่วน คือส่วนใช้งานจอ LCD และส่วนการใช้งานสวิตช์
การเขียนโปรแกรมสั่งงานจอ LCD
จอ LCD ที่มีบนโมดูล IOXESP32 Mini LCD shield เป็นจอ LCD ที่ใช้ไอซีขับจอเบอร์ ST7735 ไลบารี่ที่รองรับการใช้งานกับไอซีขับจอเบอร์นี้ คือไลบารี่ TFT_eSPI
การติดตั้งไลบารี่ TFT_eSPI
การติดตั้งไลบารี่ TFT_eSPI สามารถติดตั้งผ่าน Library Manager ได้ โดยมีขั้นตอนดังนี้
เปิดโปรแกรม ArduinoIDE ขึ้นมา จากนั้นกดไปที่ Sketh > Include Library เลือก Manage Libraries…

หน้าต่าง Library Manager จะเปิดขึ้นมา ในช่องค้นหา ให้พิมพ์ TFT_eSPI เลือกไลบารี่ TFT_eSPI แล้วกดปุ่ม Install

แล้วรอติดตั้งไลบารี่ซักครู่ สังเกตความคืบหน้าในการติดตั้งได้จากแถบสีน้ำเงินด้านล่างของหน้าต่าง

เมื่อติดตั้งเสร็จแล้ว จะแสดงคำว่า INSTALLED (ดังรูป) สามารถปิดหน้าต่าง Library Manager ไปได้เลย

ตรวจสอบผลการติดตั้งไลยบารี่ TFT_eSPI ได้ โดยกดไปที่ File > Examples หากมีรายการ TFT_eSPI แสดง แสดงว่าติดตั้งไลบารี่สำเร็จแล้ว

การตั้งค่าไลบารี่ TFT_eSPI
เนื่องจากไลบารี่ TFT_eSPI รองรับการใช้งานกับจอหลายรุ่น ดังนั้นการใช้งานจึงจำเป็นต้องตั้งค่ารุ่นของจอที่ใช้งาน และตั้งค่าขาที่ต่อกับจอก่อน โดยการตั้งค่าจำเป็นจะต้องแก้ไขโค้ดโปรแกรมของไลบารี่ โดยใช้ Text Editor ตัวใดก็ได้ ตัวอย่างบทความนี้ใช้โปรแกรม Notepad++
การจะแก้ไขโค้ดโปรแกรมของไลบารี่ได้ จำเป็นจะต้องรู้ก่อนว่าไลบารี่ติดตั้งอยู่ที่โฟลเดอร์ไหน ซึ่งการดูว่าไลบารี่ติดตั้งอยู่ที่โฟลเดอร์ไหนสามารถทำได้โดยกดไปที่เมนู File > Preferences

หน้าต่าง Preferences จะเปิดขึ้นมา ให้สังเกตที่อยู่ในช่อง Sketchbook location แล้วเข้าไปที่โฟลเดอร์ตามที่ Sketchbook location แสดง

จากนั้นเข้าไปที่โฟลเดอร์ libraries

ค้นหาโฟลเดอร์ TFT_eSPI แล้วเข้าไปในโฟลเดอร์ TFT_eSPI

จะเจอไฟล์โค้ดโปรแกรมของไลบารี่ TFT_eSPI แล้ว

เปิดไฟล์ User_Setup_Select.h ด้วยโปรแกรม Text Editor ตัวใดก็ได้ขึ้นมา แล้วแก้ไขไฟล์ดังนี้
เลื่อนหาบรรทัด #include <User_Setup.h> แล้วเพิ่มเครื่องหมาย Comment (//) เข้าไปที่หน้าบรรทัด
เลื่อนหาบรรทัด #include <User_Setups/Setup43_ST7735.h> แล้วลบเครื่องหมาย Comment (//) ที่หน้าบรรทัด
บันทึกไฟล์แล้วปิดไฟล์นี้ไปได้เลย


จากนั้นเข้าไปที่โฟลเดอร์ User_Setups แล้วเปิดไฟล์ Setup43_ST7735.h ด้วยโปรแกรม Text Editor ตัวใดก็ได้ แก้ไขโค้ดโปรแกรมดังนี้
ค้นหาบรรทัด
#define TFT_CS 15
แล้วแก้ไขเลข 15 เป็นค้นหาบรรทัด
#define TFT_DC 2
แล้วแก้ไขเลข 2 เป็น 17ค้นหาบรรทัด
#define TFT_RST 4
แล้วแก้ไขเลข 4 เป็น -1
บันทึกไฟล์ให้เรียบร้อย แล้วปิดโปรแกรมไปได้เลย

ทดลองใช้งานไลบารี่ TFT_eSPI
หลังจากตั้งค่าไลบารี่แล้ว ขั้นตอนต่อมาคือทดสอบใช้งานไลบารี่ TFT_eSPI ว่าสามารถขับจอให้แสดงข้อความรูปภาพได้หรือไม่ ก่อนนำไลบารี่ไปใช้งานจริง
เปิดโปรแกรม ArduinoIDE ขึ้นมา กดไปที่ File > Examples > TFT_eSPI > 160 x 128 แล้วเลือก TFT_graphicstest_small

กดอัพโหลดโปรแกรมตัวอย่าง TFT_graphicstest_small ลงบอร์ดไปได้เลย

ที่หน้าจอจะเริ่มแสดงผลการทำงานของโค้ดโปรแกรมตัวอย่างขึ้นมาแล้ว
การเขียนโปรแกรมสั่งงานจอ LCD
การเขียนโปรแกรมสังงานจอ LCD เริ่มต้นด้วยการ include ไลบารี่ TFT_eSPI เข้ามา
#include <TFT_eSPI.h>
เพื่อให้ใช้งานคำสั่งที่อยู่ในไลบารี่ได้ จำเป็นต้องสร้างออปเจค tft จากคลาส TFT_eSPI ก่อน ด้วยคำสั่ง
TFT_eSPI tft = TFT_eSPI();
แล้วใช้คำสั่ง tft.init(); ใน void setup() เพื่อสั่งให้หน้าจอเริ่มทำงาน
tft.init();
เท่านี้ก็พร้อมเขียนโปรแกรมสั่งงานจอแล้ว
การหมุนหน้าจอ
ใช้คำสั่ง tft.setRotation() มีรูปแบบการใช้งานดังนี้
void TFT_eSPI::setRotation(uint8_t r); // เมื่อ r กำหนดได้ 0 ถึง 3
ตัวอย่าง หมุนหน้าจอเป็นแนวนอน
tft.setRotation(3);
ระบบสี
ระบบสีีที่ใช้บนเครื่องคอมพิวเตอร์เป็นแบบ 24 บิต RGB888 แต่ที่ใช้บนจอ TFT และไลบารี่ TFT_eSPI ใช้ระบบสี RGB565 การแปลงสี RGB888 เป็น RGB565 สามารถทำได้โดยใช้คำสั่ง tft.color565() หรือ tft. color24to16() มีรูปแบบคำสั่งดังนี้
uint16_t TFT_eSPI::color565(uint8_t red, uint8_t green, uint8_t blue);
uint32_t TFT_eSPI::color24to16(uint32_t color888);
ตัวอย่าง 1 วาดเส้นที่ตำแหน่งเริ่มต้น (10, 10) ไปที่ตำแหน่ง (40, 40) กำหนดเส้นสีแดง (0xFF0000) เขียนโปรแกรมได้ดังนี้
tft.drawLine(10, 10, 40, 40, tft.color24to16(0xFF0000)); // int32_t xs, int32_t ys, int32_t xe, int32_t ye, uint32_t color
ตัวอย่าง 2 วาดเส้นที่ตำแหน่งเริ่มต้น (50, 20) ไปที่ตำแหน่ง (100, 180) กำหนดเส้นสีเขียว (0x00FF00) เขียนโปรแกรมได้ดังนี้
tft.drawLine(50, 20, 100, 180, tft.color24to16(0x00FF00)); // int32_t xs, int32_t ys, int32_t xe, int32_t ye, uint32_t color
การเทสีทั้งหน้าจอ
ใช้คำสั่ง tft.fillScreen() มีรูปแบบคำสั่งดังนี้
void TFT_eSPI::fillScreen(uint32_t color);
ตัวอย่าง เทสีทั้งหน้าจอด้วยสีดำ
tft.fillScreen(tft.color24to16(0x000000));
การวาดเส้นตรง
การวาดเส้นตรงมีคำสั่งให้ใช้งานดังนี้
void TFT_eSPI::drawLine(int32_t xs, int32_t ys, int32_t xe, int32_t ye, uint32_t color); // ใช้วาดเส้นตรงแนวตั้ง แนวนอน และแบบเอียง
void TFT_eSPI::drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color); // ใช้วาดเส้นตรงแบบแนวตั้ง
void TFT_eSPI::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color); // ใช้วาดเส้นตรงแนวนอน
ตัวอย่างที่ 1 วาดเส้นตรงที่ตำแหน่งเริ่มต้น (0, 0) ไปตำแหน่ง (140, 20) กำหนดเส้นสีขาว (0xFFFFFF) เขียนโปรแกรมได้ดังนี้
tft.drawLine(0, 0, 140, 20, tft.color24to16(0xFFFFFF));
ตัวอย่างที่ 2 วาดเส้นตรงแนวตั้งที่ตำแหน่งเริ่มต้น (30, 0) สูง 100 พิกเซล สีขาว (0xFFFFFF) เขียนโปรแกรมได้ดังนี้
tft.drawFastVLine(30, 0, 100, tft.color24to16(0xFFFFFF));
ตัวอย่างที่ 3 วาดเส้นตรงแนวนอนที่ตำแหน่งเริ่มต้น (0, 100) กว้าง 120 พิกเซล สีขาว (0xFFFFFF) เขียนโปรแกรมได้ดังนี้
tft.drawFastHLine(0, 100, 120, tft.color24to16(0xFFFFFF));
การวาดสีเหลี่ยม
การวาดสี่เหลี่ยมมีคำสั่งให้ใช้งานดังนี้
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::drawRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, uint32_t color); // วาดกรอบสี่เหลี่ยมขอบโค้ง
void TFT_eSPI::fillRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, uint32_t color); // วาดสี่เหลี่ยมแบบทึบขอบโค้ง
ตัวอย่างที่ 1 วาดกรอบสี่เหลี่ยมที่จุดเริ่มต้น (30, 30) ขนาด 40 x 60 พิกเซล สีน้ำเงิน เขียนโปรแกรมได้ดังนี้
tft.drawRect(30, 30, 40, 60, tft.color24to16(0x0000FF));
ตัวอย่างที่ 2 วาดกล่องสี่เหลี่ยมทึบแสงที่จุดเริ่มต้น (20, 60) ขนาด 100 x 100 พิกเซล สีขาว เขียนโปรแกรมได้ดังนี้
tft.fillRect(30, 30, 40, 60, tft.color24to16(0xFFFFFF));
ตัวอย่างที่ 3 วาดกรอบสี่เหลี่ยมขอบโค้งที่จุดเริ่มต้น (30, 30) ขนาด 40 x 60 พิกเซล ขอบโค้ง 20 พิกเซล สีน้ำเงิน เขียนโปรแกรมได้ดังนี้
tft.drawRoundRect(30, 30, 40, 60, 20, tft.color24to16(0x0000FF));
ตัวอย่างที่ 4 วาดกล่องสี่เหลี่ยมทึบแสงขอบโค้งที่จุดเริ่มต้น (20, 60) ขนาด 100 x 100 พิกเซล ขอบโค้ง 10 พิกเซล สีขาว เขียนโปรแกรมได้ดังนี้
tft.fillRoundRect(30, 30, 40, 60, 10, tft.color24to16(0xFFFFFF));
การวาดวงกลม
การวาดวงกลมมีคำสั่งให้ใช้งานดังนี้
void TFT_eSPI::drawCircle(int32_t x, int32_t y, int32_t r, uint32_t color); // วาดกลมโปร่งแสง
void TFT_eSPI::fillCircle(int32_t x, int32_t y, int32_t r, uint32_t color); // วาดวงกลมทึบแสง
ตัวอย่างที่ 1 วาดวงกลมโปร่งแสงจุดศูนย์กลางอยู่ที่ตำแหน่ง (150, 150) รัศมี 80 สีขาว เขียนโปรแกรมได้ดังนี้
tft.drawCircle(150, 150, 80, tft.color24to16(0xFFFFFF));
ตัวอย่างที่ 2 วาดวงกลมทึบแสงจุดศูนย์กลางอยู่ที่ตำแหน่ง (160, 100) รัศมี 40 สีขาว เขียนโปรแกรมได้ดังนี้
tft.fillCircle(160, 100, 40, tft.color24to16(0xFFFFFF));
การใส่ข้อความ
คำสั่งใช้แสดงข้อความมีดังนี้
void TFT_eSPI::drawNumber(long intNumber, int32_t x, int32_t y); // แสดงตัวเลขจำนวนเต็ม
void TFT_eSPI::drawFloat(float floatNumber, uint8_t decimal, int32_t x, int32_t y); // แสดงตัวเลขทศนิยม
void TFT_eSPI::drawString(const String& string, int32_t x, int32_t y); // แสดงข้อความ
ตัวอย่างที่ 1 แสดงตัวเลข 120 ที่ตำแหน่ง (65, 80) เขียนโปรแกรมได้ดังนี้
tft.drawNumber(120, 65, 80);
ตัวอย่างที่ 2 แสดงตัวเลข 3.124 ทศนิยม 3 ตำแหน่ง ที่ตำแหน่ง (100, 60) เขียนโปรแกรมได้ดังนี้
tft.drawFloat(3.124, 3, 100, 60);
ตัวอย่างที่ 3 แสดงข้อความ Hello ที่ตำแหน่ง (20, 20) เขียนโปรแกรมได้ดังนี้
tft.drawString("Hello", 20, 20);
การเปลี่ยนสีข้อความ
การเปลี่ยนสีข้อความทำได้โดยใช้คำสั่ง tft.setTextColor(); มีรูปแบบดังนี้
void TFT_eSPI::setTextColor(uint16_t color); // กำหนดสีของข้อความ
โดยจะต้องเรียกใช้คำสั่ง tft.setTextColor(); ก่อนคำสั่งแสดงข้อความ
ตัวอย่าง แสดงข้อความ Hello สีขาวที่ตำแหน่ง (10, 200) เขียนโปรแกรมได้ดังนี้
tft.setTextColor(tft.color24to16(0xFFFFFF));
tft.drawString("Hello", 10, 200);
การเปลี่ยนขนาดตัวอักษร
ใช้คำสั่ง tft.setTextSize(); มีรูปแบบการใช้งานดังนี้
void TFT_eSPI::setTextSize(uint8_t size);
โดยจะต้องเรียกใช้คำสั่ง tft.setTextSize(); ก่อนใช้คำสั่งแสดงข้อความ
ตัวอย่าง แสดงข้อความ Hello ขนาด 3 ที่ตำแหน่ง (10, 200) เขียนโปรแกรมได้ดังนี้
tft.setTextSize(3);
tft.drawString("Hello", 10, 200);
การกำหนดตำแหน่งข้อความ
กำหนดตำแหน่งข้อความได้ด้วยคำสั่ง tft.setTextDatum() มีรูปแบบการใช้งานดังนี้
void TFT_eSPI::setTextDatum(uint8_t datum);
ในขณะที่ datum สามารถกำหนดได้ดังนี้
#define TL_DATUM 0 // Top left (default)
#define TC_DATUM 1 // Top centre
#define TR_DATUM 2 // Top right
#define ML_DATUM 3 // Middle left
#define CL_DATUM 3 // Centre left, same as above
#define MC_DATUM 4 // Middle centre
#define CC_DATUM 4 // Centre centre, same as above
#define MR_DATUM 5 // Middle right
#define CR_DATUM 5 // Centre right, same as above
#define BL_DATUM 6 // Bottom left
#define BC_DATUM 7 // Bottom centre
#define BR_DATUM 8 // Bottom right
#define L_BASELINE 9 // Left character baseline (Line the 'A' character would sit on)
#define C_BASELINE 10 // Centre character baseline
#define R_BASELINE 11 // Right character baseline
ตัวอย่าง กำหนดให้แสดงข้อความ LED1 ที่จุดเริ่มต้น (100, 100) กำหนดให้ข้อความอยู่กึ่งกลางจุดเริ่มต้น
tft.setTextDatum(MC_DATUM);
tft.drawString("LED1", 100, 100);
คำสั่งที่น่าสนใจอื่น ๆ
คำสั่งที่น่าสนใจมีดังนี้
void TFT_eSPI::drawEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color); // วาดวงกลมแบบโปร่งแสง
void TFT_eSPI::fillEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color); // วาดวงกลมแบบทึบแสง
void TFT_eSPI::drawTriangle(int32_t x1,int32_t y1, int32_t x2,int32_t y2, int32_t x3,int32_t y3, uint32_t color); // วาดสามเหลี่ยมแบบโปร่งแสง
void TFT_eSPI::fillTriangle(int32_t x1,int32_t y1, int32_t x2,int32_t y2, int32_t x3,int32_t y3, uint32_t color); // วาดสามเหลี่ยมแบบทึบแสง
การเขียนโปรแกรมรับค่าจากสวิตช์
การเขียนโปรแกรมรับค่าจากสวิตช์ สามารถใช้คำสั่ง pinMode() และ digitalRead() ที่มีในโปรแกรม Arduino ได้เลย
การเซ็ตโหมด
ก่อนอ่านค่าจากสวิตช จำเป็นต้องเซ็ตโหมดของขา ESP32 ให้พร้อมรับค่าก่อน โดยใช้คำสั่ง #define กำหนดขาต่อสวิตช์ดังนี้
#define SW1_PIN 33
#define SW2_PIN 35
ใน void setup() ใช้คำสั่ง pinMode() ดังนี้
pinMode(SW1_PIN, INPUT);
pinMode(SW2_PIN, INPUT);
จากนั้นใช้คำสั่ง digitalRead() เพื่ออ่านค่าออกมาได้เลย
การรับค่าจากสวิตช์
ใช้คำสั่ง digitalRead() เพื่ออ่านค่าจากสวิตช์ โดยค่าที่อ่านได้จะเป็น 0 หรือ LOW เมื่อกดสวิตช์อยู่ และอ่านค่าได้ 1 หรือ HIGH เมื่อไม่ได้กดสวิตช์
ตัวอย่าง อ่านค่าสถานะของสวิตช์ SW1 แสดงผลใน Serial Monitor
Serial.println(digitalRead(SW1_PIN));
ตัวอย่างโปรแกรมสุ่มเลข
เมื่อกด SW1 จะสุ่มตัวเลขแสดงขึ้นบนหน้าจอ และหากกด SW2 หน้าจอจะถูกเคลียร์
#include <TFT_eSPI.h>
#define SW1_PIN 33
#define SW2_PIN 35
TFT_eSPI tft = TFT_eSPI();
void setup() {
pinMode(SW1_PIN, INPUT); // กำหนดโหมดของขาต่อ SW1
pinMode(SW2_PIN, INPUT); // กำหนดโหมดของขาต่อ SW2
tft.init(); // สั่งให้หน้าจอเริ่มทำงาน
tft.setRotation(3); // หมุนหน้าจอ
tft.fillScreen(tft.color24to16(0x000000)); // เคลียร์หน้าจอ
}
void loop() {
if (digitalRead(SW1_PIN) == LOW) { // ถ้ากดสวิตช์ SW2
while (digitalRead(SW1_PIN) == LOW) delay(10); // รอจนกว่าจะปล่อยสวิตช์
tft.fillScreen(tft.color24to16(0x000000)); // เคลียร์หน้าจอ
tft.setTextDatum(MC_DATUM); // กำหนดตำแหน่งข้อความตรงกลาง
tft.setTextSize(6); // กำหนดตัวอักษรขนาด 6
tft.setTextColor(tft.color24to16(0xFFFFFF)); // กำหนดตัวอักษรสีขาว
tft.drawNumber(random(1111, 9999), 160 / 2, 80 / 2); // สุ่มเลข แล้วนำเลขไปแสดงตรงกลางหน้าจอ
}
if (digitalRead(SW2_PIN) == LOW) { // ถ้ากดสวิตช์ SW2
while (digitalRead(SW2_PIN) == LOW) delay(10); // รอจนกว่าจะปล่อยสวิตช์
tft.fillScreen(tft.color24to16(0x000000)); // เคลียร์หน้าจอ
}
delay(10);
}
การทดสอบ กดที่ SW1 ตัวเลขบนหน้าจอจะสุ่มแสดงขึ้นมา และเมื่อกด SW2 ตัวเลขในหน้าจอจะถูกล้าง (ดังวีดีโอ)
Last updated
Was this helpful?