กลับไปหน้ารวมไฟล์
how-to-connect-two-162-lcd-together-with-arduino-7a50c9.md

I2C Multiplexing: สถาปัตยกรรมการเชื่อมต่อ LCD 16x2 สองจอ

บทนำ

ในโปรเจกต์นี้ พี่จะมาสอนวิธีเชื่อมต่อ LCD สองตัวให้ทำงานด้วย Arduino ตัวเดียวให้ดู พี่เจอปัญหามาเยอะตอนเริ่มทำ เลยจะมาแชร์วิธีให้น้องทำได้ง่ายๆ ไม่ต้องเจอปัญหาแบบพี่ พี่ค้นหาข้อมูลในเน็ตเยอะมากแต่ก็หาไม่เจออะไรที่ช่วยได้จริงๆ

เกี่ยวกับอุปกรณ์

เมื่อเชื่อม LCD สองตัวกับ Arduino ข้อความที่เลื่อนจบในจอแรกจะถูกส่งต่อไปยังจอที่สองโดยอัตโนมัติ พี่ปวดหัวเรื่องโค้ด Arduino สำหรับงานนี้มาก LCD 16x2 ปกติที่ต่อกับ Arduino Nano ใช้พินไป 12 พิน ดังนั้นถ้าจะต่อสองจอแบบธรรมดาก็ต้องใช้พินถึง 24 พิน โดยใช้ 6 พินต่อจอสำหรับส่งข้อมูล ในเซ็ตอัพของพี่ พี่ต่อแค่ 14 พินจาก LCD ไปยัง Arduino Nano: 12 พินสำหรับส่งข้อมูล และ 2 พินสำหรับฟังก์ชันอื่น

แต่มีวิธีที่ประหยัดพินกว่านั้นเยอะ! ถ้านักวิศวะต้องการแสดงข้อมูลเทเลเมทรีแบบยาวเหยียด (เช่น ติดตามเกมยานอวกาศ หรือแสดงสถิติหลายแถว) LCD 16x2 จอเดียวมันไม่พอแน่นอน ทางออกที่ชัดเจนคือเพิ่มจอแสดงผลอีกจอสิ! แต่ว่า การเชื่อม LCD สองจอ ด้วยโปรโตคอล I2C แบบมาตรฐานจะเจอปัญหาทันที: พวกมันมักจะมีแอดเดรสฮาร์ดแวร์เดียวกันเป๊ะ (ส่วนใหญ่คือ 0x27) พอ Arduino ส่งคำสั่งไปว่า "HELLO" ทั้งสองจอจะแสดง "HELLO" พร้อมกันเลย! วิธีแก้คือต้องไปปรับแต่งฮาร์ดแวร์บนโมดูล I2C backpack นั่นเอง เพื่อให้แต่ละจอมีแอดเดรสเป็นของตัวเองบนบัสข้อมูลเส้นเดียวกัน!

การปรับแอดเดรส I2C ด้วยการบัดกรี (PCF8574)

พิน SDA (ข้อมูล) และ SCL (สัญญาณนาฬิกา) สามารถต่อขนานไปยังหน้าจอทั้งสองได้อย่างปลอดภัย ปัญหาหลักคือรหัส ID ของอุปกรณ์ I2C

  1. ชิปสีดำ PCF8574T ที่ด้านหลังของโมดูล LCD จะมีแผ่นทองแดงเล็กๆ สามจุดเขียนไว้ว่า A0, A1, และ A2
  2. โดยปกติมันจะไม่ถูกเชื่อมต่อ (เปิดวงจรอยู่) ทำให้ได้แอดเดรสเริ่มต้นเป็น 0x27
  3. เพื่อให้หน้าจอที่สองมี ID ที่ไม่ซ้ำกัน ให้ใช้หัวแร้งบัดกรีเชื่อมแผ่นทองแดง A0 บนจอแสดงผลเพียงจอเดียวเท่านั้น
  4. การปรับฮาร์ดแวร์นี้จะเปลี่ยนแอดเดรสของ LCD นั้นเป็น 0x26

นี่คือโครงสร้างโค้ดพื้นฐานสำหรับควบคุมทั้งสองจอแยกกัน:

#include <LiquidCrystal_I2C.h>

// Initialize each LCD with its unique I2C address
LiquidCrystal_I2C lcd1(0x27, 16, 2); // The default, unmodified LCD
LiquidCrystal_I2C lcd2(0x26, 16, 2); // The LCD with the soldered A0 bridge

void setup() {
  lcd1.init();
  lcd2.init();

  lcd1.backlight();
  lcd2.backlight();

  lcd1.setCursor(0, 0);
  lcd1.print("Master Control!");
  lcd2.setCursor(0, 0);
  lcd2.print("Telemetry Hub!"); // Each screen operates independently!
}

กำจัดฝันร้ายสายริบบอน 16 เส้น

ก่อนที่ I2C backpack จะฮิตกันแบบทุกวันนี้ การต่อจอ LCD เปล่าๆ สองจอเข้าด้วยกันเนี่ย มันคือวงจรเขาวงกตที่ต้องใช้สายตั้ง 12 เสน่ห์ต่อจอ เกือบจะกิน pin ดิจิตอลของ Arduino Uno หมดบอร์ดเลยทีเดียว

  • แต่พอลองใช้โปรโตคอล I2C ดู ปรากฏว่า Arduino ใช้แค่ สองพินเท่านั้น คือ Analog 4 (SDA) กับ Analog 5 (SCL)!
  • ตามทฤษฎีแล้ว เราสามารถต่อจอ LCD ได้ถึง แปด (8) จอ บนสายสองเส้นนี้เลยนะ เงื่อนไขคือต้องตั้งค่า solder bridge (ใช้การผสมกันของ A0, A1, A2) ให้แต่ละโมดูลมีที่อยู่ (address) ไม่ซ้ำกัน

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

  • Arduino Uno/Nano (ทำหน้าที่เป็นสมองหลัก คอยประมวลผลและจัดการสตริง)
  • จอ LCD 16x2 พร้อม โมดูล I2C PCF8574 Backpack จำนวน 2 จอ
  • หัวแร้งและตะกั่วบัดกรีปลายแหลม (จำเป็นมากสำหรับการบัดกรี jumper ที่ address pads)
  • สเก็ตช์ I2C Scanner (เครื่องมือแก้ปัญหาสำคัญ ที่ใช้สแกนบัสเพื่อตรวจสอบว่าเราเปลี่ยน address เป็น 0x27 กับ 0x26 สำเร็จแล้วจริงๆ)

วิดีโอสาธิต

{% embed url="https://www.youtube.com/embed/YRgJcx0-wZY" %} วิดีโอสาธิตการทำงานของโปรเจค {% endembed %}

ถ้าชอบก็กดไลค์ แชร์ คอมเมนต์ และติดตามกันด้วยนะวัยรุ่น

รูปภาพโปรเจค

Image of project

ภาพโปรเจค

Circuit Diagram

แผนภาพวงจร

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "shashwatraj98765"
category: "Screens & Displays"
components:
  - "2x Alphanumeric LCD, 16 x 2"
  - "1x Breadboard (generic)"
  - "1x Jumper wires (generic)"
  - "1x Arduino Nano R3"
  - "1x Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires"
description: "Addressing dual I2C matrices! Solve the critical single-bus conflict by heavily manipulating the microscopic hardware solder-bridges natively on LCD backpack microchips, granting the Arduino unparalleled command over multiple 16x2 text panels synchronously over identical logic wires."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/48f3c5bd-b0e4-4b57-afbc-bd8811447e13.ino"
encryptedPayload: "U2FsdGVkX1+Zq59RCj8oybrOBdfet8ifPRCm/+diYG8lG/UVWXddrg+Wo09m4nJz+QrUc5hUzW4CYKH39oHTRp4ozTIYtB8lRFa180bM/zg="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/how-to-connect-two-162-lcd-together-with-arduino-7a50c9_cover.jpg"
lang: "en"
likes: 6
passwordHash: "f61a72ee403a2736962f33fb9654beff0b043c1b67a1e7aeeb2fe0cb9a1b0f5f"
price: 870
seoDescription: "Learn how to connect two 16*2 LCD screens to a single Arduino. A unique project tutorial you won't find anywhere else."
tags:
  - "arduino"
  - "embedded"
  - "arduino uno"
  - "home automation"
  - "smart appliances"
  - "16*2 lcd"
  - "lcd display"
  - "arduino nano"
title: "ต่อ LCD 16x2 สองตัวให้คุยกันรู้เรื่องด้วย Arduino ง่ายนิดเดียว!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/YRgJcx0-wZY"
views: 10698