Skip to main content

Phần 4: Thẻ nhớ

Ok tiếp theo là lắp đặt thẻ nhớ.

Trong dự án này thẻ nhớ sẽ là nơi lưu trữ dữ liệu chính như hình gif, audio...

Trước khi bắt đầu thì có một điều cần chú ý

Xử lý conflict phần cứng

Thẻ nhớ sử dụng giao tiếp SPI. Với ESP32 khi sử dụng nhiều thiết bị giao tiếp chung SPI thì cần có chân CS để điều khiển.

Trong trường hợp hiện tại chúng ta có 2 thiết bị giao tiếp SPI là thẻ nhớ và màn hình. Khi cần giao tiếp với thẻ nhớ thì tín hiệu CS trên thẻ nhớ được bật và tắt đối với màn hình.

Thế nhưng trong phần trước. Màn hình chúng ta sử dụng có 7 pin và không có chân CS. Điều này là do chân CS được nhà sản xuất nối trực tiếp với GND. Tín hiệu CS trên màn hình sẽ luôn ở trạng thái bật. Vì vậy chúng ta có 2 hướng giải quyết:

  • Kiểu người có tiền: Thay màn mới cho đẹp
  • Kiểu người hết tiền chúng ta có những bước sau:
    • Xác định chân CS đã bị hàn với GND trên màn hình. Là chân thứ 8 trên dây nối màn hình với PCB
    • Rã hàn để thấy được phần kết nối CS với GND
    • Ngắt kết nối của chân CS với GND bằng cách cắt qua lớp đồng trên PCB
    • Hàn lại dây nối màn hình với PCB
    • Hàn chân CS ra một chân mới và kết nối với ESP32.
    • Trong phần khai báo thư viện TFT_eSPI phần #define TFT_CS -1 sửa thành #define TFT_CS <pin đã kết nối trên ESP32>

ESP32_TheCube_Phan4_1.pngESP32_TheCube_Phan4_2.pngESP32_TheCube_Phan4_3.png

Ok vậy là xong. Đừng làm chết màn hình là được :)))

Lắp đặt

Màn hình

ESP32-C3

Chắc năng

Ghi chú

VCC (3.3)

3.3V hoặc 5V

Cấp nguồn cho màn hình.

Nguồn vào từ USB qua ESP32 có thể đẩy ra thành 2 nguồn 3.3V hoặc 5V.

GND

GND

Nối đất

Tạo một điểm tham chiếu chung cho toàn bộ thiết bị trên hệ thống

SCK

GPIO4

Clock (SPI)

Dùng chung với Màn hình

MOSI

GPIO6

Data out

Dùng chung với Màn hình

MISO

GPIO5

Data in

Dùng chân chuyên dụng của ESP32

CS

GPIO7

Điều khiển khi giao tiếp SPI

Chọn bất kỳ chân GPIO còn trống thuận tiện cho đi dây

Kiểm tra

platformio.ini

Trong phần thiết lập này chúng ta cần khai báo thêm thư viện SD trong lib_deps

[env:esp32-c3-devkitm-1]
platform = platformio/espressif32 @ 6.6.0
board = esp32-c3-devkitm-1
framework = arduino
platform_packages =
  framework-arduinoespressif32 @ ~3.20014.0
lib_deps = 
	SD // Khai báo thêm thư viện này
	SPI
	bodmer/TFT_eSPI@^2.5.43
monitor_speed = 115200
build_flags = 
	-D ARDUINO_USB_MODE=1
	-D ARDUINO_USB_CDC_ON_BOOT=1

Code and Test

#include <Arduino.h>
#include <TFT_eSPI.h>
#include <SD.h> // Thêm khai báo thư viện

// Tạo đối tượng tft từ thư viện // Để hiển thị kết quả test
TFT_eSPI tft = TFT_eSPI();

// Khai báo phần cứng cho SDCard
const int SDCARD_PIN_CS = 7;
const int SDCARD_PIN_SCK = 4;
const int SDCARD_PIN_MISO = 5;
const int SDCARD_PIN_MOSI = 6;

// Khai báo hàm
void initTFT(); // Khởi tạo màn hình
void initSD(); // Khởi tạo SDCard
void listDir(fs::FS &fs, const char * dirname, uint8_t levels); // Hàm hiển thị các tệp trong SD // Dùng để test chưa cần quan tâm nhiều

void setup() {
  initTFT();
  initSD();
}

int count = 0;
void loop() {}

void initTFT()
{
  tft.init(); 
  tft.setRotation(0);
  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_GREEN);
  tft.setTextSize(1);
  tft.setCursor(0, 0);
  tft.println("Init TFT success!!!");
}

void initSD()
{
  SPI.end();
  SPI.begin(SDCARD_PIN_SCK, SDCARD_PIN_MISO, SDCARD_PIN_MOSI, SDCARD_PIN_CS); // Khởi tạo giao tiếp SPI

  tft.print("Initializing SD card using CS pin: ");
  tft.println(SDCARD_PIN_CS);

  if (!SD.begin(SDCARD_PIN_CS, SPI)) {
    tft.setTextColor(TFT_RED);
    tft.println("SD mount failed (wiring/freq).");
    return;
  }

  tft.setTextColor(TFT_GREEN);
  tft.println("SD card initialized.");

  uint8_t type = SD.cardType();
  if (type == CARD_NONE) {
    tft.setTextColor(TFT_RED);
    tft.println("No SD card detected.");
    return;
  }
  tft.printf("Type: %s\n", type == CARD_MMC ? "MMC" :
                         type == CARD_SD  ? "SDSC" :
                         type == CARD_SDHC? "SDHC/SDXC" : "UNKNOWN");
  tft.printf("Size: %llu MB\n", SD.cardSize() / (1024ULL * 1024ULL));

  tft.println("Filesystem Content:");
  listDir(SD, "/", 0);
  tft.println("\n--- Test Complete ---");
}

// Hàm liệt kê nội dung thư mục (lấy từ ví dụ của thư viện SD)
void listDir(fs::FS &fs, const char * dirname, uint8_t levels) {
  tft.printf("Listing directory: %s\n", dirname);

  File root = fs.open(dirname);
  if (!root) {
    tft.println("Failed to open directory");
    return;
  }
  if (!root.isDirectory()) {
    tft.println("Not a directory");
    return;
  }

  File file = root.openNextFile();
  while (file) {
    if (file.isDirectory()) {
      tft.print("  DIR : ");
      tft.println(file.name());
      if (levels) {
        listDir(fs, file.path(), levels - 1);
      }
    } else {
      tft.print("  FILE: ");
      tft.print(file.name());
      tft.print("\tSIZE: ");
      tft.println(file.size());
    }
    file = root.openNextFile();
  }
}


Upload and Monitor

Kết quả hiển thị như hình dưới (hoặc tương tự toàn màu green) là OK

1000048897.jpg