📋 เนื้อหาในบทความ
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 Pin | ESP32 Pin | หมายเหตุ |
|---|---|---|
| VCC | 3.3V หรือ 5V | ขึ้นกับจอ LCD |
| GND | GND | กราวด์ |
| SDA | GPIO 21 | I2C Data (ค่าเริ่มต้น) |
| SCL | GPIO 22 | I2C Clock (ค่าเริ่มต้น) |
💡 เคล็ดลับ: ESP32 มี I2C Bus 2 ชุด คือ I2C0 (GPIO 21/22) และ I2C1 (GPIO และตำแหน่งอื่น) คุณสามารถเปลี่ยนขาได้โดยระบุในโค้ด
📚 การติดตั้ง Library
เราจะใช้ Library LiquidCrystal_I2C ซึ่งเป็น Library ยอดนิยมสำหรับใช้งาน I2C LCD ทำตามขั้นตอนดังนี้:
- เปิด Arduino IDE
- ไปที่ Sketch → Include Library → Manage Libraries
- ค้นหา
LiquidCrystal_I2C - เลือกติดตั้งเวอร์ชันจาก 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 ของคุณ เช่น สถานีวัดอุณหภูมิ, ระบบควบคุมอัตโนมัติ หรือเครื่องมือวัดอื่นๆ