arduino教程系列18-SD卡读写实验 arduino入门,arduino教程

本次实验使用arduino驱动SD卡,在SD卡中进行文件读写。

需要说明的是arduino的SD库文件,目前对2G以上的卡支持不是很好,所以推荐大家使用2G包含2G以下的,文件格式使用FAT格式。

这次我是用的是kingmax2G的MicroSD卡。


IMGP0671_调整大小.JPG

2011-9-10 13:38 上传
(188.99 KB)





先看一下硬件连接图


Snap1.jpg

2011-9-10 13:38 上传
(108.41 KB)




IMGP0685_调整大小.JPG

2011-9-10 22:43 上传
(184.05 KB)





把下面代码下载进arduino控制板ARDUINO

/*
 此例子展示如果记录三个模拟引脚数值到SD卡,使用SD库。
          
 电路部分
 * 模拟引脚使用模拟口0,1,2大家可以根据情况接入模拟传感器,
   如果没有,也可以完成此实验,只不过数值是不停跳动的干扰源。
 * SD卡与arduino控制板使用SPI总线连接
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 */
 
#include <SD.h>
 
// CS引脚为pin4,这里也沿用官方默认设置
const int chipSelect = 4;  //设定CS接口
 
void setup()
{
  Serial.begin(9600);  //设置串口通信波特率为9600
  Serial.print("Initializing SD card...");  //串口输出数据Initializing SD card...
  pinMode(10, OUTPUT);
 
 
  if (!SD.begin(chipSelect)) {  //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not present
    Serial.println("Card failed, or not present");
    return;
  }
  Serial.println("card initialized.");  //与SD卡通信成功,串口输出信息card initialized.
}
 
void loop()
{
  // 定义数组
  String dataString = "";
 
  // 读取三个传感器值,写入数组
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ","; 
    }
  }
 
  // 打开文件,注意在同一时间只能有一个文件被打开
  // 如果你要打开另一个文件,就需要先关闭前一个
  File dataFile = SD.open("datalog.txt", FILE_WRITE);  
 
  // 打开datalog.txt文件,读写状态,位置在文件末尾。
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // 数组dataString输出到串口
    Serial.println(dataString);
  }  
  // 如果无法打开文件,串口输出错误信息error opening datalog.txt
  else {
    Serial.println("error opening datalog.txt");
  } 
}

下载完成后,打开串口监视器。


Snap6.jpg

2011-9-10 13:38 上传
(39.92 KB)





控制板开始工作后会看到如下画面,图中每一行上就是每次记录的三个传感器数值,本次实验并没有接传感器,所以数值是周围干扰源的杂乱信号。


Snap2.jpg

2011-9-10 13:38 上传
(32.63 KB)





关闭arduino电源后把SD卡取出,接入电脑后,可以看到SD卡中有一个DATALOG.TXT文件,打开后有可以看到,此文件中的信息就是记录下的各个传感器的数值。


Snap3.jpg

2011-9-10 13:38 上传
(59.7 KB)





第一个代码实验完以后,SD卡中的DATALOG.TXT不要删除,把下面代码下载进arduino中,打开串口监视器,看看效果。ARDUINO

/*
 这个例子展示如何通过SD库从SD卡中读取一个文件,并且把数据通过串口发送。
 
 * SD卡与arduino控制板使用SPI总线连接
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 */
 
#include <SD.h>
 
// CS引脚为pin4,这里也沿用官方默认设置
const int chipSelect = 4;  //设定CS接口
 
void setup()
{
  Serial.begin(9600);  //设置串口通信波特率为9600
  Serial.print("Initializing SD card...");  //串口输出数据Initializing SD card...
  pinMode(10, OUTPUT);
 
  if (!SD.begin(chipSelect)) {  //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not present
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");  //与SD卡通信成功,串口输出信息card initialized.
 
  File dataFile = SD.open("datalog.txt");  //打开datalog.txt文件
 
  if (dataFile) {
    while (dataFile.available()) {  //检查是否dataFile是否有数据
      Serial.write(dataFile.read());  //如果有数据则把数据发送到串口
    }
    dataFile.close();  //关闭dataFile
  }  
 
  else {
    Serial.println("error opening datalog.txt");  //如果文件无法打开串口发送信息error opening datalog.txt
  } 
}
 
void loop()
{
}

可以看到,DATALOG.TXT文件中的数据都通过串口发送回了电脑。效果如下图:


Snap4.jpg

2011-9-10 13:38 上传
(35.19 KB)





再把下面的代码下载进arduino控制板中,打开串口监控器看看效果。ARDUINO

/*
 
 此例子展示如何在SD卡中创建于删除文件
 * SD卡与arduino控制板使用SPI总线连接
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
          
 */
#include <SD.h>
 
File myFile;
 
void setup()
{
  Serial.begin(9600);  //设置串口通信波特率为9600
  Serial.print("Initializing SD card...");  //串口输出数据Initializing SD card...
  pinMode(10, OUTPUT);
 
  if (!SD.begin(4)) {  //如果从CS口与SD卡通信失败,串口输出信息initialization failed!
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");  //CS口与SD卡通信成功,串口输出信息initialization done.
 
  if (SD.exists("example.txt")) {  //检查example.txt文件是否存在
    Serial.println("example.txt exists.");  //如果存在输出信息example.txt exists.至串口
  }
  else {
    Serial.println("example.txt doesn't exist.");  //不存在输出信息example.txt doesn't exist.至串口
  }
 
  Serial.println("Creating example.txt...");
  myFile = SD.open("example.txt", FILE_WRITE);  //打开example.txt,如果没有自动创建,写入状态
  myFile.close();  //关闭文件
 
  if (SD.exists("example.txt")) {
    Serial.println("example.txt exists.");
  }
  else {
    Serial.println("example.txt doesn't exist.");  
  }
 
  Serial.println("Removing example.txt...");
  SD.remove("example.txt");  //删除文件example.txt
 
  if (SD.exists("example.txt")){ 
    Serial.println("example.txt exists.");
  }
  else {
    Serial.println("example.txt doesn't exist.");  
  }
}
 
void loop()
{
 
}

下面图就是串口监视器显示的结果,显示文件创建于删除的过程。


Snap5.jpg

2011-9-10 13:38 上传
(30.01 KB)





再把下面的代码传入arduino控制板,看看效果ARDUINO

#include <SD.h>
 
File myFile;
 
void setup()
{
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
   pinMode(10, OUTPUT);
 
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  myFile = SD.open("test.txt", FILE_WRITE);
 
 
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
 
    myFile.close();
    Serial.println("done.");
  } else {
    Serial.println("error opening test.txt");
  }
 
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
 
    while (myFile.available()) {
            Serial.write(myFile.read());
    }
 
    myFile.close();
  } else {
 
    Serial.println("error opening test.txt");
  }
}
 
void loop()
{
 
}

串口监视器中可以看到如下画面


Snap7.jpg

2011-9-10 13:38 上传
(27.02 KB)





把SD卡接入电脑,可以在里面找到TEST.TXT文件,里面的内容如下。


Snap8.jpg

2011-9-10 13:38 上传
(28.15 KB)


via - 极客工坊

标签: Arduino教程