บทความ: เริ่มต้นใช้งาน ESP32 Cheap Yellow Display (CYD) ด้วย MicroPython

เรียนรู้วิธีการติดตั้งและเขียนโปรแกรม ESP32 Cheap Yellow Display (CYD) ด้วย MicroPython สำหรับสร้างโปรเจกต์ IoT ที่มีหน้าจอสัมผัสราคาประหยัด

📅 16 มีนาคม 2026⏱️ 15 นาที🎯 ระดับเริ่มต้น

📱 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

🔧 อุปกรณ์ที่ต้องใช้

1️⃣

ESP32 Cheap Yellow Display (CYD)

บอร์ดหลัก (ESP32-2432S028R) - ราคาประมาณ 200-300 บาท

2️⃣

สาย USB-C

สำหรับเชื่อมต่อกับคอมพิวเตอร์และจ่ายไฟ

3️⃣

คอมพิวเตอร์

Windows, macOS หรือ Linux สำหรับติดตั้ง MicroPython

4️⃣

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 ได้ง่าย:

  1. ไปที่ thonny.org
  2. ดาวน์โหลดและติดตั้งสำหรับ OS ของคุณ
  3. เปิด Thonny หลังจากติดตั้งเสร็จ

3 เชื่อมต่อบอร์ด ESP32 CYD

  1. เสียบสาย USB-C เข้ากับบอร์ด ESP32 CYD
  2. เสียบปลายอีกด้านเข้ากับคอมพิวเตอร์
  3. รอสักครู่ให้ระบบตรวจจับอุปกรณ์

4 ติดตั้ง MicroPython Firmware

  1. ใน Thonny: ไปที่ Tools → Options → Interpreter
  2. เลือก MicroPython (ESP32) จากเมนู
  3. คลิก "Install or update MicroPython" (ถ้าจำเป็น)
  4. เลือกพอร์ตที่บอร์ดเชื่อมต่ออยู่ (เช่น /dev/ttyUSB0 หรือ COM3)
  5. คลิก 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