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)实验场景图