การใช้งาน I2C LCD นั้นง่ายกว่า LCD แบบปกติมาก เนื่องจากใช้สายไฟน้อยลงมาก หลักการทำงานคือใช้ชิปขยายพอร์ต (I/O Expander) ที่สื่อสารผ่านโปรโตคอล I2C ในการควบคุมจอ LCD
หลักการทำงานของ I2C LCD
จอ LCD ทั่วไป (เช่น 16x2 หรือ 20x4) ต้องใช้ขาควบคุมจากไมโครคอนโทรลเลอร์ (Microcontroller) ถึง 6 ถึง 11 ขาในการแสดงผล แต่โมดูล I2C LCD จะมี บอร์ดอะแดปเตอร์ I2C (มักใช้ชิป PCF8574) ต่ออยู่ด้านหลัง ซึ่งมีหลักการทำงานดังนี้:
การลดจำนวนสายไฟ: บอร์ดอะแดปเตอร์ I2C ทำหน้าที่เป็น ตัวแปลง สัญญาณ โดยรับข้อมูลจากไมโครคอนโทรลเลอร์ (เช่น Arduino) ผ่านสายสัญญาณ I2C เพียง 2 เส้น (SDA และ SCL) เท่านั้น
ชิปขยายพอร์ต (I/O Expander): ชิป PCF8574 จะรับข้อมูลอนุกรม (Serial Data) ที่ส่งมาทางสาย I2C แล้วแปลงข้อมูลนั้นให้เป็นสัญญาณแบบขนาน (Parallel Signal) 8 บิต เพื่อส่งไปยังขาควบคุมต่างๆ ของจอ LCD (เช่น RS, E, D4-D7)
การสื่อสารแบบ I2C:
SDA (Serial Data Line): สายสำหรับส่งและรับข้อมูล
SCL (Serial Clock Line): สายสำหรับสร้างจังหวะ (Clock) เพื่อซิงค์การรับส่งข้อมูล
อุปกรณ์แต่ละตัวบนบัส I2C จะมี Address เฉพาะตัว (เช่น 0x27 หรือ 0x3F) ทำให้ไมโครคอนโทรลเลอร์ (Master) สามารถระบุและสื่อสารกับจอ LCD (Slave) ได้โดยตรง
หลักการนี้ช่วยให้สามารถต่ออุปกรณ์ I2C ได้หลายตัว (สูงสุด 128 ตัว) เข้ากับบัส I2C เดียวกัน โดยใช้ขาควบคุมเพียง 2 ขาจากไมโครคอนโทรลเลอร์
ขั้นตอนการใช้งาน I2C LCD กับ Arduino
1. การต่อวงจร (Wiring) 🔌
I2C LCD ใช้สายไฟเพียง 4 เส้นในการเชื่อมต่อกับบอร์ด Arduino Uno:
2. การติดตั้งไลบรารี (Library Installation) 📚
ต้องติดตั้งไลบรารีเพื่อช่วยในการควบคุมจอ LCD ผ่านโปรโตคอล I2C:
เปิด Arduino IDE
ไปที่ Sketch > Include Library > Manage Libraries...
ค้นหา "LiquidCrystal I2C"
ติดตั้งไลบรารีชื่อ
LiquidCrystal I2C(แนะนำเวอร์ชันที่เขียนโดย Frank de Brabander)
3. โค้ดโปรแกรมพื้นฐาน (Basic Code) 💻
โค้ดนี้จะทำการกำหนด Address ของจอ, เริ่มต้นใช้งาน, เปิดไฟพื้นหลัง, และพิมพ์ข้อความ
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// กำหนด I2C Address (0x27 หรือ 0x3F) และขนาดของจอ (Columns, Rows)
// ถ้า 0x27 ไม่ทำงาน ให้ลองเปลี่ยนเป็น 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init(); // เริ่มต้นใช้งาน LCD
lcd.backlight(); // เปิดไฟ Backlight
// ตั้งค่าตำแหน่งเคอร์เซอร์ที่ (Column 0, Row 0)
lcd.setCursor(0, 0);
lcd.print("I2C LCD Ready!");
// ตั้งค่าตำแหน่งเคอร์เซอร์ที่ (Column 0, Row 1)
lcd.setCursor(0, 1);
lcd.print("Arduino Project");
}
void loop() {
// ใส่โค้ดที่ต้องการให้ทำงานวนซ้ำที่นี่
}
4. การแก้ปัญหาเบื้องต้น (Troubleshooting) 🛠️
การให้ Arduino แสดงข้อความที่มีการจัดรูปแบบ (เช่น การแสดงค่าตัวเลขที่มีสัญลักษณ์เปอร์เซ็นต์) บนจอ LCD แบบ I2C นักเรียนสามารถใช้ฟังก์ชัน sprintf() ร่วมกับการจัดการข้อความและจอ LCD ได้
เนื่องจากไลบรารี LiquidCrystal_I2C ไม่มีฟังก์ชันที่รองรับการจัดรูปแบบโดยตรงเหมือนกับ Serial.printf() นักเรียนจะต้องใช้ sprintf() เพื่อเตรียมข้อความใน buffer (ตัวแปรเก็บข้อความ) ก่อน แล้วจึงใช้คำสั่ง lcd.print() แสดงผล
นี่คือตัวอย่างโค้ดที่แสดงข้อความตามที่นักเรียนต้องการ
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ตั้งค่า Address ของ I2C และขนาดของจอ (16 คอลัมน์, 2 แถว)
// ถ้า 0x27 ไม่ทำงาน ให้ลองเปลี่ยนเป็น 0x3F
LiquidCrystal_I2C lcd(0x27, 16, 2);
// กำหนดขนาดของ Buffer สำหรับเก็บข้อความ
#define LCD_COLS 16
char buffer[LCD_COLS + 1]; // +1 สำหรับ null terminator (\0)
// ตัวอย่างค่าตัวแปรที่เราต้องการแสดง
int cpu_usage = 45;
void setup() {
lcd.init(); // เริ่มต้นใช้งาน LCD
lcd.backlight(); // เปิดไฟ Backlight
// พิมพ์ข้อความหัวเรื่องที่บรรทัด 0
lcd.setCursor(0, 0);
lcd.print("System Status:");
}
void loop() {
// 1. จำลองการเปลี่ยนแปลงค่า (ในความเป็นจริง ค่านี้มาจากเซ็นเซอร์หรือการคำนวณ)
cpu_usage = (millis() / 1000) % 100; // ค่าจะวนจาก 0 ถึง 99
// 2. ใช้ sprintf เพื่อจัดรูปแบบข้อความ
// "CPU:%3d%% " หมายความว่า:
// - "CPU:" คือข้อความปกติ
// - "%3d" คือแสดงตัวเลขจำนวนเต็ม (d) โดยใช้พื้นที่ 3 หลัก (3)
// - "%%" คือการแสดงสัญลักษณ์เปอร์เซ็นต์ (%)
// - " " คือเว้นวรรคท้ายสุด (เพื่อให้ข้อความมีความสมบูรณ์)
sprintf(buffer, "CPU:%3d%%", cpu_usage);
// 3. แสดงข้อความที่ถูกจัดรูปแบบแล้วออกทางจอ LCD ที่บรรทัด 1
lcd.setCursor(0, 1);
lcd.print(buffer);
delay(1000); // อัพเดททุก 1 วินาที
}
คำอธิบายโค้ดที่สำคัญ
#define LCD_COLS 16และchar buffer[LCD_COLS + 1];นักเรียนต้องประกาศ Array of Characters (
char buffer[ ]) หรือที่เรียกว่า String Buffer เพื่อใช้เป็นพื้นที่พักข้อมูลสำหรับเก็บข้อความที่ถูกจัดรูปแบบโดยฟังก์ชันsprintf()ขนาดของ Buffer ควรเท่ากับความกว้างของจอ LCD (เช่น 16) บวกด้วย 1 สำหรับอักขระพิเศษที่เรียกว่า null terminator (
\0) ซึ่งเป็นจุดสิ้นสุดของ String
sprintf(buffer, "CPU:%3d%%", cpu_usage);นี่คือหัวใจของการจัดรูปแบบข้อความ:
buffer: ชื่อของตัวแปรที่ใช้เก็บข้อความที่จัดรูปแบบแล้ว"CPU:%3d%%": รูปแบบข้อความ (Format String)cpu_usage: ตัวแปรที่จะถูกแทนที่ลงในตำแหน่ง\%3dในรูปแบบข้อความ
lcd.print(buffer);หลังจากที่ข้อความถูกเตรียมไว้ใน
bufferเรียบร้อยแล้ว ก็ใช้คำสั่งlcd.print()เพื่อนำไปแสดงผลบนจอ LCD ได้ทันที
.png)




%20int%20cpu.jpg)
