Arduino Màn hình LCD I2C

Trong bài hướng dẫn Arduino LCD I2C này, chúng ta sẽ học cách kết nối một LCD I2C (màn hình hiển thị tinh thể lỏng) với bo mạch Arduino. Màn hình LCD rất phổ biến và được sử dụng rộng rãi trong các dự án điện tử để hiển thị thông tin. Có nhiều loại LCD. Hướng dẫn này lấy LCD 16x2 (16 cột và 2 hàng) làm ví dụ. Các LCD khác cũng tương tự.

Phần cứng cần chuẩn bị

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×LCD I2C
1×dây jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về LCD I2C 16x2

Trong Arduino - Màn hình LCD, chúng ta đã học cách sử dụng màn hình LCD thông thường. Tuy nhiên, việc nối dây giữa Arduino và màn hình LCD thông thường rất phức tạp. Vì vậy, LCD I2C đã được tạo ra để đơn giản hóa việc nối dây. Thực ra, LCD I2C được cấu thành từ một LCD thông thường, một module I2C và một biến trở.

Bố trí các chân

LCD I2C sử dụng giao diện I2C, nên nó có 4 chân:

  • GND pin: cần được kết nối với GND (0V).
  • VCC pin: nguồn cấp cho LCD, cần được kết nối với VCC (5V).
  • SDA pin: tín hiệu dữ liệu I2C
  • SCL pin: tín hiệu đồng hồ I2C
bố trí chân lcd i2c

Tọa độ LCD

LCD I2C 16x2 có 16 cột và 2 hàng. Các cột và hàng được đánh số từ 0.

tọa độ lcd i2c cho Arduino

Sơ đồ đấu dây

sơ đồ nối dây lcd i2c cho Arduino

This image is created using Fritzing. Click to enlarge image

LCD I2C Arduino Uno, Nano Arduino Mega
Vin 5V 5V
GND GND GND
SDA A4 20
SCL A5 21

Cách Lập Trình Cho LCD I2C

Nhờ thư viện LiquidCrystal_I2C, việc sử dụng LCD dễ như ăn bánh.

  • Bao gồm thư viện:
#include <LiquidCrystal_I2C.h> // Library for LCD
  • Khai báo một đối tượng LiquidCrystal_I2C với địa chỉ I2C, số cột và số hàng:
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
  • Khởi tạo màn hình LCD.
lcd.init(); //initialize the lcd lcd.backlight(); //open the backlight
  • Di chuyển con trỏ đến vị trí mong muốn (cột_index, hàng_index)
lcd.setCursor(column_index, row_index);
  • Hiển thị một thông điệp lên LCD.
lcd.print("Hello World!");

Còn rất nhiều điều nữa chúng ta có thể làm với LCD (xem phần Làm nhiều hơn với LCD).

※ Lưu ý:

Địa chỉ I2C của LCD có thể khác nhau tùy theo nhà sản xuất. Trong mã nguồn, chúng tôi đã sử dụng 0x27, được nhà sản xuất DIYables chỉ định.

Mã Arduino

#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows void setup() { lcd.init(); // initialize the lcd lcd.backlight(); } void loop() { lcd.clear(); // clear display lcd.setCursor(0, 0); // move cursor to (0, 0) lcd.print("Arduino"); // print message at (0, 0) lcd.setCursor(2, 1); // move cursor to (2, 1) lcd.print("GetStarted.com"); // print message at (2, 1) delay(2000); // display the above for two seconds lcd.clear(); // clear display lcd.setCursor(3, 0); // move cursor to (3, 0) lcd.print("DIYables"); // print message at (3, 0) lcd.setCursor(0, 1); // move cursor to (0, 1) lcd.print("www.diyables.io"); // print message at (0, 1) delay(2000); // display the above for two seconds }

Hướng dẫn từng bước

  • Đi tới biểu tượng Thư viện ở thanh bên trái của Arduino IDE.
  • Tìm kiếm "LiquidCrystal I2C", sau đó tìm thư viện LiquidCrystal_I2C của Frank de Brabander
  • Nhấn nút Cài đặt để cài đặt thư viện LiquidCrystal_I2C.
thư viện liquidcrystal i2c cho Arduino
  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Nhấp chuột vào nút Tải lên trên Arduino IDE để tải mã lên Arduino
  • Xem kết quả trên LCD
hiển thị văn bản trên lcd bằng Arduino
image source: diyables.io
  • Thử chỉnh sửa văn bản và vị trí

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

Làm được nhiều hơn với màn hình LCD

Ký tự tùy chỉnh

Hàm lcd.print() chỉ hỗ trợ ký tự ASCII. Nếu bạn muốn hiển thị một ký tự đặc biệt hoặc ký hiệu (ví dụ: trái tim, chim giận dữ), bạn cần sử dụng trình tạo ký tự dưới đây.

LCD 16x2 có thể hiển thị 32 ký tự (2 hàng và 16 cột). Mỗi ký tự được tạo thành từ 40 điểm ảnh (8 hàng và 5 cột).

màn hình lcd 16x2 cho Arduino

Bộ tạo ký tự đại diện cho một ký tự (40 pixel). Bạn chỉ cần thực hiện các bước sau:

Click on each pixel to select/deselect


Copy below custom character code
Replace the customChar[8] in the below code
#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows byte customChar[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 }; void setup() { lcd.init(); // initialize the lcd lcd.backlight(); lcd.createChar(0, customChar); // create a new custom character lcd.setCursor(2, 0); // move cursor to (2, 0) lcd.write((byte)0); // print the custom char at (2, 0) } void loop() { }

Kết quả trên màn hình LCD:

ký tự tùy chỉnh lcd

Nhiều ký tự tùy chỉnh

Chúng ta có thể tạo tối đa 8 ký tự tùy chỉnh (được đánh chỉ mục từ 0 đến 7). Ví dụ dưới đây tạo và hiển thị ba ký tự.

#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows byte customChar0[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 }; byte customChar1[8] = { 0b00100, 0b01110, 0b11111, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100 }; byte customChar2[8] = { 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b11111, 0b01110, 0b00100 }; void setup() { lcd.init(); // initialize the lcd lcd.backlight(); lcd.createChar(0, customChar0); // create a new custom character (index 0) lcd.createChar(1, customChar1); // create a new custom character (index 1) lcd.createChar(2, customChar2); // create a new custom character (index 2) lcd.setCursor(2, 0); // move cursor to (2, 0) lcd.write((byte)0); // print the custom char 0 at (2, 0) lcd.setCursor(4, 0); // move cursor to (4, 0) lcd.write((byte)1); // print the custom char 1 at (4, 0) lcd.setCursor(6, 0); // move cursor to (6, 0) lcd.write((byte)2); // print the custom char 2 at (6, 0) } void loop() { }

Kết quả trên màn hình LCD:

nhiều ký tự tùy chỉnh cho lcd

Tóm tắt: cách sử dụng ký tự tùy chỉnh trên màn hình LCD

  • Sử dụng trình tạo ký tự ở trên để tạo mã nhị phân cho ký tự tùy chỉnh.
  • Khai báo mã nhị phân cho ký tự tùy chỉnh (sao chép từ bước ở trên)
byte customChar[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 };
  • Tạo ký tự tùy chỉnh và gán cho một giá trị chỉ mục (từ 0 đến 7) trong hàm setup()
lcd.createChar(index, customChar);
  • Hiển thị ký tự tùy chỉnh trên LCD bất cứ lúc nào, bất cứ nơi đâu (trong hàm setup() hoặc loop())
lcd.setCursor(column, row); // move cursor to a desired position lcd.write((byte)index); // print the custom char at the desired position

Các chức năng khác

Thêm các hàm dưới đây vào hàm loop() lần lượt. Và thêm delay(5000) sau mỗi hàm.

  • Xóa màn hình LCD
lcd.clear();
  • Di chuyển con trỏ đến góc trên bên trái của màn hình LCD
lcd.home();
  • Di chuyển con trỏ chuột tới một vị trí (cột, hàng)
lcd.setCursor(column, row);
  • Hiển thị con trỏ LCD
lcd.cursor();
  • Ẩn con trỏ LCD.
lcd.noCursor();
  • Hiển thị con trỏ LCD đang nhấp nháy
lcd.blink()
  • Tắt con trỏ LCD nhấp nháy.
lcd.noBlink()

Thách thức bản thân

Sử dụng LCD để thực hiện một trong các dự án sau:

Khắc phục sự cố trên LCD I2C

Nếu văn bản không hiển thị trên LCD I2C, hãy kiểm tra các vấn đề sau:

  1. Điều chỉnh độ sáng của LCD bằng cách xoay biến trở ở mặt sau của LCD
  2. Tùy thuộc vào nhà sản xuất, địa chỉ I2C của LCD có thể khác nhau. Thông thường, địa chỉ I2C mặc định của LCD là 0x27 hoặc 0x3F. Hãy thử các giá trị này lần lượt. Nếu bạn vẫn thất bại, hãy chạy đoạn mã dưới đây để tìm địa chỉ I2C.
// I2C address scanner program #include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println("I2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found"); else Serial.println("done"); delay(5000); // wait 5 seconds for next scan }

Kết quả trên Serial Monitor:

COM6
Send
Scanning... I2C device found at address 0x3F ! done Scanning... I2C device found at address 0x3F ! done
Autoscroll Show timestamp
Clear output
9600 baud  
Newline