บทความ: วิธีใช้งาน I2C LCD 16x2 กับ ESP32 ฉบับเข้าใจง่าย

เรียนรู้วิธีเชื่อมต่อและใช้งานจอ LCD 16x2 ผ่านบัส I2C กับ ESP32 พร้อมตัวอย่างโค้ดและคำอธิบายภาษาไทย ประหยัดขา GPIO และง่ายต่อการต่อใช้งาน

📅 8 มีนาคม 2026⏱️ 10 นาที🎯 ระดับเริ่มต้น
2
ขา GPIO ใช้
16x2
ขนาดจอ
I2C
บัสสื่อสาร
Easy
ระดับความยาก

I2C LCD คืออะไร?

I2C LCD (Inter-Integrated Circuit Liquid Crystal Display) คือจอแสดงผลแบบ LCD ที่ติดตั้งมอดูล I2C เพิ่มเข้ามา ทำให้สามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์ด้วยสายเพียง 2 เส้น (SDA และ SCL) แทนที่จะต้องใช้ขา GPIO ถึง 6-10 ขาแบบจอ LCD ธรรมดา

💡 ข้อดีของ I2C LCD:
• ใช้ขา GPIO เพียง 2 ขา (SDA, SCL)
• ต่อใช้งานง่าย ไม่ต้องใช้ตัวต้านทานเพิ่ม
• ปรับความสว่างและคอนทราสต์ได้ด้วยปุ่มหมุน
• มีพอร์ตอินพุตให้ต่อเพิ่มได้

I2C เป็นโปรโตคอลสื่อสารแบบ Serial ที่อนุญาตให้เชื่อมต่ออุปกรณ์หลายตัวบนบัสเดียวกัน โดยแต่ละอุปกรณ์จะมี Address เฉพาะตัว สำหรับ I2C LCD ส่วนใหญ่จะใช้ Address เป็น 0x27 หรือ 0x3F

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

  • ESP32 DevKit หรือบอร์ด ESP32 รุ่นอื่น
  • LCD 16x2 พร้อมมอดูล I2C (PCF8574)
  • สาย Jumper เพื่อเชื่อมต่อระหว่างบอร์ด
  • Potentiometer 10kΩ (ถ้าจอ LCD ไม่มีปุ่มปรับ)
  • USB Cable สำหรับอัปโหลดโค้ดและจ่ายไฟ

⚠️ หมายเหตุ: ถ้าซื้อจอ LCD แยกจากมอดูล I2C อาจต้องบัดกรี้ต่อเอง แนะนำให้ซื้อเป็นชุดที่มาพร้อมกันเพื่อความสะดวก

🔌 วิธีต่อสาย (Wiring Diagram)

เชื่อมต่อ I2C LCD เข้ากับ ESP32 ตามรายการด้านล่าง:

I2C LCD PinESP32 Pinหมายเหตุ
VCC3.3V หรือ 5Vขึ้นกับจอ LCD
GNDGNDกราวด์
SDAGPIO 21I2C Data (ค่าเริ่มต้น)
SCLGPIO 22I2C Clock (ค่าเริ่มต้น)

💡 เคล็ดลับ: ESP32 มี I2C Bus 2 ชุด คือ I2C0 (GPIO 21/22) และ I2C1 (GPIO และตำแหน่งอื่น) คุณสามารถเปลี่ยนขาได้โดยระบุในโค้ด

📚 การติดตั้ง Library

เราจะใช้ Library LiquidCrystal_I2C ซึ่งเป็น Library ยอดนิยมสำหรับใช้งาน I2C LCD ทำตามขั้นตอนดังนี้:

  1. เปิด Arduino IDE
  2. ไปที่ Sketch → Include Library → Manage Libraries
  3. ค้นหา LiquidCrystal_I2C
  4. เลือกติดตั้งเวอร์ชันจาก Frank de Brabander

หรือดาวน์โหลดจาก GitHub: github.com/johnrickman/LiquidCrystal_I2C

💻 ตัวอย่างโค้ด

นี่คือโค้ดพื้นฐานในการแสดงผลข้อความบน I2C LCD:

// รวม Library สำหรับ I2C LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// ตั้งค่า I2C address และขนาดจอ (16 คอลัมน์, 2 แถว)
// ปกติจะเป็น 0x27 หรือ 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  // เริ่มต้นใช้งาน Serial Monitor
  Serial.begin(115200);

  // เริ่มต้นใช้งาน LCD
  lcd.init();
  
  // เปิดไฟหลังจอ (Backlight)
  lcd.backlight();

  // แสดงผลข้อความเริ่มต้น
  lcd.setCursor(0, 0);        // ตำแหน่ง แถวที่ 0, คอลัมน์ที่ 0
  lcd.print("Hello, ESP32!"); // แสดงข้อความ

  lcd.setCursor(0, 1);        // ตำแหน่ง แถวที่ 1, คอลัมน์ที่ 0
  lcd.print("CynoIoT Platform"); // แสดงข้อความบรรทัดที่ 2

  Serial.println("LCD initialized!");
}

void loop() {
  // อัปเดตเวลาทุกวินาที
  static unsigned long lastUpdate = 0;
  
  if (millis() - lastUpdate >= 1000) {
    lastUpdate = millis();
    
    // อ่านเวลาที่ผ่านมา (วินาที)
    int seconds = millis() / 1000;
    
    // แสดงเวลาบน LCD
    lcd.setCursor(12, 1);
    lcd.print(seconds);
    lcd.print("s  ");
  }
}

การแสดงผลตัวแปรและข้อมูลเซนเซอร์

// ตัวอย่างการแสดงผลค่าจากเซนเซอร์
void displaySensorData(float temperature, float humidity) {
  // ล้างจอก่อนแสดงผลใหม่
  lcd.clear();
  
  // แสดงอุณหภูมิ
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temperature, 1); // แสดง 1 ตำแหน่งทศนิยม
  lcd.print("C");
  
  // แสดงความชื้น
  lcd.setCursor(0, 1);
  lcd.print("Humid: ");
  lcd.print(humidity, 1);
  lcd.print("%");
}

// การใช้งานใน loop()
void loop() {
  // จำลองค่าเซนเซอร์
  float temp = random(200, 350) / 10.0; // 20.0 - 35.0 C
  float hum = random(400, 800) / 10.0;  // 40.0 - 80.0 %
  
  displaySensorData(temp, hum);
  
  delay(2000); // อัปเดตทุก 2 วินาที
}

💡 เคล็ดลับ: ใช้ lcd.clear() อย่างระมัดระวังเพราะอาจทำให้จอกระพริบ แนะนำให้ใช้ lcd.print(" ") เพื่อเขียนทับข้อความเดิมแทน

🎨 การสร้างตัวอักษรพิเศษ (Custom Characters)

LCD 16x2 สามารถสร้างตัวอักษรพิเศษได้สูงสุด 8 ตัว นี่คือตัวอย่างการสร้างไอคอนอุณหภูมิ:

// กำหนดรูปไอคอนอุณหภูมิ (8x8 pixels)
byte temperatureIcon[8] = {
  B00100,
  B01010,
  B01010,
  B01110,
  B01110,
  B11111,
  B11111,
  B01110
};

void setup() {
  lcd.init();
  lcd.backlight();
  
  // สร้าง custom character ที่ตำแหน่ง 0
  lcd.createChar(0, temperatureIcon);
  
  // แสดงไอคอน
  lcd.setCursor(0, 0);
  lcd.write(byte(0)); // เรียกใช้ custom character
  lcd.print(" ");
  lcd.print("25.5C");
}

🔧 การแก้ปัญหาที่พบบ่อย

ปัญหา: จอไม่แสดงผล

  • • ตรวจสอบว่าต่อ VCC/GND ถูกต้อง
  • • ปรับคอนทราสต์ด้วยปุ่มหมุนบนมอดูล I2C
  • • ตรวจสอบ I2C Address ว่าเป็น 0x27 หรือ 0x3F
  • • ลองเปลี่ยนขา SDA/SCL กัน

ปัญหา: แสดงผลเป็นสี่เหลี่ยม

  • • ตรวจสอบว่าใช้ I2C Address ที่ถูกต้อง
  • • ติดตั้ง Library ใหม่
  • • ตรวจสอบการต่อสาย SDA/SCL

ปัญหา: ไม่พบ I2C Device

  • • ใช้โค้ดสแกนหา I2C Address
  • • ตรวจสอบว่าจ่ายไฟ 3.3V หรือ 5V ตรงกับจอ LCD
  • • ลองต่อ Pull-up resistors (4.7kΩ) ที่ SDA/SCL

โค้ดสแกนหา I2C Address:

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("\nI2C Scanner");
}

void loop() {
  byte error, address;
  int nDevices = 0;

  Serial.println("Scanning...");
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16) Serial.print("0");
      Serial.println(address, HEX);
      nDevices++;
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found");
  else
    Serial.println("done");
  delay(5000);
}

💡 ไอเดียโปรเจกต์

🌡️ สถานีวัดอุณหภูมิ

แสดงค่าอุณหภูมิและความชื้นจาก DHT22 พร้อมไอคอน

📊 Data Logger

บันทึกข้อมูลเซนเซอร์และแสดงสถิติบนจอ LCD

⏰ นาฬิกาปลุก

ตั้งเวลาปลุกและแสดงเวลาปัจจุบัน

🎮 เมนูระบบ

สร้างเมนูตั้งค่าด้วยปุ่มกด

📝 สรุป

ในบทความนี้คุณได้เรียนรู้:

  • ✓ วิธีเชื่อมต่อ I2C LCD กับ ESP32
  • ✓ การติดตั้งและใช้งาน Library LiquidCrystal_I2C
  • ✓ ตัวอย่างโค้ดแสดงผลข้อความและค่าเซนเซอร์
  • ✓ การสร้างตัวอักษรพิเศษ
  • ✓ การแก้ปัญหาที่พบบ่อย

ถัดไป: ลองประยุกต์ใช้กับโปรเจกต์ IoT ของคุณ เช่น สถานีวัดอุณหภูมิ, ระบบควบคุมอัตโนมัติ หรือเครื่องมือวัดอื่นๆ

© 2026 CynoIoT Platform. All rights reserved.

IoT Platform สำหรับคนไทย