Hướng dẫn dùng màn hình LCD 2004 I2C với ESP32

Hướng dẫn nối màn hình LCD 2004 I2C (mạch PCF8574) với ESP32 DevKit V1, quét địa chỉ I2C, hiển thị 4 dòng chữ, tạo ký tự riêng, làm bộ đếm thời gian và đổi sang LCD 1602.

LCD 2004 là màn hình ký tự hiển thị được 4 hàng, mỗi hàng 20 ký tự. Bản PYWORLD bán đã hàn sẵn mạch I2C dùng chip PCF8574, nên chỉ cần 4 dây: hai dây nguồn và hai dây tín hiệu SDA, SCL. Bài viết hướng dẫn nối LCD 2004 I2C với ESP32 DevKit V1, tìm địa chỉ I2C, cài thư viện trong Arduino IDE, hiển thị 4 dòng chữ, tạo ký tự riêng và làm bộ đếm thời gian. Cuối bài có phần đổi sang LCD 1602 I2C.

1. Tìm hiểu LCD 2004 I2C

Thông số cơ bản của màn hình LCD I2C theo mô tả của PYWORLD
Thông sốGiá trị
Số ký tựLCD 2004: 4 hàng, mỗi hàng 20 ký tự. LCD 1602: 2 hàng, mỗi hàng 16 ký tự
Mỗi ký tựMột ô 5 x 8 điểm
Giao tiếpI2C, mạch PCF8574 đã hàn sẵn ở mặt sau
Chân nối dây4 chân: GND, VCC, SDA, SCL
Điện áp hoạt động5 V
Địa chỉ I2C mặc định0x27, có thể khác tùy phiên bản
Màu nềnXanh lá hoặc xanh dương
Ảnh thực tế màn hình LCD 2004 và LCD 1602 I2C nền xanh dương và xanh lá của PYWORLD
Ảnh thực tế: LCD 2004 (hai màn hình lớn) và LCD 1602 (hai màn hình nhỏ), nền xanh dương và nền xanh lá.

Mặt sau của màn hình có một mạch nhỏ màu đen: đó là mạch chuyển I2C. Chip PCF8574 trên mạch nhận dữ liệu qua hai dây SDA, SCL rồi điều khiển các chân của LCD, nhờ vậy ESP32 không phải nối trực tiếp 16 chân của màn hình.

Ảnh thực tế mạch I2C PCF8574 hàn sẵn ở mặt sau LCD 2004, đánh số jumper LED, biến trở, pad địa chỉ và 4 chân nối dây
Ảnh thực tế mạch I2C ở mặt sau LCD 2004, đã đánh số từng phần.
  • Bốn chân nối dây in chữ GND, VCC, SDA, SCL.
  • Biến trở xanh chỉnh độ tương phản của chữ. Đây là chỗ cần chỉnh đầu tiên khi đèn nền sáng mà không thấy chữ.
  • Jumper LED cấp nguồn cho đèn nền. Tháo jumper thì đèn nền tắt hẳn.
  • Ba cặp pad A0, A1, A2 dùng để đổi địa chỉ I2C. Để hở cả ba cặp thì chip PCF8574T có địa chỉ 0x27; hàn nối cặp nào thì bit địa chỉ tương ứng về 0, nên địa chỉ nằm trong khoảng 0x20–0x27. Mạch dùng chip PCF8574AT có dải địa chỉ 0x38–0x3F, mặc định là 0x3F.
  • Đèn LED POWER sáng khi mạch có nguồn.

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

  • ESP32 DevKit V1 30 chân (bản dùng chip CH340 làm tương tự) và cáp USB có truyền dữ liệu.
  • Màn hình LCD 2004 đã hàn sẵn mạch I2C.
  • 4 dây jumper cái – cái.
  • Máy tính đã cài Arduino IDE 2.x.
  • Nên có: mạch chuyển mức logic hai chiều 3,3 V – 5 V (loại 4 kênh có các chân LV, HV, LV1–LV4, HV1–HV4) và breadboard MB-102 để cắm mạch.
  • Tùy chọn: đế ra chân ESP32 loại 30 chân để bắt dây chắc chắn.

3. Sơ đồ nối dây

LCD cần nguồn 5 V thì chữ mới đủ đậm và đèn nền mới đủ sáng. Trên mạch I2C có sẵn điện trở kéo SDA, SCL lên chân VCC, nên khi cấp 5 V hai đường tín hiệu này cũng ở mức 5 V lúc nghỉ. Chân GPIO của ESP32 lại chỉ làm việc ở mức 3,3 V. Vì vậy có hai cách nối.

Cách 1: nối trực tiếp, dùng để thử nhanh

Nối trực tiếp LCD 2004 I2C với ESP32 DevKit V1
LCD I2CESP32 DevKit V1Ghi chú
GNDGNDMass chung.
VCCVIN5 V từ cổng USB.
SDAD21 / GPIO21Chân SDA mặc định của ESP32.
SCLD22 / GPIO22Chân SCL mặc định của ESP32.
Sơ đồ nối trực tiếp ESP32 DevKit V1 với LCD 2004 I2C: VCC nối VIN, GND nối GND, SDA nối D21, SCL nối D22
Cách 1 (hình vẽ, LCD nhìn từ mặt sau): VCC – VIN, GND – GND, SDA – D21, SCL – D22.

Cách này ít dây và thường chạy được, vì điện trở kéo trên mạch I2C giới hạn dòng vào chân ESP32 ở mức rất nhỏ. Tuy nhiên hai chân D21, D22 đang chịu điện áp cao hơn mức 3,3 V mà ESP32 được thiết kế. Chỉ nên dùng cách 1 để thử màn hình; mạch chạy lâu dài nên nối theo cách 2.

Cách 2: nối qua mạch chuyển mức logic

Nối LCD 2004 I2C với ESP32 DevKit V1 qua mạch chuyển mức logic
ESP32 DevKit V1Mạch chuyển mứcLCD I2C
D22 / GPIO22LV1 – HV1SCL
D21 / GPIO21LV2 – HV2SDA
3V3LVKhông nối
VIN (5 V)HVVCC
GNDGNDGND
Sơ đồ nối ESP32 DevKit V1 với LCD 2004 I2C qua mạch chuyển mức logic 3,3 V – 5 V
Cách 2 (hình vẽ): SDA, SCL đi qua mạch chuyển mức; phía LV dùng 3,3 V của ESP32, phía HV dùng 5 V của LCD.

Mạch chuyển mức có hai phía: phía LV nối với ESP32 và nguồn 3V3, phía HV nối với LCD và nguồn 5 V. Mỗi kênh LV1 – HV1, LV2 – HV2 truyền tín hiệu theo cả hai chiều nên dùng được cho I2C. Chương trình ở hai cách nối giống hệt nhau.

Không cấp nguồn cho LCD từ chân 3V3: màn hình vẫn có thể trả lời trên I2C nhưng chữ rất mờ hoặc không hiện.

4. Cài đặt Arduino IDE và thư viện

  1. Mở Tools > Board > Boards Manager, tìm esp32 và cài gói esp32 by Espressif Systems.
  2. Chọn Tools > Board > esp32 > DOIT ESP32 DEVKIT V1 (hoặc ESP32 Dev Module), sau đó chọn đúng cổng COM trong Tools > Port.
  3. Mở Tools > Manage Libraries..., tìm LiquidCrystal I2C và cài thư viện LiquidCrystal I2C của tác giả Frank de Brabander.

Bài dùng gói esp32 phiên bản 3.3.10 và thư viện LiquidCrystal I2C phiên bản 1.1.2. Khi biên dịch, Arduino IDE hiện dòng cảnh báo thư viện này khai báo cho kiến trúc avr và có thể không tương thích với esp32. Đây chỉ là cảnh báo; thư viện giao tiếp qua Wire nên dùng được với ESP32.

5. Quét địa chỉ I2C

Trước khi hiển thị, nên kiểm tra ESP32 đã thấy màn hình chưa và màn hình đang ở địa chỉ nào. Nạp chương trình sau rồi mở Serial Monitor ở tốc độ 115200 baud:

/*
  PYWORLD.VN - Quét địa chỉ I2C trên ESP32 DevKit V1
  SDA = GPIO21, SCL = GPIO22
  Mở Serial Monitor ở 115200 baud để xem kết quả.
*/

#include <Wire.h>

const int SDA_PIN = 21;
const int SCL_PIN = 22;

void setup() {
  Serial.begin(115200);
  delay(500);
  Wire.begin(SDA_PIN, SCL_PIN);
  Wire.setClock(100000);            // PCF8574 làm việc ở tối đa 100 kHz
}

void loop() {
  int found = 0;
  Serial.println("Dang quet I2C...");

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

  if (found == 0) {
    Serial.println("Khong tim thay thiet bi I2C nao.");
  }
  Serial.println();
  delay(2000);                      // Quét lại sau 2 giây
}

Nếu nối dây đúng, Serial Monitor lặp lại kết quả tương tự:

Dang quet I2C...
Tim thay thiet bi: 0x27

Ghi lại địa chỉ tìm được. Nếu khác 0x27 (ví dụ 0x3F), sửa dòng #define LCD_ADDR trong các chương trình bên dưới.

6. Chương trình hiển thị 4 dòng chữ

/*
  PYWORLD.VN - ESP32 DevKit V1 + LCD 2004 I2C (mạch PCF8574)
  SDA = GPIO21, SCL = GPIO22, VCC của LCD = 5 V
  Thư viện: LiquidCrystal I2C (Frank de Brabander) 1.1.2
*/

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

// ====== Cấu hình LCD ======
#define LCD_ADDR  0x27    // Địa chỉ I2C; đổi theo kết quả quét (ví dụ 0x3F)
#define LCD_COLS  20      // Số cột
#define LCD_ROWS  4       // Số hàng
#define SDA_PIN   21
#define SCL_PIN   22

LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLS, LCD_ROWS);

void setup() {
  Serial.begin(115200);
  delay(100);

  // Khởi tạo I2C trên GPIO21 (SDA) và GPIO22 (SCL), tốc độ 100 kHz
  Wire.begin(SDA_PIN, SCL_PIN);
  Wire.setClock(100000);

  // Kiểm tra LCD có trả lời ở địa chỉ đã khai báo không
  Wire.beginTransmission(LCD_ADDR);
  if (Wire.endTransmission() != 0) {
    Serial.println("Khong thay LCD! Kiem tra day noi va dia chi I2C.");
    while (true) delay(1000);
  }

  lcd.init();                          // Khởi tạo LCD, mất khoảng 1 giây
  lcd.backlight();                     // Bật đèn nền

  lcd.setCursor(5, 0);                 // Cột 5, hàng 0
  lcd.print("PYWORLD.VN");
  lcd.setCursor(0, 1);                 // Cột 0, hàng 1
  lcd.print("ESP32 + LCD 2004 I2C");   // Vừa đủ 20 ký tự
  lcd.setCursor(0, 2);
  lcd.print("Dia chi I2C: 0x");
  lcd.print(LCD_ADDR, HEX);
  lcd.setCursor(0, 3);
  lcd.print("Hang 3 (dong thu 4)");

  Serial.println("Da hien thi 4 dong len LCD 2004.");
}

void loop() {
}

Sau khi nạp, đèn nền bật và màn hình hiện bốn dòng như hình dưới. Serial Monitor in dòng Da hien thi 4 dong len LCD 2004. Nếu Serial Monitor in Khong thay LCD! Kiem tra day noi va dia chi I2C. thì xem mục 10.

Hình minh họa LCD 2004 I2C hiển thị 4 dòng chữ PYWORLD.VN, ESP32 + LCD 2004 I2C, địa chỉ I2C 0x27 và hàng 3
Kết quả mong đợi trên LCD 2004 (hình minh họa, nền xanh dương).

Nếu đèn nền sáng mà không thấy chữ, hoặc chỉ thấy các ô vuông, dùng tua vít nhỏ vặn từ từ biến trở xanh ở mặt sau cho tới khi chữ hiện rõ.

7. Giải thích các lệnh chính

  • LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLS, LCD_ROWS): khai báo màn hình với địa chỉ I2C, số cột và số hàng.
  • Wire.begin(SDA_PIN, SCL_PIN): bật I2C trên GPIO21 và GPIO22. Wire.setClock(100000) đặt tốc độ 100 kHz, là tốc độ tối đa của chip PCF8574.
  • Wire.beginTransmission() và Wire.endTransmission(): gửi thử tới địa chỉ của LCD. Kết quả khác 0 nghĩa là không có thiết bị trả lời; chương trình báo lỗi rồi dừng thay vì chạy tiếp với màn hình trống.
  • lcd.init(): khởi tạo LCD ở chế độ 4 bit, xóa màn hình. Lệnh này mất khoảng 1 giây.
  • lcd.backlight() bật đèn nền, lcd.noBacklight() tắt đèn nền.
  • lcd.setCursor(cột, hàng): đặt vị trí ghi. Cột và hàng đều đếm từ 0, nên LCD 2004 có cột 0–19 và hàng 0–3. Dòng PYWORLD.VN dài 10 ký tự, đặt ở cột (20 − 10) / 2 = 5 để nằm giữa hàng.
  • lcd.print(): ghi chữ hoặc số từ vị trí hiện tại. lcd.print(LCD_ADDR, HEX) in số ở dạng thập lục phân.
  • lcd.clear(): xóa toàn bộ màn hình và đưa vị trí ghi về cột 0, hàng 0.

LCD không tự xuống dòng. Trên LCD 2004, chữ dài quá 20 ký tự ở hàng 0 sẽ hiện tiếp ở hàng 2, còn chữ dài quá ở hàng 1 sẽ hiện tiếp ở hàng 3. Vì vậy hãy tự cắt chuỗi và gọi setCursor() cho từng hàng. Màn hình chỉ có sẵn bảng chữ không dấu, nên chuỗi hiển thị viết không dấu.

8. Dùng với LCD 1602 I2C

LCD 1602 I2C dùng cùng mạch PCF8574, cùng cách nối dây và cùng thư viện. Chỉ cần đổi số cột, số hàng khi khai báo và sắp lại nội dung cho vừa 2 hàng, mỗi hàng 16 ký tự:

/*
  PYWORLD.VN - ESP32 DevKit V1 + LCD 1602 I2C (mạch PCF8574)
  Khác bản LCD 2004 ở số cột, số hàng và nội dung hiển thị.
*/

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

#define LCD_ADDR  0x27
#define LCD_COLS  16      // LCD 1602: 16 cột
#define LCD_ROWS  2       // LCD 1602: 2 hàng
#define SDA_PIN   21
#define SCL_PIN   22

LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLS, LCD_ROWS);

void setup() {
  Wire.begin(SDA_PIN, SCL_PIN);
  Wire.setClock(100000);

  lcd.init();
  lcd.backlight();

  lcd.setCursor(3, 0);                 // (16 - 10) / 2 = 3: canh giữa
  lcd.print("PYWORLD.VN");
  lcd.setCursor(0, 1);
  lcd.print("ESP32 + LCD 1602");       // Vừa đủ 16 ký tự
}

void loop() {
}
Hình minh họa LCD 1602 I2C hiển thị 2 dòng chữ PYWORLD.VN và ESP32 + LCD 1602
Kết quả mong đợi trên LCD 1602 (hình minh họa, nền xanh lá).

9. Ký tự tự tạo và bộ đếm thời gian

LCD cho phép nạp tối đa 8 ký tự tự vẽ, mang mã 0 đến 7. Mỗi ký tự là một mảng 8 số, mỗi số ứng với một hàng 5 điểm: bit 1 là điểm hiện, bit 0 là điểm tắt. Chương trình dưới đây tạo hình trái tim và đồng hồ, rồi hiển thị thời gian đã chạy kể từ lúc cấp nguồn, cập nhật mỗi giây.

/*
  PYWORLD.VN - ESP32 DevKit V1 + LCD 2004 I2C
  Ký tự tự tạo (createChar) và bộ đếm thời gian chạy, cập nhật mỗi giây.
  LED trên GPIO2 nháy theo nhịp đếm.
*/

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

#define LCD_ADDR  0x27
#define SDA_PIN   21
#define SCL_PIN   22
#define LED_PIN   2

LiquidCrystal_I2C lcd(LCD_ADDR, 20, 4);

// Mỗi ký tự tự tạo gồm 8 hàng, mỗi hàng 5 điểm (bit 1 = điểm hiện)
uint8_t HEART[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000
};

uint8_t CLOCK[8] = {
  0b00000,
  0b01110,
  0b10101,
  0b10111,
  0b10001,
  0b01110,
  0b00000,
  0b00000
};

const uint8_t CHAR_HEART = 0;          // Mã ký tự tự tạo: 0 đến 7
const uint8_t CHAR_CLOCK = 1;

void setup() {
  pinMode(LED_PIN, OUTPUT);

  Wire.begin(SDA_PIN, SCL_PIN);
  Wire.setClock(100000);

  lcd.init();
  lcd.backlight();

  // Nạp 2 ký tự tự tạo vào bộ nhớ của LCD
  lcd.createChar(CHAR_HEART, HEART);
  lcd.createChar(CHAR_CLOCK, CLOCK);

  // Sau createChar() phải gọi setCursor() rồi mới in
  lcd.setCursor(5, 0);
  lcd.print("PYWORLD.VN");
  lcd.setCursor(0, 2);
  lcd.write(CHAR_CLOCK);
  lcd.print(" Da chay:");
  lcd.setCursor(0, 3);
  lcd.print("LED GPIO2:");
}

void loop() {
  static uint32_t lastSeconds = 0;
  uint32_t seconds = millis() / 1000;
  if (seconds == lastSeconds) return;  // Chưa sang giây mới thì chưa cập nhật
  lastSeconds = seconds;

  bool ledOn = (seconds % 2 == 1);
  digitalWrite(LED_PIN, ledOn ? HIGH : LOW);

  // Trái tim nháy ở hai bên dòng chữ
  lcd.setCursor(3, 0);
  lcd.write(ledOn ? CHAR_HEART : ' ');
  lcd.setCursor(16, 0);
  lcd.write(ledOn ? CHAR_HEART : ' ');

  // Giờ:phút:giây luôn dài 8 ký tự nên ghi đè lên số cũ, không cần clear()
  char text[9];
  snprintf(text, sizeof(text), "%02u:%02u:%02u",
           (unsigned)(seconds / 3600 % 100),
           (unsigned)(seconds / 60 % 60),
           (unsigned)(seconds % 60));
  lcd.setCursor(11, 2);
  lcd.print(text);

  lcd.setCursor(11, 3);
  lcd.print(ledOn ? "BAT" : "TAT");
}
Hình minh họa hai ký tự tự tạo trái tim và đồng hồ cùng bộ đếm thời gian trên LCD 2004 I2C
Hai ký tự tự tạo và màn hình bộ đếm ở giây thứ 85 (hình minh họa, nền xanh lá).
  • lcd.createChar(mã, mảng): nạp ký tự vào bộ nhớ của LCD. Sau lệnh này phải gọi lcd.setCursor() rồi mới ghi tiếp, nếu không chữ sẽ không hiện đúng chỗ.
  • lcd.write(mã): hiển thị ký tự tự tạo có mã tương ứng.
  • Không dùng delay(): loop() so số giây lấy từ millis() với lần cập nhật trước, sang giây mới thì mới ghi lại màn hình.
  • Không dùng lcd.clear() trong vòng lặp: chuỗi giờ:phút:giây luôn dài 8 ký tự, BAT và TAT cùng dài 3 ký tự, nên ghi đè lên chữ cũ là đủ. Xóa cả màn hình mỗi giây sẽ làm chữ nháy.
  • LED trên bo ESP32 DevKit V1 nối với GPIO2, nháy theo nhịp đếm để dễ đối chiếu với màn hình.

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

  • Đèn nền sáng nhưng không thấy chữ, hoặc thấy hàng ô vuông: vặn biến trở xanh để chỉnh độ tương phản. Nếu vẫn chỉ có ô vuông ở hàng 0 và hàng 2, LCD chưa được khởi tạo: kiểm tra địa chỉ I2C trong chương trình.
  • Serial Monitor báo Khong thay LCD! hoặc chương trình quét không tìm thấy thiết bị: kiểm tra bốn dây, nhất là SDA, SCL có bị đổi chỗ cho nhau không; VCC phải nối VIN; ESP32 và LCD phải chung GND. Với cách 2, kiểm tra thêm chân LV đã nối 3V3 và chân HV đã nối 5 V.
  • Quét ra địa chỉ khác 0x27: sửa LCD_ADDR theo địa chỉ quét được.
  • Đèn nền không sáng: kiểm tra jumper LED ở mặt sau còn cắm không và chương trình đã gọi lcd.backlight() chưa.
  • Chữ rất mờ dù đã chỉnh biến trở: LCD đang được cấp 3,3 V. Chuyển VCC sang chân VIN (5 V).
  • Chữ hiện sai hàng hoặc tràn sang hàng khác: chuỗi dài hơn số cột, hoặc khai báo sai loại màn hình (20 x 4 hay 16 x 2).
  • Thỉnh thoảng hiện ký tự lạ: dây quá dài hoặc tiếp xúc kém. Dùng dây ngắn dưới 30 cm, cắm chắc, và giữ tốc độ I2C 100 kHz.
  • Lỗi biên dịch LiquidCrystal_I2C.h: No such file or directory: chưa cài thư viện ở mục 4.
  • Không nạp được chương trình: dùng cáp USB có truyền dữ liệu, chọn đúng cổng COM, cài driver USB-UART nếu máy không nhận cổng. Nếu IDE dừng ở dòng Connecting..., giữ nút BOOT trên ESP32 cho đến khi bắt đầu nạp.

Xem thêm: dùng màn hình LCD 1602 I2C với Arduino Uno và HX711 với load cell và LCD 1602 bằng MicroPython. Các mạch ESP32 dùng trong bài có tại danh mục ESP32 của PYWORLD.


Tin tức liên quan

Hướng dẫn bắt đầu với Wemos D1 R2 (ESP8266) trên Arduino IDE
Hướng dẫn bắt đầu với Wemos D1 R2 (ESP8266) trên Arduino IDE

4 Lượt xem

Hướng dẫn dùng Wemos D1 R2 (ESP8266 khung Arduino UNO) với Arduino IDE 2.x: sơ đồ chân, cài driver CH340 và gói board ESP8266, nạp code nháy LED, kết nối WiFi và xử lý lỗi thường gặp.

Hướng dẫn dùng mạch tạo trễ NE555 có relay: đấu dây và chỉnh thời gian trễ
Hướng dẫn dùng mạch tạo trễ NE555 có relay: đấu dây và chỉnh thời gian trễ

3 Lượt xem

Hướng dẫn dùng mạch tạo trễ NE555 có relay bản 5 V và 12 V: nguyên lý tạo trễ, ý nghĩa các cọc VCC, GND, COM, CK, CB, cách chỉnh thời gian trễ, sơ đồ đấu dây và xử lý lỗi thường gặp.

Mạch hạ áp LM2596 và MP1584: cách chọn, chỉnh điện áp và cấp nguồn ESP32
Mạch hạ áp LM2596 và MP1584: cách chọn, chỉnh điện áp và cấp nguồn ESP32

5 Lượt xem

So sánh mạch hạ áp LM2596 và MP1584, cách chỉnh điện áp ra bằng đồng hồ vạn năng trước khi nối tải, cấp nguồn 5 V cho ESP32 DevKit V1 từ nguồn 12 V và xử lý lỗi thường gặp.

Hướng dẫn ESP32 làm web server điều khiển relay 4 kênh qua WiFi
Hướng dẫn ESP32 làm web server điều khiển relay 4 kênh qua WiFi

6 Lượt xem

Hướng dẫn dùng ESP32 DevKit V1 làm web server trong mạng WiFi nội bộ, mở trang trên điện thoại để bật, tắt module relay 4 kênh; có sơ đồ nối dây, code Arduino IDE và lưu ý an toàn.

Hướng dẫn dùng module thẻ nhớ Micro SD với ESP32
Hướng dẫn dùng module thẻ nhớ Micro SD với ESP32

6 Lượt xem

Hướng dẫn nối module thẻ nhớ Micro SD với ESP32 DevKit V1 qua SPI, định dạng thẻ FAT32, chạy code Arduino đọc ghi file, ghi dữ liệu định kỳ ra CSV và xử lý lỗi Card Mount Failed.

Hướng dẫn dùng màn hình OLED 1.3 inch SH1106 với ESP32
Hướng dẫn dùng màn hình OLED 1.3 inch SH1106 với ESP32

6 Lượt xem

Hướng dẫn nối màn hình OLED 1.3 inch SH1106 với ESP32 DevKit V1 qua I2C, cài thư viện Adafruit SH110X, chạy code hiển thị chữ và xử lý lỗi thường gặp.

Hướng dẫn bắt đầu MicroPython trên ESP32 Lite với Thonny
Hướng dẫn bắt đầu MicroPython trên ESP32 Lite với Thonny

5 Lượt xem

Hướng dẫn cài driver, cài Thonny và nạp firmware MicroPython cho mạch ESP32 Lite, dùng REPL, nháy LED, lưu main.py, đọc nút nhấn, quét I2C và xử lý lỗi thường gặp.

Hướng dẫn dùng thanh cảm biến dò line 5 kênh TCRT5000 với ESP32
Hướng dẫn dùng thanh cảm biến dò line 5 kênh TCRT5000 với ESP32

4 Lượt xem

Hướng dẫn nối thanh dò line 5 kênh TCRT5000 (BFD-1000) với ESP32 DevKit V1, đọc trạng thái 5 kênh trên Serial Monitor, tính vị trí vạch và gợi ý hướng lái cho xe dò line.


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