Thứ Hai, 30 tháng 10, 2023

Bài 29: Hướng dẫn: Hiển thị Thông báo lên LCD 16x2 bằng Arduino Uno qua Giao tiếp I2C

Hướng dẫn: Hiển thị Thông báo lên LCD 16x2 bằng Arduino Uno qua Giao tiếp I2C

1. Giới thiệu

Màn hình LCD (Liquid Crystal Display) là một cách phổ biến để hiển thị thông tin văn bản trong các dự án Arduino. Tuy nhiên, việc kết nối trực tiếp màn hình LCD 16x2 (16 cột, 2 hàng) tiêu chuẩn thường đòi hỏi sử dụng nhiều chân digital của Arduino (ít nhất 6 chân).

Để tiết kiệm chân và đơn giản hóa việc đi dây, chúng ta có thể sử dụng một module chuyển đổi I2C sang LCD. Module nhỏ này gắn vào mặt sau của LCD và cho phép bạn điều khiển toàn bộ màn hình chỉ bằng hai chân trên Arduino: chân SDA (Serial Data) và SCL (Serial Clock).

Bài viết này sẽ hướng dẫn bạn từng bước cách kết nối màn hình LCD với Arduino Uno thông qua module I2C và lập trình để hiển thị một thông báo đơn giản.

2. Các Thành phần Cần thiết

  • Arduino Uno R3 (hoặc board Arduino tương thích): Bộ não của dự án.

    Màn hình LCD 16x2: Loại màn hình ký tự phổ biến.
  • Module Chuyển đổi I2C sang LCD (PCF8574 based): Module nhỏ gắn vào LCD, có 4 chân ra (GND, VCC, SDA, SCL).
  • Dây cắm (Jumper Wires): Để kết nối các thành phần.
  • Cáp USB: Để kết nối Arduino với máy tính.

Tại sao dùng Module I2C?

  • Tiết kiệm chân: Chỉ cần 2 chân (SDA, SCL) thay vì 6+ chân digital.

  • Đơn giản hóa kết nối: Ít dây hơn, giảm khả năng mắc lỗi đi dây.

  • Phổ biến và tương thích: Hoạt động với hầu hết các loại LCD ký tự (16x2, 20x4...) và vi điều khiển hỗ trợ I2C.

3. Kết nối Phần cứng

Kết nối các thiết bị theo sơ đồ sau:

Chân trên Module I2CKết nối tới Chân trên Arduino Uno
GNDGND
VCC5V
SDAA4 (Chân SDA mặc định của Uno)
SCLA5 (Chân SCL mặc định của Uno)

Lưu ý: Module I2C thường được hàn sẵn hoặc cắm trực tiếp vào 16 chân phía sau màn hình LCD. Đảm bảo module được gắn chắc chắn.

4. Cài đặt và Cấu hình Phần mềm Arduino IDE

Bước 4.1: Kết nối Arduino và Chọn Board/Port

  1. Kết nối Arduino Uno với máy tính bằng cáp USB.

  2. Mở phần mềm Arduino IDE.

  3. Vào menu Tools -> Board -> Arduino AVR Boards -> Chọn "Arduino Uno".

  4. Vào menu Tools -> Port -> Chọn cổng COM tương ứng với Arduino của bạn (Ví dụ: COM3, COM4...).

Bước 4.2: Cài đặt Thư viện LiquidCrystal_I2C

Để giao tiếp với LCD qua I2C một cách dễ dàng, chúng ta cần cài đặt thư viện chuyên dụng.

  1. Trong Arduino IDE, vào menu Sketch -> Include Library -> Manage Libraries....

  2. Cửa sổ Library Manager sẽ mở ra. Đợi nó tải danh sách thư viện.

  3. Trong ô tìm kiếm, gõ LiquidCrystal_I2C.

  4. Tìm thư viện có tên "LiquidCrystal I2C" (thường của tác giả Frank de Brabander hoặc Marco Schwartz - cả hai đều phổ biến). Chọn thư viện đó.

  5. Nhấp vào nút "Install".

Bước 4.3: Xác định Địa chỉ I2C của Module

Mỗi thiết bị I2C trên cùng một đường bus cần có một địa chỉ duy nhất. Địa chỉ của module I2C LCD có thể khác nhau tùy thuộc vào nhà sản xuất hoặc cấu hình jumper trên module (thường là 0x27 hoặc 0x3F). Chúng ta cần xác định địa chỉ chính xác của module bạn đang dùng.

  1. Kết nối phần cứng như Bước 3.

  2. Trong Arduino IDE, vào menu File -> Examples -> Wire -> chọn i2c_scanner.

  3. Một cửa sổ code mới với sketch i2c_scanner sẽ mở ra.

  4. Nạp (Upload) sketch i2c_scanner này vào Arduino Uno của bạn.

  5. Mở Serial Monitor bằng cách nhấp vào biểu tượng kính lúp ở góc trên bên phải (hoặc Tools -> Serial Monitor).

  6. Đảm bảo tốc độ baud ở góc dưới bên phải của Serial Monitor là 9600 baud.

  7. Serial Monitor sẽ hiển thị thông báo "Scanning..." và sau đó là địa chỉ của các thiết bị I2C được tìm thấy. Hãy ghi lại địa chỉ dạng hexa (ví dụ: 0x27 hoặc 0x3F).

    I2C Scanner
    Scanning...
    I2C device found at address 0x27 ! <--- Ghi lại địa chỉ này
    done

5. Viết và Nạp Code Hiển thị Lên LCD

Bây giờ, hãy tạo một sketch mới và dán đoạn code sau vào:

#include <Wire.h> // Thư viện chuẩn cho giao tiếp I2C
#include <LiquidCrystal_I2C.h> // Thư viện vừai đặt cho LCD I2C
// --- !!! THAY ĐỔI ĐỊA CHỈ NÀY !!! ---
// Thay 0x27 bằng địa chỉ I2C bạn tìm thấy ở Bước 4.3
// Cấu hình màn hình: địa chỉ I2C, số cột (16), số hàng (2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// Khởi tạo giao tiếp với màn hình LCD
lcd.init();
// Bật đèn nền cho màn hình (quan trọng để nhìn thấy chữ)
lcd.backlight();
// Di chuyển con trỏ tới vị trí: cột 4, hàng 0 (hàng đầu tiên)
// Lưu ý: Cột và hàng bắt đầu từ 0
lcd.setCursor(4, 0);
// In chữ "Admin" tại vị trí con trỏ hiện tại
lcd.print("Admin");
// Di chuyển con trỏ tới vị trí: cột 0, hàng 1 (hàng thứ hai)
lcd.setCursor(0, 1);
// In chữ "Xin chao cac ban" tại vị trí con trỏ hiện tại
lcd.print("Xin chao cac ban");
}
void loop() {
// Không cần làm gì trong loop vì chúng ta chỉ hiển ththông báo tĩnh
// Nếu muốn hiển ththông tin thay đổi (ví dụ: từ cảm biến),
// code xử lý và lcd.print() sẽ nằm ở đây.
}

Giải thích Code:

  1. #include <Wire.h>: Nạp thư viện cơ bản cho giao tiếp I2C.

  2. #include <LiquidCrystal_I2C.h>: Nạp thư viện điều khiển LCD qua I2C.

  3. LiquidCrystal_I2C lcd(0x27, 16, 2);:

    • Tạo một đối tượng tên là lcd để điều khiển màn hình.

    • 0x27: Quan trọng! Đây là địa chỉ I2C của module. Bạn phải thay thế nó bằng địa chỉ bạn tìm được từ i2c_scanner.

    • 16: Số cột của màn hình LCD.

    • 2: Số hàng của màn hình LCD.

  4. void setup() { ... }: Hàm này chạy một lần duy nhất khi Arduino khởi động.

    • lcd.init();: Khởi tạo kết nối tới màn hình LCD.

    • lcd.backlight();: Bật đèn nền của màn hình. Nếu không có dòng này, màn hình có thể hiển thị chữ nhưng rất khó nhìn.

    • lcd.setCursor(column, row);: Di chuyển con trỏ (vị trí viết tiếp theo) đến cột (column) và hàng (row) chỉ định. Cột và hàng được đánh số từ 0. Ví dụ: (4, 0) là cột thứ 5 (vì bắt đầu từ 0) trên hàng đầu tiên.

    • lcd.print("Your Text");: In chuỗi ký tự "Your Text" ra màn hình tại vị trí con trỏ hiện tại.

  5. void loop() { ... }: Hàm này chạy lặp đi lặp lại sau khi setup() hoàn thành. Trong ví dụ này, chúng ta để trống vì chỉ cần hiển thị thông báo một lần.

Bước 5.1: Nạp Code vào Arduino

  1. Đảm bảo bạn đã thay đúng địa chỉ I2C trong dòng LiquidCrystal_I2C lcd(0x27, 16, 2);.

  2. Nhấp vào nút "Upload" (biểu tượng mũi tên sang phải) trên Arduino IDE.

6. Kết quả

Sau khi nạp code thành công, màn hình LCD của bạn sẽ sáng đèn nền và hiển thị thông báo:

Admin
Xin chao cac ban

(Nếu màn hình không hiển thị gì hoặc chỉ có các ô vuông, hãy kiểm tra lại kết nối dây, địa chỉ I2C trong code, và thử điều chỉnh biến trở màu xanh phía sau module I2C để chỉnh độ tương phản).

7. Các Hàm Hữu ích Khác của Thư viện LiquidCrystal_I2C

  • lcd.clear(): Xóa toàn bộ nội dung trên màn hình và đưa con trỏ về vị trí (0, 0).

  • lcd.home(): Đưa con trỏ về vị trí (0, 0) mà không xóa nội dung màn hình.

  • lcd.noDisplay(): Tắt hiển thị màn hình (vẫn giữ nội dung trong bộ nhớ).

  • lcd.display(): Bật lại hiển thị màn hình sau khi dùng noDisplay().

  • lcd.noBacklight(): Tắt đèn nền.

  • lcd.backlight(): Bật đèn nền.

  • lcd.cursor(): Hiển thị con trỏ dạng gạch dưới.

  • lcd.noCursor(): Ẩn con trỏ dạng gạch dưới.

  • lcd.blink(): Hiển thị con trỏ dạng khối nhấp nháy.

  • lcd.noBlink(): Tắt con trỏ dạng khối nhấp nháy.

  • lcd.scrollDisplayLeft(): Cuộn nội dung màn hình sang trái một vị trí.

  • lcd.scrollDisplayRight(): Cuộn nội dung màn hình sang phải một vị trí.

Kết luận

Bạn đã học cách kết nối và điều khiển màn hình LCD 16x2 với Arduino Uno bằng module I2C, giúp tiết kiệm chân và đơn giản hóa việc đi dây. Giờ đây bạn có thể sử dụng màn hình LCD để hiển thị thông tin từ cảm biến, trạng thái hoạt động, hoặc tạo các menu đơn giản cho dự án của mình.

Bạn có thể tham khảo mô phỏng của dự án này trên Wokwi tại đây: https://wokwi.com/projects/379994016785285121 (Lưu ý: Địa chỉ I2C trong mô phỏng có thể khác với thiết bị thực tế của bạn).


BÀI TẬP TRẮC NGHIỆM


Không có nhận xét nào:

Đăng nhận xét