【雕爷学编程】Arduino动手做(52)---MicroSD卡读写模块6

在这里插入图片描述

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验五十二:SPI接口Micro SD卡模块 TF卡读写卡器 (带电平转换芯片)

在这里插入图片描述

Micro SD卡读写模块的实验环境
1、Micro SD卡读写模块实验所需硬件清单
1G与4GTF卡X2
8Ω 0.5W小喇叭X1
Micro SD卡读卡器X2
Arduino Uno开发板 X1
Micro SD卡读写模块X2
DHT11 温度湿度模块X1
杜邦线 若干(备了9条)
LED发光二极管(蓝色)X1
Proto Shield原型扩展板(带mini面包板)X1

在这里插入图片描述

程序七:带有 SD 卡和 DHT11 湿度和温度传感器的 Arduino 数据记录器
(1)实验接线示意图

在这里插入图片描述
(2)Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序七:带有SD卡和DHT11湿度和温度传感器的Arduino数据记录器
  实验接线:DHT11接D4
  Micro SD      UNO
  CS-------------10
  MOSI(DI)------11
  MISO(DO)------12
  CLK------------13
*/

#include <SPI.h>    // 包含 SPI 库(SD 卡需要)
#include <SD.h>     // 包含 SD 库
#include <DHT.h>    // 包含 DHT 传感器库

File dataFile;

#define DHTPIN 4         // DHT11 数据引脚连接到 Arduino 引脚 4
#define DHTTYPE DHT11    // 使用 DHT11 传感器
DHT dht(DHTPIN, DHTTYPE); // 初始化 DHT 库

void setup() {
  // 打开串行通信并等待端口打开
  Serial.begin(9600);
  while (!Serial)
    ; // 等待串口连接。仅本机 USB 端口需要
  Serial.print("正在初始化 SD 卡...");
  if (!SD.begin())
  {
    Serial.println("初始化失败!");
    while (1);
  }
  Serial.println("初始化完成。");
  delay(2000);
  dht.begin();
}

uint16_t line = 1;

void loop() {
  delay(1000);
  // 读取湿度
  byte RH = dht.readHumidity();
  //以摄氏度读取温度
  byte Temp = dht.readTemperature();
  //打开文件DHT11Log.txt
  dataFile = SD.open("DHT11Log.txt", FILE_WRITE);

  // 如果文件打开正常,写入它:
  if (dataFile)
  {
    Serial.print(line);
    Serial.print(": 温度 = ");
    Serial.print(Temp);
    Serial.print("°C, 湿度 = ");
    Serial.print(RH);
    Serial.println("%");
    // 将数据写入 SD 卡文件 (DHT11Log.txt)
    dataFile.print(line++);
    dataFile.print(": 温度 = ");
    dataFile.print(Temp);
    dataFile.print("°C, 湿度 = ");
    dataFile.print(RH);
    dataFile.println("%");
    dataFile.close();

  }
  // 如果文件没有打开,打印错误
  else
    Serial.println("打开 DHT11Log.txt 出错");
}

(3)实验串口返回情况

在这里插入图片描述
(3)实验场景图

在这里插入图片描述
每隔五秒钟记录一次数据(参考程序,需要调试)

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序七:带有SD卡和DHT11湿度和温度传感器的Arduino数据记录器(连续记录)
  实验接线:DHT11接D2
  Micro SD      UNO
  CS-------------10
  MOSI(DI)------11
  MISO(DO)------12
  CLK------------13
*/

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

#define DHTPIN 2        // DHT11传感器连接到Arduino的引脚2
#define DHTTYPE DHT11   // DHT11传感器类型

DHT dht(DHTPIN, DHTTYPE);

File dataFile;          // 用于保存数据的文件

void setup() {
  Serial.begin(9600);
  dht.begin();

  // 初始化SD卡
  if (!SD.begin(10)) {
    Serial.println("SD卡初始化失败!");
    return;
  }

  // 打开数据文件
  dataFile = SD.open("data.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.println("时间, 温度(℃), 湿度(%)");  // 写入标题行
    dataFile.close();
    Serial.println("数据文件已创建!");
  } else {
    Serial.println("无法创建数据文件!");
  }
}

void loop() {
  // 读取温湿度数据
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  // 打开数据文件并追加数据
  dataFile = SD.open("data.txt", FILE_WRITE);
  if (dataFile) {
    String dataString = String(millis()) + ", " + String(temperature) + ", " + String(humidity);
    dataFile.println(dataString);
    dataFile.close();
    Serial.println("数据已记录:" + dataString);
  } else {
    Serial.println("无法打开数据文件!");
  }

  delay(5000);  // 延迟5秒钟记录一次数据
}

要点解读:
该程序使用了SD库和DHT库,需要预先安装这两个库。
DHT11传感器连接到Arduino的引脚2。
程序首先初始化串口通信和DHT传感器。
初始化SD卡并检查初始化是否成功。
打开数据文件(如果文件不存在则创建),并写入标题行。
在主循环中,读取DHT11传感器的温湿度数据。
打开数据文件并追加数据,数据格式为"时间, 温度(℃), 湿度(%)"。
每次记录数据后,延迟5秒钟进行下一次记录。
请确保将SD卡正确插入到Arduino的SD卡槽中,并将DHT11传感器正确连接到指定的引脚。记录的数据将以逗号分隔的格式存储在名为"data.txt"的文本文件中。您可以通过将SD卡插入计算机来访问和查看记录的数据。

参考代码之二

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序七:带有SD卡和DHT11湿度和温度传感器的Arduino数据记录器(连续记录)之二
  实验接线:DHT11接D2
  Micro SD      UNO
  CS-------------10
  MOSI(DI)------11
  MISO(DO)------12
  CLK------------13
*/

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

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

File dataFile;
const int chipSelect = 10;
const unsigned long interval = 5000;  // 记录间隔为5秒

unsigned long previousMillis = 0;

void setup() {
  Serial.begin(9600);
  pinMode(chipSelect, OUTPUT);

  if (!SD.begin(chipSelect)) {
    Serial.println("SD卡初始化失败");
    return;
  }

  Serial.println("SD卡初始化成功");

  dht.begin();
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    if (isnan(temperature) || isnan(humidity)) {
      Serial.println("无法读取温湿度数据");
      return;
    }

    dataFile = SD.open("data.txt", FILE_WRITE);

    if (dataFile) {
      dataFile.print("温度: ");
      dataFile.print(temperature);
      dataFile.print(" °C");
      dataFile.print(", 湿度: ");
      dataFile.print(humidity);
      dataFile.println(" %");
      dataFile.close();

      Serial.println("数据已记录到data.txt文件");
    } else {
      Serial.println("无法打开data.txt文件");
    }
  }
}

要点解读:
该程序使用了DHT库和SD库,需要先安装这两个库。
引脚DHTPIN定义为2,表示DHT11传感器连接的引脚。
定义了记录间隔为5秒的interval。
在setup函数中,初始化串口通信,设置SD卡的芯片选择引脚为10,初始化SD卡,开始DHT传感器的读取。
在loop函数中,通过判断当前时间与上一次记录时间的间隔,来确定是否记录数据。
使用DHT库的readTemperature和readHumidity函数读取温湿度数据。
如果读取到的数据不是有效值,则跳过本次记录。
打开名为"data.txt"的文本文件,如果成功打开,则将温湿度数据写入文件,并关闭文件。
如果无法打开文件,则在串口显示错误信息。
完成一次记录后,等待下一次记录间隔。
请注意,运行该程序前,需要将SD卡正确插入Arduino的SD卡模块,并根据具体连接情况修改引脚定义以及芯片选择引脚。此外,还需要确保SD卡已经格式化,并且文件"data.txt"在SD卡的根目录下是可写的。

参考代码之三:以下是一个使用Arduino与SD卡模块和DHT11传感器连续记录温湿度数据到TXT文本文件的完整程序代码,每次记录都会另起一行:

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序七:带有SD卡和DHT11湿度和温度传感器的Arduino数据记录器(连续记录)之三
  实验接线:DHT11接D2
  Micro SD      UNO
  CS-------------10
  MOSI(DI)------11
  MISO(DO)------12
  CLK------------13
*/

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

#define DHTPIN 2
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

File dataFile;
const int chipSelect = 10;
const unsigned long interval = 5000;  // 记录间隔为5秒

unsigned long previousMillis = 0;

void setup() {
  Serial.begin(9600);
  pinMode(chipSelect, OUTPUT);

  if (!SD.begin(chipSelect)) {
    Serial.println("SD卡初始化失败");
    return;
  }

  Serial.println("SD卡初始化成功");

  dht.begin();
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    if (isnan(temperature) || isnan(humidity)) {
      Serial.println("无法读取温湿度数据");
      return;
    }

    dataFile = SD.open("data.txt", FILE_APPEND);

    if (dataFile) {
      dataFile.print("温度: ");
      dataFile.print(temperature);
      dataFile.print(" °C");
      dataFile.print(", 湿度: ");
      dataFile.print(humidity);
      dataFile.println(" %");
      dataFile.close();

      Serial.println("数据已记录到data.txt文件");
    } else {
      Serial.println("无法打开data.txt文件");
    }
  }
}

要点解读:
该程序与之前的程序相似,只是在打开文件时使用了FILE_APPEND标志,以便将数据追加到文件末尾,而不是覆盖之前的内容。
在SD.open()函数中使用FILE_APPEND标志,以确保每次记录都追加到文件末尾。这样每次记录都会另起一行。

“FILE_WRITE”模式是写入模式,它会先清空文件的原有内容,然后从文件的开头写入新的内容。如果文件不存在,它会创建一个新的文件。这种模式适合于完全覆盖文件的情况。
“FILE_APPEND”模式是追加模式,它会保留文件的原有内容,然后从文件的末尾写入新的内容。如果文件不存在,它也会创建一个新的文件。这种模式适合于在文件后面增加内容的情况。

请注意,运行该程序前,需要将SD卡正确插入Arduino的SD卡模块,并根据具体连接情况修改引脚定义以及芯片选择引脚。此外,还需要确保SD卡已经格式化,并且文件"data.txt"在SD卡的根目录下是可写的。

程序八:播放音频文件2.wav和3.wav
(1)实验接线示意图(这里CS接D10)

在这里插入图片描述

(2)Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序八:播放音频文件2.wav和3.wav
  实验接线:喇叭接D9
  Micro SD      UNO
  CS-------------10
  MOSI(DI)------11
  MISO(DO)------12
  CLK------------13
*/

#include <SD.h>        //包含SD模块库
#include <TMRpcm.h>    //包含扬声器控制库

#define SD_ChipSelectPin 10   //将pin10定义为CS pin

TMRpcm tmrpcm;                //为扬声器库创建一个对象

void setup() {
  //定义扬声器引脚。扬声器库正在使用 pin9。
  tmrpcm.speakerPin = 9;

  // 设置串口
  Serial.begin(9600);
  Serial.println("准备就绪");
  

  //查看卡是否存在并且可以初始化。
  if (!SD.begin(SD_ChipSelectPin)) {
    Serial.println("SD 失败");
    return;               //如果没有就不要再做
  }

  //每次arduino上电或重置时都会播放声音文件“2”
  Serial.println("播放声音文件2.wav");
  Serial.println(" ");
  tmrpcm.play("2.wav");
}

void loop() {
  if (Serial.available()) {
    //通过串口监视器发送字母a开始播放
    if (Serial.read() == 'a') {
      // 设置音量。数字的范围可以是 0-7。
      // 此时设置音量为5。
      tmrpcm.setVolume(5);    // 将音量设置为 5。

      // 播放文件 3。文件 3 是 Red Light 的音频。
      Serial.println("字母a");
      Serial.println("播放声音文件3.wav");
      tmrpcm.play("3.wav");
    }
  }
}

(3)实验串口返回情况

在这里插入图片描述
(4)实验场景图

在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值