การใช้งาน I2C LCD การแสดงค่าตัวเลขที่มีสัญลักษณ์เปอร์เซ็นต์

 การใช้งาน I2C LCD นั้นง่ายกว่า LCD แบบปกติมาก เนื่องจากใช้สายไฟน้อยลงมาก หลักการทำงานคือใช้ชิปขยายพอร์ต (I/O Expander) ที่สื่อสารผ่านโปรโตคอล I2C ในการควบคุมจอ LCD


หลักการทำงานของ I2C LCD

จอ LCD ทั่วไป (เช่น 16x2 หรือ 20x4) ต้องใช้ขาควบคุมจากไมโครคอนโทรลเลอร์ (Microcontroller) ถึง 6 ถึง 11 ขาในการแสดงผล แต่โมดูล I2C LCD จะมี บอร์ดอะแดปเตอร์ I2C (มักใช้ชิป PCF8574) ต่ออยู่ด้านหลัง ซึ่งมีหลักการทำงานดังนี้:

  1. การลดจำนวนสายไฟ: บอร์ดอะแดปเตอร์ I2C ทำหน้าที่เป็น ตัวแปลง สัญญาณ โดยรับข้อมูลจากไมโครคอนโทรลเลอร์ (เช่น Arduino) ผ่านสายสัญญาณ I2C เพียง 2 เส้น (SDA และ SCL) เท่านั้น

  2. ชิปขยายพอร์ต (I/O Expander): ชิป PCF8574 จะรับข้อมูลอนุกรม (Serial Data) ที่ส่งมาทางสาย I2C แล้วแปลงข้อมูลนั้นให้เป็นสัญญาณแบบขนาน (Parallel Signal) 8 บิต เพื่อส่งไปยังขาควบคุมต่างๆ ของจอ LCD (เช่น RS, E, D4-D7)

  3. การสื่อสารแบบ 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:

โมดูล I2C LCDArduino Unoหน้าที่
GNDGNDกราวด์
VCC5Vแหล่งจ่ายไฟ
SDA (Data)A4ข้อมูล I2C
SCL (Clock)A5นาฬิกา I2C

2. การติดตั้งไลบรารี (Library Installation) 📚

ต้องติดตั้งไลบรารีเพื่อช่วยในการควบคุมจอ LCD ผ่านโปรโตคอล I2C:

  1. เปิด Arduino IDE

  2. ไปที่ Sketch > Include Library > Manage Libraries...

  3. ค้นหา "LiquidCrystal I2C"

  4. ติดตั้งไลบรารีชื่อ 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) 🛠️

ปัญหาสาเหตุและการแก้ไข
ไม่มีข้อความแสดงผล (เห็นแต่สี่เหลี่ยมดำ)ปรับความเข้ม (Contrast): หมุน โพเทนชิออมิเตอร์ (ตัวต้านทานปรับค่าได้) ที่อยู่บนบอร์ด I2C ด้านหลังจอจนกว่าจะเห็นตัวอักษรชัดเจน
จอติดแต่ไม่มีอะไรเลย (ว่างเปล่า)I2C Address ไม่ถูกต้อง: ลองเปลี่ยน Address จาก 0x27 เป็น 0x3F หรือใช้โค้ด I2C Scanner เพื่อหา Address ที่ถูกต้องของโมดูลคุณ
ข้อความเพี้ยน/แสดงผลไม่สมบูรณ์ตรวจสอบว่ากำหนดขนาดของจอในโค้ดถูกต้องหรือไม่ เช่น สำหรับ หรือ สำหรับ

การให้ Arduino แสดงข้อความที่มีการจัดรูปแบบ (เช่น การแสดงค่าตัวเลขที่มีสัญลักษณ์เปอร์เซ็นต์) บนจอ LCD แบบ I2C นักเรียนสามารถใช้ฟังก์ชัน sprintf() ร่วมกับการจัดการข้อความและจอ LCD ได้

เนื่องจากไลบรารี LiquidCrystal_I2C ไม่มีฟังก์ชันที่รองรับการจัดรูปแบบโดยตรงเหมือนกับ Serial.printf() นักเรียนจะต้องใช้ sprintf() เพื่อเตรียมข้อความใน buffer (ตัวแปรเก็บข้อความ) ก่อน แล้วจึงใช้คำสั่ง lcd.print() แสดงผล

นี่คือตัวอย่างโค้ดที่แสดงข้อความตามที่นักเรียนต้องการ

C++
#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 วินาที
}

คำอธิบายโค้ดที่สำคัญ

  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


  1. sprintf(buffer, "CPU:%3d%%", cpu_usage);

    • นี่คือหัวใจของการจัดรูปแบบข้อความ:

      • buffer: ชื่อของตัวแปรที่ใช้เก็บข้อความที่จัดรูปแบบแล้ว

      • "CPU:%3d%%": รูปแบบข้อความ (Format String)

      • cpu_usage: ตัวแปรที่จะถูกแทนที่ลงในตำแหน่ง \%3d ในรูปแบบข้อความ

  2. lcd.print(buffer);

    • หลังจากที่ข้อความถูกเตรียมไว้ใน buffer เรียบร้อยแล้ว ก็ใช้คำสั่ง lcd.print() เพื่อนำไปแสดงผลบนจอ LCD ได้ทันที

การให้ Arduino แสดงข้อความที่มีการจัดรูปแบบ (เช่น การแสดงค่าตัวเลขที่มีสัญลักษณ์เปอร์เซ็นต์) บนจอ LCD แบบ I2C นักเรียนสามารถใช้ฟังก์ชัน sprintf() ร่วมกับการจัดการข้อความและจอ LCD ได้