Hướng dẫn sử dụng màn hình LCD 1602 I2C với Arduino Uno

Hướng dẫn nối màn hình LCD 1602 I2C với Arduino Uno, cài thư viện LiquidCrystal_I2C, chạy code hiển thị và quét địa chỉ I2C 0x27/0x3F.

LCD 1602 có thể hiển thị 16 ký tự trên mỗi dòng và gồm hai dòng. Khi gắn backpack I2C, màn hình chỉ cần bốn dây: VCC, GND, SDA và SCL; trong đó SDA và SCL là hai dây tín hiệu.

1. Linh kiện cần chuẩn bị

  • Arduino Uno và cáp USB dữ liệu.
  • Màn hình LCD 1602 có backpack I2C, thường dùng PCF8574.
  • Dây jumper.
  • Arduino IDE và một thư viện LiquidCrystal_I2C tương thích với ví dụ bên dưới.

2. Đấu nối LCD 1602 I2C với Arduino Uno

Đấu nối LCD 1602 I2C với Arduino Uno
LCD I2C Arduino Uno Chức năng
GND GND Mass chung
VCC 5V Nguồn cho module LCD thông dụng; kiểm tra nhãn module trước khi cấp
SDA A4 / SDA Dữ liệu I2C
SCL A5 / SCL Xung clock I2C

Trên Arduino Uno R3, cặp chân SDA/SCL gần AREF được nối chung với A4/A5; không phải một bus I2C thứ hai. Hãy ngắt nguồn trước khi thay đổi dây nối. Không sao chép kết nối VCC = 5 V này sang ESP32/ESP8266: GPIO của các bo đó dùng mức 3,3 V và không được để bus kéo lên 5 V.

Sơ đồ đấu nối màn hình LCD 1602 I2C với Arduino Uno
Sơ đồ đấu nối LCD 1602 I2C với Arduino Uno.

3. Quét địa chỉ I2C

Backpack dùng PCF8574 có dải địa chỉ 0x20–0x27; loại PCF8574A có dải 0x38–0x3F. Các chân A0–A2 chọn một địa chỉ trong dải tương ứng, vì vậy hãy quét bus thay vì mặc định 0x27 hoặc 0x3F. Nạp chương trình sau và mở Serial Monitor ở 115200 baud:

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(100000);
  Serial.println("Scanning I2C...");

  for (uint8_t address = 1; address < 127; ++address) {
    Wire.beginTransmission(address);
    if (Wire.endTransmission() == 0) {
      Serial.print("Found: 0x");
      if (address < 16) Serial.print('0');
      Serial.println(address, HEX);
    }
  }
}

void loop() {}

4. Cài thư viện LiquidCrystal_I2C

  1. Mở Tools > Manage Libraries trong Arduino IDE.
  2. Tìm LiquidCrystal I2C và cài một thư viện có ví dụ cho constructor LiquidCrystal_I2C(address, columns, rows). Mã dưới đây là ví dụ tĩnh, chưa được biên dịch với một package/version cụ thể.
  3. Nếu thư viện bạn chọn dùng begin() thay cho init(), hãy theo đúng ví dụ của phiên bản đó; các thư viện trùng tên không hoàn toàn có cùng API.

5. Chương trình hiển thị mẫu

Thay 0x27 bằng địa chỉ vừa tìm thấy nếu kết quả quét khác:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

constexpr uint8_t LCD_ADDRESS = 0x27;
LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2);

void setup() {
  Wire.begin();
  Wire.setClock(100000);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Hello, Pyworld!");
  lcd.setCursor(0, 1);
  lcd.print("LCD 1602 I2C");
}

void loop() {}

6. Xử lý lỗi thường gặp

  • Không tìm thấy địa chỉ: kiểm tra nguồn, GND, dây SDA/SCL và mối hàn backpack.
  • Có đèn nền nhưng không thấy chữ: xoay nhẹ biến trở tương phản trên backpack.
  • Ký tự sai: kiểm tra kích thước 16 × 2, địa chỉ và API của đúng thư viện.
  • Quét thấy địa chỉ nhưng LCD vẫn sai: ánh xạ các chân PCF8574 sang HD44780 trên backpack có thể không khớp với thư viện.
  • Bus chập chờn: rút ngắn dây, kiểm tra đầu nối và tránh đi song song với dây công suất.

Xem thêm cách dùng OLED SSD1306 với ESP8266 hoặc kết hợp LCD với HX711 và load cell.


Tin tức liên quan

Bãi giữ xe thông minh: đếm chỗ trống bằng cảm biến và ESP32
Bãi giữ xe thông minh: đếm chỗ trống bằng cảm biến và ESP32

Làm bãi giữ xe thông minh mẫu: ESP32 đọc cảm biến siêu âm từng ô, lọc người đi ngang, gửi ESP-NOW về trạm OLED, mô phỏng chọn thời gian lọc, so sánh với đếm ở cổng.

Hướng dẫn đo điện áp 16 bit bằng module ADS1115 với ESP32
Hướng dẫn đo điện áp 16 bit bằng module ADS1115 với ESP32

Hướng dẫn nối module ADC 16 bit ADS1115 với ESP32 DevKit V1 qua I2C, cài thư viện Adafruit ADS1X15, đọc 4 kênh ra vôn, đo vi sai và chọn gain an toàn.

ESP32 điều khiển động cơ bước NEMA 17 với A4988: vi bước, chỉnh dòng VREF, tăng tốc mượt
ESP32 điều khiển động cơ bước NEMA 17 với A4988: vi bước, chỉnh dòng VREF, tăng tốc mượt

Hướng dẫn điều khiển động cơ bước NEMA 17 bằng ESP32 qua driver A4988: nối dây, chỉnh dòng VREF, chọn vi bước 1/16, tăng tốc giảm tốc hình thang và thí nghiệm STEM.

Vẽ đồ thị dữ liệu ESP32 trên ThingSpeak: theo dõi pin 18650, ngủ sâu và ước tính thời gian chạy pin
Vẽ đồ thị dữ liệu ESP32 trên ThingSpeak: theo dõi pin 18650, ngủ sâu và ước tính thời gian chạy pin

ESP32 chạy pin 18650 thức dậy mỗi 10 phút, đo điện áp pin, gửi lên ThingSpeak rồi ngủ sâu; cách tạo kênh, ước tính thời gian chạy pin và giảm dòng lúc ngủ.

Màn hình TFT SPI ILI9341 với ESP32: nối dây, lệnh khởi động, vẽ chữ và đồ thị không cần thư viện
Màn hình TFT SPI ILI9341 với ESP32: nối dây, lệnh khởi động, vẽ chữ và đồ thị không cần thư viện

Nối màn hình TFT ILI9341 2.4–2.8 inch với ESP32, các lệnh khởi động và vẽ vùng, màu RGB565, bộ chữ 5x7, chương trình vẽ số lớn và đồ thị điện áp không nhấp nháy, bảng sửa lỗi.

Cảm biến khí MQ-2 và MQ-135 với ESP32: làm nóng, hiệu chuẩn R0, ước tính ppm và cảnh báo khí gas
Cảm biến khí MQ-2 và MQ-135 với ESP32: làm nóng, hiệu chuẩn R0, ước tính ppm và cảnh báo khí gas

Cảm biến khí MQ hoạt động thế nào, cầu phân áp cho chân AO, tính Rs, hiệu chuẩn R0 trong không khí sạch, đổi ra ppm gần đúng, cảnh báo có ngưỡng trễ và giới hạn của MQ-135.

Dải LED WS2812B với ESP32: điều khiển từng bóng bằng RMT không cần thư viện, tính dòng và chọn nguồn
Dải LED WS2812B với ESP32: điều khiển từng bóng bằng RMT không cần thư viện, tính dòng và chọn nguồn

Bên trong bóng WS2812B, tín hiệu một dây 24 bit GRB, cách tính dòng để chọn nguồn, nối dải LED với ESP32 và tạo tín hiệu bằng bộ RMT không cần thư viện, kèm ba hiệu ứng.

Máy cho cá ăn tự động bằng ESP32: servo SG90, DS3231 giữ giờ khi mất điện, đặt lịch trên web
Máy cho cá ăn tự động bằng ESP32: servo SG90, DS3231 giữ giờ khi mất điện, đặt lịch trên web

Làm máy cho cá ăn tự động bằng ESP32: servo SG90 quay đĩa có lỗ, DS3231 giữ giờ khi mất điện, đồng bộ giờ Internet, trang web đặt 4 giờ cho ăn, không cho ăn lặp sau mất điện.


Bình luận
Đã thêm vào giỏ hàng