จากบทความ ST7735S 0.96″ 80×160 TFT LCD ได้กล่าวถึงคุณลักษณะและหน้าที่ของขาเชื่อมต่อพร้อมตัวอย่างการเชื่อมต่อกับ TTGO T8 ESP32 ไปเรียบร้อยแล้ว ในบทความนี้เป็นตัวอย่างการนำโมดูลแสดงผลมาใช้งานกับ ESP8266 ซึ่งมีขีดจำกัดในเรื่องของปริมาณหน่วยความจำที่น้อยกว่า ESP32 จึงต้องแก้ปัญหาด้วยการคอมไพล์ไลบรารีให้เป็นไบต์โค้ดนามสกุล mpy
การเชื่อมต่อกับ ESP8266
การเชื่อมต่อโมดูลแสดงผลเข้ากับ ESP8266 เป็นดังตารางต่อไปนี้
TFT LCD Module | ESP8266 |
---|---|
GND | GND |
VCC | 3V3 |
SCL | D5 |
SDA | D7 |
RST | RST |
DC | D0 |
CS | GND หรือ D8 |
BLK | 3V3 |
ตัวอย่างโปรแกรม
การใช้งานไลบรารี st7735 ตามที่ได้กล่าวถึงในบทความก่อนหน้านี้เมื่อนำมาใช้กับ ESP8266 จะประสบปัญหาเรื่องปริมาณหน่วยความจำในการประมวลผลคำสั่งจึงต้องคอมไพล์ st7735.py ด้วย mpy-cross เพื่อสร้างไบต์โค้ดของไฟล์ต้นฉบับดังคำสั่งต่อไปนี้
mpy-cross st7735.py
และด้วยจำนวนหน่วยความจำที่น้อยทำให้ไม่สามารถใช้ sysfont.py พร้อมกันได้ถึงแม้จะทำการคอมไพล์ให้เป็นไบต์โค้ดแล้ว ทางเราจึงปรับตัวอย่าง test80x160.py ใหม่โดยปรับความถี่สัญญาณนาฬิกาเป็น 160MHz ความถี่สัญญาณนาฬิกาในการสื่อสารบัส SPI เป็น 20MHz และตัดตัวอย่างการแสดงตัวอักษรออกไป
#code10-1
from st7735 import TFT
from machine import SPI,Pin
import machine as mc
import time
import math
mc.freq(160000000)
spi = SPI(1, baudrate=20000000,polarity=0, phase=0)
# dc, rst, cs
tft=TFT(spi,16)
tft.init_7735(tft.GREENTAB80x160)
def testlines(color):
tft.fill(TFT.BLACK)
for x in range(0, tft.size()[0], 6):
tft.line((0,0),(x, tft.size()[1] - 1), color)
for y in range(0, tft.size()[1], 6):
tft.line((0,0),(tft.size()[0] - 1, y), color)
tft.fill(TFT.BLACK)
for x in range(0, tft.size()[0], 6):
tft.line((tft.size()[0] - 1, 0), (x, tft.size()[1] - 1), color)
for y in range(0, tft.size()[1], 6):
tft.line((tft.size()[0] - 1, 0), (0, y), color)
tft.fill(TFT.BLACK)
for x in range(0, tft.size()[0], 6):
tft.line((0, tft.size()[1] - 1), (x, 0), color)
for y in range(0, tft.size()[1], 6):
tft.line((0, tft.size()[1] - 1), (tft.size()[0] - 1,y), color)
tft.fill(TFT.BLACK)
for x in range(0, tft.size()[0], 6):
tft.line((tft.size()[0] - 1, tft.size()[1] - 1), (x, 0), color)
for y in range(0, tft.size()[1], 6):
tft.line((tft.size()[0] - 1, tft.size()[1] - 1), (0, y), color)
def testfastlines(color1, color2):
tft.fill(TFT.BLACK)
for y in range(0, tft.size()[1], 5):
tft.hline((0,y), tft.size()[0], color1)
for x in range(0, tft.size()[0], 5):
tft.vline((x,0), tft.size()[1], color2)
def testdrawrects(color):
tft.fill(TFT.BLACK);
for x in range(0,tft.size()[0],6):
tft.rect((tft.size()[0]//2 - x//2, tft.size()[1]//2 - x/2), (x, x), color)
def testfillrects(color1, color2):
tft.fill(TFT.BLACK);
for x in range(tft.size()[0],0,-6):
tft.fillrect((tft.size()[0]//2 - x//2, tft.size()[1]//2 - x/2), (x, x), color1)
tft.rect((tft.size()[0]//2 - x//2, tft.size()[1]//2 - x/2), (x, x), color2)
def testfillcircles(radius, color):
for x in range(radius, tft.size()[0], radius * 2):
for y in range(radius, tft.size()[1], radius * 2):
tft.fillcircle((x, y), radius, color)
def testdrawcircles(radius, color):
for x in range(0, tft.size()[0] + radius, radius * 2):
for y in range(0, tft.size()[1] + radius, radius * 2):
tft.circle((x, y), radius, color)
def testtriangles():
tft.fill(TFT.BLACK);
color = 0xF800
w = tft.size()[0] // 2
x = tft.size()[1] - 1
y = 0
z = tft.size()[0]
for t in range(0, 15):
tft.line((w, y), (y, x), color)
tft.line((y, x), (z, x), color)
tft.line((z, x), (w, y), color)
x -= 4
y += 4
z -= 4
color += 100
def testroundrects():
tft.fill(TFT.BLACK);
color = 100
for t in range(5):
x = 0
y = 0
w = tft.size()[0] - 2
h = tft.size()[1] - 2
for i in range(17):
tft.rect((x, y), (w, h), color)
x += 2
y += 3
w -= 4
h -= 6
color += 1100
color += 100
tft.fill(TFT.BLACK)
testlines(TFT.YELLOW)
time.sleep_ms(500)
testfastlines(TFT.RED, TFT.BLUE)
time.sleep_ms(500)
testdrawrects(TFT.GREEN)
time.sleep_ms(500)
testfillrects(TFT.YELLOW, TFT.PURPLE)
time.sleep_ms(500)
tft.fill(TFT.BLACK)
testfillcircles(10, TFT.BLUE)
testdrawcircles(10, TFT.WHITE)
time.sleep_ms(500)
testroundrects()
time.sleep_ms(500)
testtriangles()
time.sleep_ms(2000)
tft.on(False)
สรุป
จากบทความนี้เราได้ทำการเชื่อมต่อโมดูลแสดงผลเข้ากับ ESP8266 พร้อมสร้างไบต์โค้ดของไลบรารี และเขียนตัวอย่างโปรแกรมเพื่อแสดงผลได้สำเร็จลุล่วงแบบไม่สามารถแสดงตัวอักษรได้เนื่องจากปริมาณหน่วยความจำไม่เพียงพอ ซึ่งถ้าเลือกใช้ MicroPython รุ่นเก่ากว่าอาจจะสามารถใช้งานแต่ทางทีมงานเราไม่ได้ทดสอบ
สุดท้ายขอให้สนุกกับการเขียนโปรแกรม และหวังว่าบทความนี้คงสร้างประโยขน์ให้กับผู้อ่านไม่มากก็น้อยครับ
(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2020-10-14