ค้นหาโค้ด

บทเรียน ESP32 40/55 - การอ่านและเขียนลงการ์ด Micro SD | ชุดเรียนรู้ IoT ESP32 ของ SunFounder

บทเรียน ESP32 40/55 - การอ่านและเขียนลงการ์ด Micro SD | ชุดเรียนรู้ IoT ESP32 ของ SunFounder

ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีการอ่านและเขียนข้อมูลลงในการ์ด micro SD โดยใช้ ESP32 และบอร์ดขยาย ESP32 ของ SunFounder ซึ่งจะช่วยให้เราสามารถจัดเก็บข้อมูลและเรียกดูข้อมูลในภายหลังได้ ซึ่งเป็นสิ่งจำเป็นสำหรับแอปพลิเคชัน IoT หลายประเภท เมื่อจบบทช่วยสอนนี้ คุณจะมีการตั้งค่าที่ใช้งานได้ซึ่งสามารถสร้าง เขียน และอ่านไฟล์จากการ์ด micro SD ได้

ในการเริ่มต้น ตรวจสอบให้แน่ใจว่าการ์ด micro SD ของคุณถูกฟอร์แมตเป็น FAT32 อย่างถูกต้อง เนื่องจากเป็นระบบไฟล์ที่จำเป็นสำหรับ ESP32 ในการทำงานร่วมกับการ์ด เราจะใช้ไลบรารี SD_MMC ซึ่งช่วยให้การเข้าถึงไฟล์บนการ์ด micro SD ง่ายขึ้น สิ่งสำคัญที่ควรทราบคือ ความจุสูงสุดของการ์ด micro SD ไม่ควรเกิน 32 GB

อธิบายฮาร์ดแวร์

ส่วนประกอบหลักในโปรเจกต์นี้ประกอบด้วยไมโครคอนโทรลเลอร์ ESP32 และโมดูลการ์ด micro SD ESP32 เป็นไมโครคอนโทรลเลอร์ที่อเนกประสงค์ซึ่งมาพร้อมความสามารถ Wi-Fi และ Bluetooth ในตัว ทำให้เหมาะสำหรับแอปพลิเคชัน IoT โมดูลการ์ด micro SD ช่วยให้ ESP32 อ่านและเขียนข้อมูลลงในการ์ดได้ ทำให้สามารถจัดเก็บข้อมูลสำหรับแอปพลิเคชันต่างๆ ได้

การ์ด micro SD ทำงานโดยใช้ระบบไฟล์เพื่อจัดเก็บข้อมูลในรูปแบบที่มีโครงสร้าง การ์ดสื่อสารกับ ESP32 ผ่านอินเทอร์เฟซ SD_MMC ซึ่งช่วยให้การอ่านและเขียนไฟล์มีประสิทธิภาพ การตั้งค่านี้สามารถใช้สำหรับการบันทึกข้อมูล การบันทึกรูปภาพ หรือแอปพลิเคชันอื่นๆ ที่ต้องการการจัดเก็บข้อมูลถาวร

คำแนะนำการเดินสายไฟ

ESP32-40-micro-sd-card-1

ในการเดินสายไฟการ์ด micro SD เข้ากับ ESP32 ให้ทำตามขั้นตอนเหล่านี้:

ขั้นแรก เชื่อมต่อพินไฟและกราวด์ เชื่อมต่อพิน VCC ของโมดูลการ์ด micro SD เข้ากับพิน 3.3V บน ESP32 และเชื่อมต่อพิน GND เข้ากับพิน GND หนึ่งในพินบน ESP32 จากนั้น เชื่อมต่อพินข้อมูล: เชื่อมต่อพิน CS (Chip Select) ของโมดูลการ์ด micro SD เข้ากับพิน 5 บน ESP32 พิน MOSI (Master Out Slave In) เข้ากับพิน 23 พิน MISO (Master In Slave Out) เข้ากับพิน 19 และพิน SCK (Serial Clock) เข้ากับพิน 18 ตรวจสอบให้แน่ใจว่าการเชื่อมต่อเหล่านี้แน่นหนาเพื่อหลีกเลี่ยงปัญหาการสื่อสาร

หากคุณใช้บอร์ดขยายอื่น หมายเลขพินอาจแตกต่างกัน ดังนั้นโปรดอ้างอิงเอกสารเฉพาะของบอร์ดของคุณ การเดินสายไฟมีความสำคัญอย่างยิ่งต่อการทำงานที่ประสบความสำเร็จในการอ่านและเขียนไฟล์ลงในการ์ด micro SD

ตัวอย่างโค้ดและคำอธิบาย

ตอนนี้ เรามาดูส่วนหลักของโค้ดที่โต้ตอบกับการ์ด micro SD กัน การตั้งค่าเริ่มต้นด้วยการเริ่มต้นการสื่อสารแบบอนุกรมและตรวจสอบว่าการ์ด micro SD ถูกเมานต์สำเร็จหรือไม่

Serial.begin(115200); // เริ่มต้นการสื่อสารแบบอนุกรม
if (!SD_MMC.begin()) { // ตรวจสอบว่าการ์ด SD ถูกเมานต์สำเร็จหรือไม่
  Serial.println("Failed to mount SD card"); // พิมพ์ข้อความแสดงข้อผิดพลาดหากการ์ด SD เมานต์ไม่สำเร็จ
  return;
}

ในโค้ดส่วนนี้ การสื่อสารแบบอนุกรมถูกตั้งค่าที่อัตราบอด 115200 ซึ่งสำคัญสำหรับการตรวจสอบเอาต์พุต ฟังก์ชัน SD_MMC.begin() พยายามเมานต์การ์ด SD หากล้มเหลว ข้อความแสดงข้อผิดพลาดจะถูกพิมพ์ไปยังซีเรียลมอนิเตอร์

ส่วนถัดไปของโค้ดสร้างไฟล์ใหม่บนการ์ด micro SD และเขียนข้อความหนึ่งบรรทัดลงไป

File file = SD_MMC.open("/test.txt", FILE_WRITE); 
if (!file) {
  Serial.println("Failed to open file for writing"); // พิมพ์ข้อความแสดงข้อผิดพลาดหากเปิดไฟล์ไม่สำเร็จ
  return;
}
if (file.println("Test file write")) { // เขียนข้อความหนึ่งบรรทัดลงในไฟล์
  Serial.println("File write successful"); // พิมพ์ข้อความแสดงความสำเร็จหากการเขียนสำเร็จ
} else {
  Serial.println("File write failed"); // พิมพ์ข้อความแสดงข้อผิดพลาดหากการเขียนล้มเหลว
}
file.close(); // ปิดไฟล์

ที่นี่ ไฟล์ชื่อ test.txt ถูกเปิดในโหมดเขียน หากเปิดไฟล์สำเร็จ จะเขียนข้อความหนึ่งบรรทัดและพิมพ์ข้อความแสดงความสำเร็จ หากการเขียนล้มเหลว จะพิมพ์ข้อความแสดงข้อผิดพลาดแทน สุดท้าย ไฟล์จะถูกปิดเพื่อให้แน่ใจว่าการเปลี่ยนแปลงถูกบันทึก

โค้ดยังอ่านไฟล์จากไดเรกทอรีรากของการ์ด micro SD และพิมพ์ชื่อและขนาดของไฟล์เหล่านั้น

File root = SD_MMC.open("/"); // เปิดไดเรกทอรีรากของการ์ด SD
while (File file = root.openNextFile()) { // วนลูปผ่านไฟล์ทั้งหมดในไดเรกทอรีราก
  Serial.print(file.name()); // พิมพ์ชื่อไฟล์
  Serial.print("\t");
  Serial.println(file.size()); // พิมพ์ขนาดไฟล์
  file.close(); // ปิดไฟล์
}

โค้ดส่วนนี้เปิดไดเรกทอรีรากและวนลูปผ่านไฟล์ทั้งหมด โดยพิมพ์ชื่อและขนาดของไฟล์ไปยังซีเรียลมอนิเตอร์ ซึ่งมีประโยชน์สำหรับการตรวจสอบว่าข้อมูลถูกเขียนสำเร็จและดูเนื้อหาของการ์ด SD

สำหรับรายละเอียดเพิ่มเติม โปรดอ้างอิงโค้ดเต็มที่โหลดไว้ด้านล่างบทความ

การสาธิต / สิ่งที่คาดหวัง

หลังจากอัปโหลดโค้ดและรีเซ็ต ESP32 คุณควรเห็นข้อความในซีเรียลมอนิเตอร์ที่ระบุว่าการ์ด SD ถูกเมานต์สำเร็จหรือไม่ และการดำเนินการไฟล์สำเร็จหรือไม่ คุณจะเห็นรายการไฟล์ที่พบในไดเรกทอรีราก ซึ่งยืนยันว่าข้อมูลถูกเขียนอย่างถูกต้อง (ในวิดีโอที่ 13:45)

ข้อผิดพลาดทั่วไป ได้แก่ การตรวจสอบให้แน่ใจว่าการ์ด micro SD ถูกฟอร์แมตและเชื่อมต่ออย่างถูกต้อง รวมถึงการตรวจสอบว่าซีเรียลมอนิเตอร์ถูกตั้งค่าที่อัตราบอดที่ถูกต้อง หากเกิดปัญหาใดๆ โปรดตรวจสอบการเดินสายไฟและการเชื่อมต่อของคุณอีกครั้ง

ไทม์สแตมป์ในวิดีโอ

  • 00:00 เริ่มต้น
  • 1:45 แนะนำการ์ด Micro SD บน ESP32
  • 3:46 หน้าเอกสาร
  • 4:43 โค้ด Arduino
  • 8:09 การเลือกบอร์ด ESP32 และพอร์ต COM ใน Arduino IDE
  • 9:51 การสาธิตการเขียนการ์ด MicroSD
  • 11:12 การดูไฟล์ที่เขียนบนพีซี

ภาพ

ESP32-40-micro-sd-card-1
ESP32-40-micro-sd-card-1
ESP32-40-micro-sd-card-2
ESP32-40-micro-sd-card-2
841-ESP32 Tutorial 40/55- Arduino code for micro SD card
ภาษา: C++
#include "SD_MMC.h"

void setup() {
  Serial.begin(115200); // Initialize serial communication
  if (!SD_MMC.begin()) { // Check if SD card is mounted successfully
    Serial.println("Failed to mount SD card"); // Print error message if SD card failed to mount
    return;
  }

  // Create a file in the root directory of SD card and open it in write mode.
  File file = SD_MMC.open("/test.txt", FILE_WRITE); 
  if (!file) {
    Serial.println("Failed to open file for writing"); // Print error message if file failed to open
    return;
  }
  if (file.println("Test file write")) { // Write a line of text to the file
    Serial.println("File write successful"); // Print success message if write operation is successful
  } else {
    Serial.println("File write failed"); // Print error message if write operation failed
  }
  file.close(); // Close the file

  File root = SD_MMC.open("/"); // Open the root directory of SD card
  if (!root) {
    Serial.println("Failed to open directory"); // Print error message if directory failed to open
    return;
  }
  Serial.println("Files found in root directory:"); // Print the list of files found in the root directory
  while (File file = root.openNextFile()) { // Loop through all the files in the root directory
    Serial.print("  ");
    Serial.print(file.name()); // Print the filename
    Serial.print("\t");
    Serial.println(file.size()); // Print the filesize
    file.close(); // Close the file
  }
}
void loop() {} // Empty loop function, does nothing

สิ่งที่คุณอาจต้องการ

แหล่งข้อมูลและเอกสารอ้างอิง

ไฟล์📁

ไม่มีไฟล์ที่พร้อมใช้งาน