Skip to content

Commit

Permalink
Add SD card example
Browse files Browse the repository at this point in the history
  • Loading branch information
lewisxhe committed Jan 30, 2024
1 parent fc332c4 commit aa5728a
Show file tree
Hide file tree
Showing 7 changed files with 366 additions and 3 deletions.
1 change: 1 addition & 0 deletions .github/workflows/arduino_ci.yml
Expand Up @@ -22,6 +22,7 @@ jobs:
examples/Lvgl_Images/Lvgl_Images.ino,
examples/LumenMeter/LumenMeter.ino,
examples/PMU_ADC/PMU_ADC.ino,
examples/SPI_SDCard/SPI_SDCard.ino,
examples/CameraShield/CameraShield.ino,
examples/PMU_Interrupt/PMU_Interrupt.ino,
examples/QWIIC_GPS_Shield/QWIIC_GPS_Shield.ino,
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/platformio.yml
Expand Up @@ -21,6 +21,7 @@ jobs:
examples/Lvgl_Images,
examples/LumenMeter,
examples/PMU_ADC,
examples/SPI_SDCard,
examples/PMU_Interrupt,
examples/CameraShield,
examples/QWIIC_GPS_Shield,
Expand Down
1 change: 1 addition & 0 deletions README.MD
Expand Up @@ -43,6 +43,7 @@ examples/
├── PMU_ADC # PMU Voltage detection example , only support 1.47-inch AMOLED
├── PMU_Interrupt # PMU interrupt example , only support 1.47-inch AMOLED
├── CameraShield # Extern camera shield example, only supports 1.91 inches
├── SPI_SDCard # External SD card example, SPI communication
├── QWIIC_GPS_Shield # Extern GPS Shield example,use Serial communication
├── QWIIC_HP303BSensor # Extern Temperature Pressure Sensor example,use Wire communication
├── QWIIC_MAX3010X # External heart rate module,use Wire communication
Expand Down
295 changes: 295 additions & 0 deletions examples/SPI_SDCard/SPI_SDCard.ino
@@ -0,0 +1,295 @@
/**
* @file SPI_SDCard.ino
* @author Lewis He (lewishe@outlook.com)
* @license MIT
* @copyright Copyright (c) 2024 Shenzhen Xin Yuan Electronic Technology Co., Ltd
* @date 2024-01-30
* @note Example demonstrates how to use SPI, sketch demonstrates connecting SD card as SPI device
*
* Connect the SD card to the following pins:
* | SD Card | 1.47 Inch | 1.91 Inch | 2.41 |
* | ------- | --------- | --------- | ------- |
* | MISO | 47 | 15 | onboard |
* | MOSI | 39 | 14 | onboard |
* | SCK | 39 | 13 | onboard |
* | CS | 9 | 12 | onboard |
*/

#ifdef LILYGO_TWRITSTBAND_S3
#error "Current example does not apply to T-Wristband"
#endif
#include <LilyGo_AMOLED.h>
#include <LV_Helper.h>


LilyGo_Class amoled;

lv_obj_t *label;


void listDir(fs::FS &fs, const char *dirname, uint8_t levels)
{
Serial.printf("Listing directory: %s\n", dirname);

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

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

void createDir(fs::FS &fs, const char *path)
{
Serial.printf("Creating Dir: %s\n", path);
if (fs.mkdir(path)) {
Serial.println("Dir created");
} else {
Serial.println("mkdir failed");
}
}

void removeDir(fs::FS &fs, const char *path)
{
Serial.printf("Removing Dir: %s\n", path);
if (fs.rmdir(path)) {
Serial.println("Dir removed");
} else {
Serial.println("rmdir failed");
}
}

void readFile(fs::FS &fs, const char *path)
{
Serial.printf("Reading file: %s\n", path);

File file = fs.open(path);
if (!file) {
Serial.println("Failed to open file for reading");
return;
}

Serial.print("Read from file: ");
while (file.available()) {
Serial.write(file.read());
}
file.close();
}

void writeFile(fs::FS &fs, const char *path, const char *message)
{
Serial.printf("Writing file: %s\n", path);

File file = fs.open(path, FILE_WRITE);
if (!file) {
Serial.println("Failed to open file for writing");
return;
}
if (file.print(message)) {
Serial.println("File written");
} else {
Serial.println("Write failed");
}
file.close();
}

void appendFile(fs::FS &fs, const char *path, const char *message)
{
Serial.printf("Appending to file: %s\n", path);

File file = fs.open(path, FILE_APPEND);
if (!file) {
Serial.println("Failed to open file for appending");
return;
}
if (file.print(message)) {
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}

void renameFile(fs::FS &fs, const char *path1, const char *path2)
{
Serial.printf("Renaming file %s to %s\n", path1, path2);
if (fs.rename(path1, path2)) {
Serial.println("File renamed");
} else {
Serial.println("Rename failed");
}
}

void deleteFile(fs::FS &fs, const char *path)
{
Serial.printf("Deleting file: %s\n", path);
if (fs.remove(path)) {
Serial.println("File deleted");
} else {
Serial.println("Delete failed");
}
}

void testFileIO(fs::FS &fs, const char *path)
{
File file = fs.open(path);
static uint8_t buf[512];
size_t len = 0;
uint32_t start = millis();
uint32_t end = start;
if (file) {
len = file.size();
size_t flen = len;
start = millis();
while (len) {
size_t toRead = len;
if (toRead > 512) {
toRead = 512;
}
file.read(buf, toRead);
len -= toRead;
}
end = millis() - start;
Serial.printf("%u bytes read for %u ms\n", flen, end);
file.close();
} else {
Serial.println("Failed to open file for reading");
}


file = fs.open(path, FILE_WRITE);
if (!file) {
Serial.println("Failed to open file for writing");
return;
}

size_t i;
start = millis();
for (i = 0; i < 2048; i++) {
file.write(buf, 512);
}
end = millis() - start;
Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
file.close();
}


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

bool rslt = false;

// Begin LilyGo 1.47 Inch AMOLED board class
//rslt = amoled.beginAMOLED_147();


// Begin LilyGo 1.91 Inch AMOLED board class
//rslt = amoled.beginAMOLED_191();

// Begin LilyGo 2.41 Inch AMOLED board class
//rslt = amoled.beginAMOLED_241();

// Automatically determine the access device
rslt = amoled.begin();

if (!rslt) {
while (1) {
Serial.println("The board model cannot be detected, please raise the Core Debug Level to an error");
delay(1000);
}
}

// Call to install SD card
bool mounted = amoled.installSD();

// In addition to using the default Pin, you can also customize the Pin
// bool mounted = amoled.installSD(miso, mosi, sclk, cs);

// Register lvgl helper
beginLvglHelper(amoled);

label = lv_label_create(lv_scr_act());
lv_label_set_recolor(label, true); /*Enable re-coloring by commands in the text*/
lv_obj_set_style_text_font(label, &lv_font_montserrat_20, 0);
lv_obj_set_width(label, LV_PCT(80));
if (!mounted) {
lv_label_set_long_mode(label, LV_LABEL_LONG_SCROLL_CIRCULAR); /*Circular scroll*/
lv_label_set_text(label, "#ff0000 SD card installation failed, please confirm the SD card connection!!#");
lv_obj_center(label);
return;

} else {
uint32_t size = SD.cardSize() / (1024 * 1024);
uint32_t totalBytes = SD.totalBytes() / (1024 * 1024);
uint32_t usedBytes = SD.usedBytes() / (1024 * 1024);


lv_label_set_text_fmt(label,
"#00ff00 SD card installation Succeed#\nSD Card Size: %lluMB\nTotal space: %lluMB\nUsed space: %lluMB\nThe rest of the SD operation output is in Serial, please open the Serial monitor to view\n",
size, totalBytes, usedBytes);
lv_obj_center(label);
lv_task_handler();
}


listDir(SD, "/", 0);
createDir(SD, "/mydir");
listDir(SD, "/", 0);
removeDir(SD, "/mydir");
listDir(SD, "/", 2);
writeFile(SD, "/hello.txt", "Hello ");
appendFile(SD, "/hello.txt", "World!\n");
readFile(SD, "/hello.txt");
deleteFile(SD, "/foo.txt");
renameFile(SD, "/hello.txt", "/foo.txt");
readFile(SD, "/foo.txt");
testFileIO(SD, "/test.txt");
}

void loop()
{
lv_task_handler();
delay(2);
}





















8 changes: 6 additions & 2 deletions platformio.ini
Expand Up @@ -37,11 +37,15 @@ default_envs = T-Display-AMOLED
;! The src_dir variable can only have one row

; Basic example
src_dir = examples/Factory
; src_dir = examples/Factory
; src_dir = examples/TFT_eSPI_Sprite
; src_dir = examples/Touchpad
; src_dir = examples/Lvgl_Images


;! Extern SPI Example
src_dir = examples/SPI_SDCard

;!1.47 Inch exampls
; src_dir = examples/LumenMeter
; src_dir = examples/PMU_ADC
Expand Down Expand Up @@ -146,7 +150,7 @@ lib_deps =
SPIFFS
SD
sparkfun/SparkFun MAX3010x Pulse and Proximity Sensor Library @ ^1.1.2

[env:T-Display-AMOLED]
extends = env
board = T-Display-AMOLED
Expand Down

0 comments on commit aa5728a

Please sign in to comment.