项目笔记:Arduino读取SD卡

news2024/11/16 18:19:07

1 硬件连接(使用Arduino Uno):

CS -> 10
SCK -> 13
MOSI -> 11
MISO -> 12
VCC ->5V
GND -> GND

2 让Arduino检测到SD卡

官方测试程序:检测SD卡连接并输出卡型号

/*
  SD card test

  This example shows how use the utility libraries on which the'
  SD library is based in order to get info about your SD card.
  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:
    SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
 		Pin 4 used here for consistency with other Arduino examples


  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
// include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 4;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}

如果测试失败,要注意以下操作:

1 Initializing failed:
确认接线:对于Arduino Uno,SD卡读卡器的CS引脚要连接4.
如果接线正确,确认chipSelect值也为4

2 Could not find FAT16/FAT32 partition.\nMake sure you’ve formatted the card:
这一步需要对SD卡进行格式化,一定要选择FAT16或FAT32格式。对于内存大于32G的SD卡,windows自带的格式化工具不会提供FAT32选项,因此需要借用第三方工具:
http://ridgecrop.co.uk/index.htm?guiformat.htm
在这里插入图片描述
测试成功结果如下
在这里插入图片描述

2 利用SD卡读写文件

#include <SD.h>
#include <SPI.h>

const int chipSelect = 10;
String fileName = "test.txt";
File myFile;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  pinMode(chipSelect, OUTPUT);
  // wait for Serial Monitor to connect. Needed for native USB port boards only:
  while (!Serial);

  Serial.print("Initializing SD card...");

  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("1. is a card inserted?");
    Serial.println("2. is your wiring correct?");
    Serial.println("3. did you change the chipSelect pin to match your shield or module?");
    Serial.println("Note: press reset button on the board and reopen this Serial Monitor after fixing your issue!");
    while (true);
  }

  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open(fileName, FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    if (SD.exists(fileName)) {
      Serial.println("file exists");
    }
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  Serial.println("reopening...");
  // re-open the file for reading:
  myFile = SD.open(fileName);
  if (myFile) {
    Serial.println(fileName + ":");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    Serial.println("done.");
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}


void loop() {
  // nothing happens after setup
}

里面调用的SD类方法:
1

SD.begin(chipSelect)

启动SD类,chipSelect为SD读卡器CS引脚连接的Arduino引脚。返回值为boolean,代表SD卡是否成功启动

2

SD.open(fileName, FILE_WRITE)

打开文件,参数为(文件名,读取方式)。注意文件名采用8.3格式,即文件名最多8字符,文件拓展名最多3字符,不区分大小写。如果文件名长度超过限制可能造成文件创建失败。

读取方式分为FILE_READ和FILE_WRITE,如果该参数不填默认为FILE_READ。在FILE_READ为只读状态,而FILE_WRITE允许修改文件。在FILE_WRITE状态下如果open的文件名不存在会创建新文件。

在FILE_READ模式下默认从文件头读取,在FILE_WRITE模式下默认从文件末尾读取

该方法返回值为一个文件(File类型),代表打开的文件。File类型支持被作为boolean,true代表存在文件,false代表不存在文件

3

SD.exists(fileName)

判断文件是否存在,返回boolean

文件操作方法:

myFile.println()

在文件里打印信息

myFile.close()

关闭并退出当前文件

上述测试程序运行结果:
在这里插入图片描述
注:我在测试中调用了程序多次,导致test.txt里面有多行内容。第一次运行后test.txt中只会有一行testing 1 2 3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 磁盘结构,文件系统与inode

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、关于磁盘①磁盘②CHS寻址⑤磁盘结构的抽象二、文件系统①inode与文件的关系②创建文件&#xff0c;系统做的事③删除文件&#xff0c;系…

如何升级展锐RM500U模组的5GCPE固件

本文镜像&#xff1a;https://blog.csdn.net/weixin_45326556/article/details/128236605 如何升级展锐RM500U模组的5GCPE固件1. 准备工作2. 安装5GCPE串口驱动3. 升级固件3.1 选择固件3.2 选择串口号3.3 下载固件3.4 下载固件意外情况4. 重新启动5.参考文献1. 准备工作 从网盘…

智慧旅游景区Web3D可视化GIS综合运营平台

建设背景 2014年8月&#xff0c;《国务院关于促进旅游业改革发展的若干意见》。 2015年年初&#xff0c;原国家旅游局发布《关于促进智慧旅游发展的指导意见》。 2021年12月&#xff0c;国务院印发《“十四五”旅游业发展规划》。 在国家和有关部门的引导和支持下&#xff…

卡塔尔世界杯-诸神黄昏

世界杯 世界杯概述:国际足联世界杯&#xff08;FIFA World Cup&#xff09;简称“世界杯”&#xff0c;是世界上最高荣誉、最高规格、最高竞技水平、最高知名度的足球比赛&#xff0c;与奥运会并称为全球体育两大最顶级赛事&#xff0c;影响力和转播覆盖率超过奥运会的全球最大…

openGauss数据库安装(2.0.0企业版安装)

目录1. 准备环境2. 预安装3. 正式安装4. 启动并登录数据前言此次数据库的系统安装环境仍然是openEuler20.03LTS,openGauss安装版本是2.0.0版本&#xff0c;相对于极简版安装&#xff0c;确实多了一些工具&#xff0c;例如gs_om工具&#xff0c;极简版安装是没有的&#xff0c;企…

前后端传参

1、路径传参 前端传一个参数&#xff1a;123 后端接收一个参数&#xff1a;123 // /{}是必须写的&#xff0c;id是自定义的// PathVariable 这个注解也是必须写的&#xff0c;否则接不到参数GetMapping("/{id}")//使用什么类型去接收id的值&#xff0c;要看你后端需要…

损失函数是如何设计出来的

损失函数是如何设计出来的&#xff1f; 可以直接观看b站优质博主的视频&#xff0c;该博主讲的也是非常通透。劝大家直接去看视频&#xff0c;我这只是做一个学习笔记。 https://www.bilibili.com/video/BV1Y64y1Q7hi/?spm_id_from333.788&vd_sourcee13ed5ec556f20f3f3c2…

Medical Image Segmentation Review:The Success of U-Net

目录 医学图像分割综述&#xff1a;UNet的成功 1.摘要与介绍 2.分类 2.1.2D Unet 2.2 3D UNet 3.UNet扩展 3.1对于跳跃连接的增强与改进 3.1.1--增加跳跃连接数量 3.1.2--对跳跃连接过程中的特征进行处理 3.1.3--编码器和解码器特征图的组合 3.2--主干网络的改进与增…

【Lilishop商城】No3-2.模块详细设计,系统设置(系统配置、行政区划、物流公司、滑块验证码图片、敏感词过滤)的详细设计

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代码…

【JavaWeb开发-Servlet】day04-学生成绩管理系统-环境搭建与展示页面

1、项目名称&#xff1a;学生成绩管理系统 2、技术要求&#xff1a;Java、Servlet、JSP、HTML5、JavaScript、Css 3、编译环境&#xff1a;JDK1.8、eclipse2022、TomCat9.0 4、基本功能&#xff1a;增、删、改、查、分页、登录、注册 目录 一、创建项目 &#xff08;1&#x…

自动化测试平台(一):前期准备和后端服务搭建

一、前言 本专栏会基于djangoreact&#xff0c;并结合这些年自己构建多个自动化测试平台的经验&#xff0c;从0开始&#xff0c;一步一步教会你实现一个完备的商用级自动化测试平台&#xff0c;真正意义上能够降本增效创造价值的平台。 二、前期准备 安装mysql&#xff0c;版…

用Virtuoso和Abstract完成gds2lef

需要用到的工具有virtuoso和abstract。 数模混合的项目通常需要模拟完成模块设计&#xff0c;把接去数字的pin打上label&#xff08;text&#xff09;&#xff0c;数字的floorplan才能正式开始。 如果只需要简单的数字PR boundary和pin点位置&#xff0c;那么只使用virtuoso就…

MySQL分区详解

目录 一、定义 1.1 概述 1.2 分区的优势 二、分区的类型 2.1 检查MySQL是否支持分区 2.2 类型 2.3 分区的其他操作 一、定义 1.1 概述 数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果&#xff0c;但其主要目的是为了在特定的SQL操作中减少数据读写…

基于jsp+java+ssm考研指导平台-计算机毕业设计

项目介绍 本考研学习类的网站&#xff0c;采用了ssm框架技术和mysql数据库进行网站设计研发&#xff0c;系统具有前台展示&#xff0c;后台管理的设计模式&#xff0c;是一款典型的计算机毕业设计学习资料。前台主要展示了考研相关的资讯&#xff0c;方便用户在线注册并且留言…

【Windows逆向】【Qt】资源解析

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 分析思路思路获取资源路径的方法2️⃣ c正向编码编码使用流程不使用Qt方式获取思路3️⃣ frida方式获取Origin平台资源win32 - 定位目标资源win32 - 查找API含义win32 - 查找《符号》构造frida本地函数win32 - 全部代码win64 - …

【ESP32+freeRTOS学习笔记-(一)freeRTOS介绍】

目录FreeRTOS基本情况FreeRTOS的特色发行版的目录结构与文件说明原生程序的下载与目录结构FreeRTOS的主要文件说明头文件说明关于FreeRTOSConfig.h的说明主要的数据类型说明重要数据类型 -- TickType_t重要数据类型 -- BaseType_t一些默认的规则变量名的规则函数的命名规则宏的…

你在网络上发布的内容真的归你所有吗?有Web3.0和元宇宙的未来是什么样的?

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;9分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 你认为你在微博、抖音等社交媒体上发布的内容是属于你的吗&#xff1f;事实并非…

Dashed lines generator for 3dMax 虚线生成器插件使用教程

Dashed lines generator虚线生成器是一个3DMAX建模工具&#xff0c;可以通过简单的步骤自动生成所有类型的虚线&#xff1a;它可以用于模拟交通标志标准&#xff1b;使用“蒙皮修改器SKIN MODIFIER”选项&#xff0c;可以非常容易地操纵创建的虚线&#xff0c;更改其位置和方向…

关于Pytorch模型检查点大小和参数量的一些观察

目录 背景和需求 一、模型的参数量统计 二、模型检查点大小查看 三、检查点大小和模型参数量之间的关系 总结 背景和需求 一个Pytorch模型的大小可以从两个方面来衡量&#xff1a;检查点大小和模型的参数量。现在我从两个方面都拿到了具体数值&#xff0c;想要验证它们两个是否…

数据开源 | Magic Data开源DMS驾驶员行为数据集

由于近几年人工智能、芯片技术的发展&#xff0c;自动驾驶被资本市场越炒越热。目前大部分车企正在朝着完全自动驾驶努力&#xff0c;大部分已经落地的无人驾驶技术仍然是L2与L3级。同时&#xff0c;汽车行业也逐渐在汽车上集成了辅助自动驾驶和智能助手等功能&#xff0c;让驾…