📑 เนื้อหาในบทความ
📱 ESP32 Cheap Yellow Display (CYD) คืออะไร?
ESP32 Cheap Yellow Display (CYD) หรือที่รู้จักกันในชื่อ ESP32-2432S028R เป็นบอร์ดพัฒนา ESP32 ที่มาพร้อมกับหน้าจอ TFT LCD ขนาด 2.4 นิ้วความละเอียด 240x320 พิกเซล พร้อมระบบสัมผัส (Resistive Touchscreen) ในตัว บอร์ดนี้ได้รับความนิยมอย่างสูงในชุมชน IoT เพราะราคาถูก (ประมาณ 200-300 บาท) แต่มาพร้อมฟีเจอร์ครบครัน
💡 จุดเด่นของ CYD: เหมาะสำหรับผู้เริ่มต้นที่ต้องการสร้างโปรเจกต์ IoT ที่มีหน้าจอแสดงผลและระบบสัมผัส โดยไม่ต้องเสียเงินมาก ใช้ MicroPython ทำให้เขียนโค้ดได้ง่ายเหมือน Python
บอร์ดนี้ใช้ชิป ESP32-WROVER ที่มี RAM 4MB และ Flash memory 4MB ซึ่งเพียงพอสำหรับรันโค้ด Python และแสดงกราฟิกบนหน้าจอได้อย่างลื่นไหล นอกจากนี้ยังมีพอร์ต GPIO ที่สามารถใช้เชื่อมต่อเซ็นเซอร์และอุปกรณ์เพิ่มเติมได้อีกด้วย
⚙️ สเปคและคุณสมบัติ
🖥️ หน้าจอแสดงผล
- • ขนาด: 2.4 นิ้ว
- • ความละเอียด: 240x320 พิกเซล
- • ประเภท: TFT LCD
- • สี: 65,536 สี (16-bit)
- • ไดร์เวอร์: ILI9341
🧠 ไมโครคอนโทรลเลอร์
- • ชิป: ESP32-WROVER
- • คอร์: Xtensa Dual-Core 32-bit
- • ความเร็ว: 240 MHz
- • RAM: 4MB (PSRAM)
- • Flash: 4MB
📡 การเชื่อมต่อไร้สาย
- • WiFi: 802.11 b/g/n
- • Bluetooth: BLE 4.2
- • อินเทอร์เฟซ: SPI, I2C, UART
- • GPIO: 15 พิน
🔌 พินและอินเทอร์เฟซ
- • Touch: XPT2046 (Resistive)
- • SD Card: สล็อตในตัว
- • USB: USB-C (Programming)
- • จ่ายไฟ: 5V DC
🔧 อุปกรณ์ที่ต้องใช้
ESP32 Cheap Yellow Display (CYD)
บอร์ดหลัก (ESP32-2432S028R) - ราคาประมาณ 200-300 บาท
สาย USB-C
สำหรับเชื่อมต่อกับคอมพิวเตอร์และจ่ายไฟ
คอมพิวเตอร์
Windows, macOS หรือ Linux สำหรับติดตั้ง MicroPython
Micro SD Card (ไม่บังคับ)
สำหรับเก็บข้อมูลและโค้ด
⚠️ ข้อควรระวัง: ตรวจสอบให้แน่ใจว่าซื้อบอร์ด ESP32-2432S028R ที่เป็นรุ่น WROVER (มี PSRAM) เพราะบางรุ่นอาจมี RAM น้อยกว่าและอาจมีปัญหาในการรัน MicroPython
🚀 ขั้นตอนการติดตั้ง MicroPython
1 ดาวน์โหลด MicroPython Firmware
ไปที่เว็บไซต์ MicroPython Downloads และดาวน์โหลดไฟล์ firmware ล่าสุดสำหรับ ESP32:
- เลือกไฟล์:
ESP32_GENERIC-2024xxxx-v1.23.0.bin - (หรือเวอร์ชันล่าสุดที่มี)
2 ติดตั้ง Thonny IDE
Thonny เป็น IDE ฟรีที่ใช้เขียนและอัปโหลดโค้ด MicroPython ได้ง่าย:
- ไปที่ thonny.org
- ดาวน์โหลดและติดตั้งสำหรับ OS ของคุณ
- เปิด Thonny หลังจากติดตั้งเสร็จ
3 เชื่อมต่อบอร์ด ESP32 CYD
- เสียบสาย USB-C เข้ากับบอร์ด ESP32 CYD
- เสียบปลายอีกด้านเข้ากับคอมพิวเตอร์
- รอสักครู่ให้ระบบตรวจจับอุปกรณ์
4 ติดตั้ง MicroPython Firmware
- ใน Thonny: ไปที่ Tools → Options → Interpreter
- เลือก MicroPython (ESP32) จากเมนู
- คลิก "Install or update MicroPython" (ถ้าจำเป็น)
- เลือกพอร์ตที่บอร์ดเชื่อมต่ออยู่ (เช่น
/dev/ttyUSB0หรือCOM3) - คลิก Install และรอให้ติดตั้งเสร็จ
5 ทดสอบการติดตั้ง
เมื่อติดตั้งเสร็จ ให้ทดสอบด้วยการพิมพ์ใน Shell ของ Thonny:
print("Hello from ESP32 CYD!") ถ้าได้ผลลัพธ์ Hello from ESP32 CYD! แสดงว่าติดตั้งสำเร็จ! 🎉
💻 โปรเจกต์แรก: แสดงข้อความและกราฟิก
ตอนนี้เรามาสร้างโปรเจกต์แรกกัน: แสดงข้อความและวาดกราฟิกบนหน้าจอ CYD
📚 หมายเหตุ: ESP32 CYD ใช้ไดร์เวอร์ ILI9341 สำหรับหน้าจอและ XPT2046 สำหรับ touchscreen เราจะใช้ไลบรารี่ MicroPython ที่เขียนขึ้นเพื่อควบคุมอุปกรณ์เหล่านี้
โค้ด MicroPython
# ESP32 CYD MicroPython - แสดงข้อความและกราฟิก
from machine import Pin, SPI
import ili9341
import xpt2046
import time
import math
# ตั้งค่า SPI สำหรับหน้าจอ
spi = SPI(2, baudrate=40000000, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
lcd = ili9341.ILI9341(spi, cs=Pin(15), dc=Pin(2), rst=Pin(4))
# ตั้งค่า SPI สำหรับ touchscreen
spi_touch = SPI(3, baudrate=2000000, sck=Pin(25), mosi=Pin(32), miso=Pin(39))
touch = xpt2046.XPT2046(spi_touch, cs=Pin(33), irq=Pin(36))
# ฟังก์ชันแสดงข้อความ
def show_text(text, x, y, color=ili9341.WHITE, background=ili9341.BLACK):
lcd.fill_rect(x, y, 320, 20, background)
lcd.text(text, x, y, color)
# ฟังก์ชันวาดสี่เหลี่ยม
def draw_rect(x, y, w, h, color):
lcd.fill_rect(x, y, w, h, color)
# ฟังก์ชันวาดวงกลม
def draw_circle(x, y, r, color):
for i in range(-r, r + 1):
for j in range(-r, r + 1):
if i * i + j * j <= r * r:
lcd.pixel(x + i, y + j, color)
# เคลียร์หน้าจอ
lcd.fill(ili9341.BLACK)
# แสดงข้อความต้อนรับ
show_text("ESP32 CYD", 80, 10, ili9341.CYAN)
show_text("MicroPython", 70, 40, ili9341.YELLOW)
show_text("First Project!", 70, 70, ili9341.GREEN)
# วาดกราฟิก
draw_rect(10, 100, 100, 60, ili9341.RED)
draw_rect(120, 100, 100, 60, ili9341.BLUE)
draw_rect(230, 100, 80, 60, ili9341.MAGENTA)
# วาดวงกลม
draw_circle(60, 200, 30, ili9341.CYAN)
draw_circle(160, 200, 30, ili9341.YELLOW)
draw_circle(260, 200, 30, ili9341.GREEN)
# แสดงพิกัดการสัมผัส
show_text("Touch the screen!", 40, 250, ili9341.WHITE)
# หลักการอ่านค่าสัมผัส
while True:
try:
# อ่านค่าสัมผัส
point = touch.get_touch()
if point:
x, y = point
# แสดงพิกัด
show_text(f"X: {x:3d} Y: {y:3d} ", 10, 280, ili9341.WHITE, ili9341.BLACK)
# วาดจุดที่สัมผัส
draw_circle(x, y, 5, ili9341.RED)
time.sleep(0.1)
except:
pass📝 คำอธิบายโค้ด:
- บรรทัด 1-7: นำเข้าไลบรารี่ที่จำเป็นสำหรับควบคุมหน้าจอและ touchscreen
- บรรทัด 10-11: ตั้งค่า SPI และเริ่มต้นใช้งานหน้าจอ ILI9341
- บรรทัด 14-15: ตั้งค่า SPI และเริ่มต้นใช้งาน touchscreen XPT2046
- บรรทัด 18-28: สร้างฟังก์ชันช่วยสำหรับแสดงข้อความและวาดกราฟิก
- บรรทัด 31-44: แสดงข้อความและวาดกราฟิกบนหน้าจอ
- บรรทัด 47-56: อ่านค่าจาก touchscreen และแสดงพิกัด
✅ เคล็ดลับ: คุณสามารถอัปโหลดโค้ดนี้ไปยังบอร์ดผ่าน Thonny โดยคลิกปุ่ม "Run" หรือกด F5 และบันทึกเป็นไฟล์ main.py เพื่อให้รันอัตโนมัติเมื่อเปิดเครื่อง
👆 การใช้งาน Touchscreen
ESP32 CYD ใช้ Resistive Touchscreen ซึ่งต้องกดแรงพอสมควรและรองรับการสัมผัสเพียงจุดเดียว (Single-touch) นี่คือตัวอย่างโค้ดสำหรับสร้างปุ่มกดง่ายๆ:
# ESP32 CYD MicroPython - ปุ่มกดง่ายๆ
from machine import Pin, SPI
import ili9341
import xpt2046
import time
# ตั้งค่าหน้าจอและ touchscreen
spi = SPI(2, baudrate=40000000, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
lcd = ili9341.ILI9341(spi, cs=Pin(15), dc=Pin(2), rst=Pin(4))
spi_touch = SPI(3, baudrate=2000000, sck=Pin(25), mosi=Pin(32), miso=Pin(39))
touch = xpt2046.XPT2046(spi_touch, cs=Pin(33), irq=Pin(36))
# กำหนดตำแหน่งปุ่ม
buttons = [
{"text": "LED ON", "x": 20, "y": 100, "w": 130, "h": 50, "color": ili9341.GREEN},
{"text": "LED OFF", "x": 170, "y": 100, "w": 130, "h": 50, "color": ili9341.RED},
{"text": "CLEAR", "x": 95, "y": 170, "w": 130, "h": 50, "color": ili9341.BLUE},
]
# ฟังก์ชันวาดปุ่ม
def draw_button(btn, pressed=False):
color = btn["color"] if not pressed else ili9341.WHITE
lcd.fill_rect(btn["x"], btn["y"], btn["w"], btn["h"], color)
text_color = ili9341.BLACK if pressed else ili9341.WHITE
# คำนวณตำแหน่งข้อความให้อยู่กลางปุ่ม
text_x = btn["x"] + (btn["w"] - len(btn["text"]) * 8) // 2
text_y = btn["y"] + (btn["h"] - 8) // 2
lcd.text(btn["text"], text_x, text_y, text_color)
# ฟังก์ชันตรวจสอบว่าจุดสัมผัสอยู่ในปุ่มหรือไม่
def is_in_button(x, y, btn):
return (btn["x"] <= x <= btn["x"] + btn["w"] and
btn["y"] <= y <= btn["y"] + btn["h"])
# เคลียร์หน้าจอ
lcd.fill(ili9341.BLACK)
lcd.text("Touch Button Demo", 70, 30, ili9341.YELLOW)
# วาดปุ่มทั้งหมด
for btn in buttons:
draw_button(btn)
# แสดงสถานะ
lcd.text("Status: Ready", 20, 250, ili9341.WHITE)
last_touch_time = 0
while True:
try:
# อ่านค่าสัมผัส
point = touch.get_touch()
current_time = time.ticks_ms()
# ตรวจสอบการกดปุ่ม (debounce)
if point and time.ticks_diff(current_time, last_touch_time) > 300:
x, y = point
# ตรวจสอบแต่ละปุ่ม
for btn in buttons:
if is_in_button(x, y, btn):
# วาดปุ่มที่กด
draw_button(btn, pressed=True)
time.sleep(0.2)
draw_button(btn, pressed=False)
# แสดงสถานะ
status_text = f"Pressed: {btn['text']}"
lcd.fill_rect(20, 250, 280, 20, ili9341.BLACK)
lcd.text(status_text, 20, 250, ili9341.CYAN)
last_touch_time = current_time
break
time.sleep(0.05)
except Exception as e:
lcd.text(f"Error: {str(e)}", 20, 280, ili9341.RED)
time.sleep(1)💡 เคล็ดลับ: Resistive touchscreen ต้องการแรงกดที่เพียงพอ และอาจต้องปรับค่า calibration เพื่อให้แม่นยำ คุณสามารถใช้ไลบรารี่เพิ่มเติมเพื่อปรับแต่งค่า sensitivity ได้
📶 การเชื่อมต่อ WiFi
ตอนนี้เรามาเชื่อมต่อ ESP32 CYD กับ WiFi เพื่อสร้างโปรเจกต์ IoT ที่สามารถดึงข้อมูลจากอินเทอร์เน็ตได้:
# ESP32 CYD MicroPython - เชื่อมต่อ WiFi
import network
import time
import urequests
# ข้อมูล WiFi (เปลี่ยนเป็นของคุณเอง)
WIFI_SSID = "YOUR_WIFI_SSID"
WIFI_PASSWORD = "YOUR_WIFI_PASSWORD"
# ฟังก์ชันเชื่อมต่อ WiFi
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('Connecting to WiFi...')
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
# รอให้เชื่อมต่อสำเร็จ
timeout = 20
while not wlan.isconnected() and timeout > 0:
print('.', end='')
time.sleep(1)
timeout -= 1
if wlan.isconnected():
print('\nWiFi connected!')
print('Network config:', wlan.ifconfig())
return True
else:
print('\nFailed to connect to WiFi')
return False
# ฟังก์ชันดึงเวลาจาก NTP Server
def get_ntp_time():
try:
# ใช้ NTP server เพื่อดึงเวลา
import ntptime
ntptime.settime()
rtc = machine.RTC()
t = rtc.datetime()
return f"{t[0]}-{t[1]:02d}-{t[2]:02d} {t[4]:02d}:{t[5]:02d}:{t[6]:02d}"
except:
return "N/A"
# ฟังก์ชันดึงข้อมูลจาก API
def fetch_weather():
try:
# ตัวอย่าง: ดึงข้อมูลสภาพอากาศ (ต้องแก้ไข URL ตาม API จริง)
# url = "http://api.weatherapi.com/v1/current.json?key=YOUR_KEY&q=Bangkok"
# response = urequests.get(url)
# data = response.json()
# response.close()
# return f"Temp: {data['current']['temp_c']}°C"
# สำหรับการทดสอบ: ใช้ที่อยู่ IP ง่ายๆ
url = "http://httpbin.org/ip"
response = urequests.get(url)
data = response.json()
response.close()
return f"IP: {data.get('origin', 'N/A')}"
except Exception as e:
return f"Error: {str(e)}"
# โปรแกรมหลัก
if __name__ == "__main__":
# เชื่อมต่อ WiFi
if connect_wifi():
# ดึงเวลา
current_time = get_ntp_time()
print(f"Current time: {current_time}")
# ดึงข้อมูล
weather_info = fetch_weather()
print(f"Weather info: {weather_info}")
# แสดงบนหน้าจอ (ต้อง import ili9341 ก่อน)
# lcd.text(current_time, 10, 10, ili9341.WHITE)
# lcd.text(weather_info, 10, 30, ili9341.WHITE)
else:
print("Cannot proceed without WiFi connection")🌐 ขยายความสามารถ: เมื่อเชื่อมต่อ WiFi แล้ว คุณสามารถสร้างโปรเจกต์ IoT ที่น่าสนใจได้ เช่น Weather Station, Smart Home Controller, หรือ Notification System ที่เชื่อมต่อกับ CynoIoT Platform
🔧 การแก้ปัญหาที่พบบ่อย
1. บอร์ดไม่ถูกตรวจจับ
- • ตรวจสอบสาย USB-C ว่าเชื่อมต่อถูกต้อง
- • ลองเปลี่ยนพอร์ต USB หรือสาย USB
- • ติดตั้ง Driver สำหรับ USB-to-Serial (CP2102 หรือ CH340)
- • ใน Thonny: ไปที่ Tools → Options → Interpreter แล้วเลือกพอร์ตที่ถูกต้อง
2. MicroPython ไม่ทำงาน
- • ตรวจสอบว่าใช้ firmware ที่ถูกต้องสำหรับ ESP32-WROVER
- • ลองล้าง flash แล้วติดตั้งใหม่: esptool.py erase_flash
- • ตรวจสอบว่ามี PSRAM เพียงพอ (4MB)
- • ใช้ MicroPython เวอร์ชันล่าสุด
3. หน้าจอไม่แสดงผล
- • ตรวจสอบการเชื่อมต่อ SPI: sck, mosi, miso, cs, dc, rst
- • ตรวจสอบว่าไลบรารี่ ili9341 ถูกต้อง
- • ลองปรับค่า baudrate ของ SPI
- • ตรวจสอบว่าหน้าจอได้รับไฟเลี้ยง (5V)
4. Touchscreen ไม่ทำงาน
- • ตรวจสอบการเชื่อมต่อ SPI สำหรับ touchscreen
- • ตรวจสอบว่าไลบรารี่ xpt2046 ถูกต้อง
- • ปรับค่า sensitivity ถ้าจำเป็น
- • กดแรงพอสมควร (เป็น resistive touchscreen)
5. WiFi เชื่อมต่อไม่ได้
- • ตรวจสอบชื่อและรหัสผ่าน WiFi
- • ตรวจสอบว่าอยู่ในระยะสัญญาณ
- • ลองเชื่อมต่อกับเครือข่าย 2.4GHz (ไม่รองรับ 5GHz)
- • ตรวจสอบ firewall หรือการจำกัด MAC address
6. รันโค้ดแล้วเกิด OSError
- • ตรวจสอบว่ามีหน่วยความจำเพียงพอ (แนะนำ 4MB+)
- • ลบไฟล์ที่ไม่จำเป็นออกจากบอร์ด
- • ใช้โค้ดที่มีประสิทธิภาพมากขึ้น (ลดการใช้ global variables)
- • พิจารณาใช้ frozen modules ถ้าจำเป็น
🎉 สรุป
ในบทความนี้ เราได้เรียนรู้:
- ESP32 Cheap Yellow Display (CYD) คืออะไรและมีคุณสมบัติอย่างไร
- วิธีการติดตั้ง MicroPython บนบอร์ด CYD
- การเขียนโค้ดแสดงข้อความและกราฟิกบนหน้าจอ
- การใช้งาน touchscreen เพื่อสร้างปุ่มกด
- การเชื่อมต่อ WiFi เพื่อสร้างโปรเจกต์ IoT
🚀 โปรเจกต์ต่อไปที่ควรลอง
- • Weather Station: แสดงสภาพอากาศจาก API บนหน้าจอ CYD
- • Smart Home Dashboard: ควบคุมอุปกรณ์ IoT ผ่านหน้าจอสัมผัส
- • Notification System: แสดงการแจ้งเตือนจาก CynoIoT Platform
- • Data Logger: บันทึกข้อมูลเซ็นเซอร์ลง SD Card
- • Game Console: สร้างเกมง่ายๆ บนหน้าจอ CYD
หวังว่าบทความนี้จะเป็นประโยชน์ในการเริ่มต้นใช้งาน ESP32 CYD กับ MicroPython!
หากมีคำถามหรือต้องการความช่วยเหลือ สามารถติดต่อได้ที่ support@cynoiot.com