arduino R4 SD卡讀寫測試

使用買來的 st7789LCD 顯示器背面就帶著一個 tf 卡槽,可以直接連接 tf 卡。使用 Sdfat 庫就可以實現對 sd 卡的讀寫操作。這里嘗試測試 sd 卡的讀寫功能。

LCD 顯示器的初始化

//定義LCD的對象
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);tft.init(240, 320); // 初始化ST7789 240x320
tft.fillScreen(ST77XX_BLACK); // 用黑色填充屏幕
tft.setTextColor(ST77XX_WHITE); // 設置文本顏色為白色
tft.setTextSize(2); // 設置文本大小
tft.setCursor(0, 0); // 設置文本起始位置
tft.println("SD read and write test");

SD 卡初始化

//定義SD卡對象
SdFat sd;if (!sd.begin(SD_CS, SD_SCK_MHZ(10))) {Serial.println("SD卡初始化失敗!");tft.setTextColor(ST77XX_RED);tft.println("SDcard init failed");tft.println("Please check the connection and card");while (1); // 失敗時停止
}

SD 卡寫

SdFile writeFile;if (!writeFile.open(FILENAME, O_WRITE | O_CREAT | O_TRUNC)) {Serial.println("無法創建文件");tft.println("Cannot create file");while (1);
}writeFile.println(message);
writeFile.close();

SD 卡讀

這里預留的 buffer 已經假設讀取的數據不會超過 99 個字符!

SdFile readFile;if (!readFile.open(FILENAME, O_READ)) {Serial.println("無法打開文件進行讀取");tft.println("Cannot open file for reading");while (1);
}char buffer[100]; // 足夠大的緩沖區,以容納消息
int bytesRead = readFile.read(buffer, sizeof(buffer) - 1);if (bytesRead > 0) {buffer[bytesRead] = 0; // 添加字符串結束符Serial.println(buffer);// 在LCD上顯示讀取的消息tft.setTextColor(ST77XX_GREEN);tft.println(buffer);
} else {Serial.println("讀取失敗!");tft.println("Read failed!");
}readFile.close();

完整程序

嘗試向 sd 卡寫入文件,讀取文件,并在 lcd 卡上打印。示例程序如下:

#include <SdFat.h>
#include <Adafruit_GFX.h>    // 核心圖形庫
#include <Adafruit_ST7789.h> // ST7789硬件特定庫// 定義引腳
#define SD_CS   7  // SD卡片選引腳
#define TFT_CS  10 // TFT片選引腳
#define TFT_DC  9  // TFT數據/命令引腳
#define TFT_RST 8  // TFT復位引腳// 創建SD卡和LCD對象
SdFat sd;
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);// 文件名定義
#define FILENAME "message.txt"// 要寫入的消息
const char* message = "Hello from SD card! hello world!";void setup() {// 初始化串口Serial.begin(115200);delay(1000);Serial.println("初始化SD卡和LCD...");// 初始化LCDtft.init(240, 320); // 初始化ST7789 240x320tft.fillScreen(ST77XX_BLACK); // 用黑色填充屏幕tft.setTextColor(ST77XX_WHITE); // 設置文本顏色為白色tft.setTextSize(2); // 設置文本大小tft.setCursor(0, 0); // 設置文本起始位置tft.println("SD read and write test");delay(1000);// 初始化SD卡if (!sd.begin(SD_CS, SD_SCK_MHZ(10))) {Serial.println("SD卡初始化失敗!");tft.setTextColor(ST77XX_RED);tft.println("SDcard init failed");tft.println("Please check the connection and card");while (1); // 失敗時停止}Serial.println("SDcard init success!");tft.println("SDcard init success!");delay(1000);// 打開文件進行寫入SdFile writeFile;if (!writeFile.open(FILENAME, O_WRITE | O_CREAT | O_TRUNC)) {Serial.println("無法創建文件");tft.println("Cannot create file");while (1);}// 寫入消息Serial.print("寫入消息: ");Serial.println(message);tft.println("Writing message...");delay(1000);writeFile.println(message);writeFile.close();Serial.println("消息寫入成功!");tft.println("Message written successfully!");// 打開文件進行讀取SdFile readFile;if (!readFile.open(FILENAME, O_READ)) {Serial.println("無法打開文件進行讀取");tft.println("Cannot open file for reading");while (1);}// 讀取消息Serial.println("讀取消息:");tft.println("Reading message...");delay(1000);char buffer[100]; // 足夠大的緩沖區,以容納消息int bytesRead = readFile.read(buffer, sizeof(buffer) - 1);if (bytesRead > 0) {buffer[bytesRead] = 0; // 添加字符串結束符Serial.println(buffer);// 在LCD上顯示讀取的消息tft.setTextColor(ST77XX_GREEN);tft.println(buffer);} else {Serial.println("讀取失敗!");tft.println("Read failed!");}readFile.close();Serial.println("操作完成!");tft.println("Operation completed!");
}void loop() {// 主循環為空
}

當前顯示字號為 2,對于Adafruit GFX 默認字體使用的是5x7像素的字體,但行和字符間又會有 1 個像素的間距,因此可以認為默認情況下一個字符占據 6×8 像素的空間。因此對于一個 240×320 的 LCD 來說,字號為 2 的顯示方式(12 ×16),一個屏幕最多顯示 400 個字符。

并且 adafruit 庫對于中文字符支持不友好,當前只能顯示英文。

adafruit 的 GFX 庫中提供獲取光標 XY 坐標的 API:

  • **getCursorX****:**獲取光標X坐標
  • **getCursorY****:**獲取光標Y坐標

參考鏈接:

Adafruit GFX Library: Adafruit_GFX Class Reference

參考討論:

Just a moment…

例如,可以在上面的程序中加入以下代碼:

  tft.print("Operation completed");int cursorX = tft.getCursorX();int cursorY = tft.getCursorY();tft.println("(X: " + String(cursorX) + ", Y: " + String(cursorY) + ")");

就可以打印出Operation completed 結束時的光標位置。

注意,這里使用 print 打印,而不是 println,因為 prtinln 會默認另起一行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74230.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【武漢·4月11日】Parasoft聯合光庭信息研討會|邀您共探AI賦能新機遇

Parasoft聯合光庭信息Workshop邀您共探AI賦能新機遇 AI浪潮已至&#xff0c;你準備好了嗎&#xff1f; 在智能網聯汽車飛速發展的今天&#xff0c;AI技術正以前所未有的速度重塑行業生態。如何把握AI機遇&#xff0c;賦能企業創新&#xff1f; 4月11日&#xff0c;自動化軟件…

VLLM專題(三十九)—自動前綴緩存(二)

前綴緩存(Prefix Caching)是一種在LLM推理中廣泛使用的優化技術,旨在避免冗余的提示詞(prompt)計算。其核心思想很簡單——我們緩存已處理請求的鍵值緩存(kv-cache)塊,并在新請求的前綴與之前請求相同時重用這些塊。由于前綴緩存幾乎是一種“免費的午餐”,并且不會改變…

自動駕駛系統的車輛動力學建模:自行車模型與汽車模型的對比分析

在自動駕駛系統的車輛動力學建模中&#xff0c;自行車模型&#xff08;Bicycle Model&#xff09;和更復雜的汽車模型&#xff08;如雙軌模型或多體動力學模型&#xff09;各有其適用場景和優缺點。以下是兩者的詳細對比及選擇原因解析&#xff1a; 1. 模型定義與核心差異 特性…

C語言入門教程100講(6)類型修飾符

文章目錄 1. 什么是類型修飾符&#xff1f;2. 常見的類型修飾符3. 類型修飾符的使用3.1 short 和 long3.2 signed 和 unsigned 4. 類型修飾符的組合5. 示例代碼代碼解析&#xff1a;輸出結果&#xff1a; 6. 常見問題問題 1&#xff1a;short 和 long 的具體大小是多少&#xf…

Linux-Ubuntu 系統學習筆記 | 從入門到實戰

&#x1f4d8; Linux-Ubuntu 系統學習筆記 | 從入門到實戰 &#x1f4dc; 目錄 環境安裝基本操作Linux操作系統介紹文件系統常用命令用戶權限管理編輯器vimGCC編譯器動態庫與靜態庫Makefile 1. 環境安裝 &#x1f31f; 下載鏡像 推薦使用清華大學開源鏡像站下載Ubuntu鏡像&a…

防火墻帶寬管理

拓撲 配置 [fw]interface GigabitEthernet 0/0/0 [fw-GigabitEthernet0/0/0]service-manage all permit [fw]interface GigabitEthernet 1/0/0 [fw-GigabitEthernet1/0/0]ip address 12.0.0.1 24 [fw]interface GigabitEthernet 1/0/1 [fw-GigabitEthernet1/0/1]ip ad…

一人系統 之 為什么要做一人系統?

一人系統 之 賺錢認知篇&#xff08;下&#xff09; 本文 2119個字&#xff0c;大概閱讀時間 16分鐘。 在上一篇文章中&#xff0c;主要講了以下三個內容&#xff1a; 什么是好的工作&#xff1f;時薪高&#xff0c;并且有能力提升&#xff0c;而且最終可以獨立創業的工作&…

基于springboot的電影院管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 互聯網技術的成熟和普及&#xff0c;勢必會給人們的生活方式帶來不同程度的改變。越來越多的經營模式中都少不了線上運營&#xff0c;互聯網正強力推動著社會和經濟發展。國人對民族文化的自信和不同文化的包容&#xff0c;再加上電影行業的發展&#xff0c;如此繁榮吸引…

Java安全-類的動態加載

類的加載過程 先在方法區找class信息&#xff0c;有的話直接調用&#xff0c;沒有的話則使用類加載器加載到方法區(靜態成員放在靜態區&#xff0c;非靜態成功放在非靜態區)&#xff0c;靜態代碼塊在類加載時自動執行代碼&#xff0c;非靜態的不執行;先父類后子類&#xff0c;…

ROS多機通信功能包——Multibotnet

引言 這是之前看到一位大佬做的集群通信中間件&#xff0c;突發奇想&#xff0c;自己也來做一個&#xff0c;實現更多的功能、更清楚的架構和性能更加高效的ROS多機通信的功能包 鏈接&#xff1a;https://blog.csdn.net/benchuspx/article/details/128576723 Multibotnet Mu…

C++:背包問題習題

1. 貨幣系統 1371. 貨幣系統 - AcWing題庫 給定 V 種貨幣&#xff08;單位&#xff1a;元&#xff09;&#xff0c;每種貨幣使用的次數不限。 不同種類的貨幣&#xff0c;面值可能是相同的。 現在&#xff0c;要你用這 V 種貨幣湊出 N 元錢&#xff0c;請問共有多少種不同的…

IT工具 | node.js 進程管理工具 PM2 大升級!支持 Bun.js

P(rocess)M(anager)2 是一個 node.js 下的進程管理器&#xff0c;內置負載均衡&#xff0c;支持應用自動重啟&#xff0c;常用于生產環境運行 node.js 應用&#xff0c;非常好用&#x1f44d; &#x1f33c;概述 2025-03-15日&#xff0c;PM2發布最新版本v6.0.5&#xff0c;這…

2025年01月02日浙江鼎永前端面試

目錄 webpack 和 vite 區別react fiber 架構vue diff 算法react diff 算法hooks 源碼垂直水平布局項目介紹單點登錄大文件上傳微前端 1. webpack 和 vite 區別 Webpack 和 Vite 是兩種不同的前端構建工具&#xff0c;它們在設計理念、性能表現和使用場景上存在顯著差異。以下…

1.企業級AD活動目錄核心解析:架構、組件與集成實踐

在當今數字化時代&#xff0c;企業級網絡環境日益復雜&#xff0c;高效、安全的資源管理和用戶認證成為企業 IT 運營的關鍵。AD&#xff08;Active Directory&#xff09;活動目錄作為微軟 Windows 系列服務器中的重要目錄服務&#xff0c;為企業級網絡管理提供了強大的解決方案…

【數據分享】2014-2024年我國各城市逐年空氣質量指數(AQI)數據

空氣質量指數&#xff08;AQI&#xff09;是一個衡量空氣污染程度的綜合指標&#xff0c;它并不直接表示具體污染物的濃度值&#xff0c;而是基于多種污染物的濃度進行的綜合評價&#xff0c;具體基于六種主要污染物的濃度&#xff1a;PM2.5、PM10、SO?、NO?、O?和CO。AQI是…

【C++】深入理解list迭代器的設計與實現

深入理解list迭代器的設計與實現 引言1、鏈表基礎結構2、鏈表迭代器的封裝2.1 初步封裝迭代器類2.2 引入const迭代器2.2.1 參考STL源代碼2.2.2 完善迭代器 3、迭代器實現機制結語 引言 在STL容器中&#xff0c;list作為經典的雙向鏈表容器&#xff0c;其迭代器設計體現了C模板編…

C語言基礎系列【27】typedef

博主介紹&#xff1a;程序喵大人 35- 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x1f…

【CXX-Qt】2.5 繼承

某些 Qt API 要求你從抽象基類中重寫某些方法&#xff0c;例如 QAbstractItemModel。 為了支持直接從 Rust 中創建這樣的子類&#xff0c;CXX-Qt 提供了多種輔助工具。 某些基類可能需要特殊的構造參數。這可以通過使用自定義構造函數來實現。 訪問基類方法 要在 Rust 中訪…

磁盤清理工具-TreeSize Free介紹

TreeSizeFree是一個磁盤空間管理工具&#xff0c;主要用于分析磁盤使用情況&#xff0c;幫助用戶找到占用空間大的文件和文件夾: 特點&#xff1a;按大小排序&#xff1a;快速找到占用空間最大的文件或文件夾 一般可以刪除: 掃描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…

OpenCV中距離公式

一、各類距離公式總結 常見距離公式 歐氏距離&#xff1a; 曼哈頓距離&#xff08;L1&#xff09;?&#xff1a; 切比雪夫距離&#xff08;Chessboard&#xff09;?&#xff1a; 1、點與點距離(歐氏距離) ?二維空間? 設兩點坐標為 P1(x1,y1)、P2(x2,y2)&#xff0c;其距離…