1. 项目概述
这个基于Arduino Nano的传感器数据记录系统,是我在环境监测项目中实际使用过的方案。它通过整合SD卡存储、温度传感器和气压传感器,实现了低成本、便携式的数据采集功能。整套设备可以装进火柴盒大小的空间,却能连续记录数周的环境数据。
相比市面上动辄上千元的专业数据记录仪,这个方案成本不到200元,但精度完全能满足大多数民用场景需求。我在农业大棚监测、仓储环境记录和高空气象气球等项目中都成功应用过这套系统。
2. 硬件选型与电路设计
2.1 核心控制器:Arduino Nano
选择Nano版本主要考虑三点:
- 体积小巧(18×45mm),适合嵌入式安装
- 具备足够的I/O口(22个数字/模拟引脚)
- 原生支持5V逻辑电平,与多数传感器兼容
实际使用中要注意:
- 烧录程序时需要将跳线帽从USB供电切换到外部供电
- 长时间运行时建议外接470μF电容稳定电源
2.2 存储模块:MicroSD卡适配器
推荐使用带电平转换的MicroSD模块,关键参数:
- 支持SPI模式(占用D10-D13引脚)
- 工作电压3.3V(必须带电平转换芯片)
- 最大支持32GB FAT32格式存储卡
实测中发现:
- 金士顿Class10卡兼容性最好
- 每次写入后需执行file.sync()确保数据落盘
- 平均写卡电流约50mA,需考虑供电能力
2.3 温度传感器:DS18B20
选型理由:
- 数字信号输出(单总线协议)
- ±0.5℃精度(-10℃~85℃范围)
- 防水封装版本可直接接触液体
接线要点:
- 4.7KΩ上拉电阻必须接
- 每个传感器有唯一64位地址码
- 建议使用3线制接法(VCC/DATA/GND)
2.4 气压传感器:BMP280
相比DHT22的优势:
- 同时提供气压和温度数据
- 0.12hPa气压分辨率
- I2C/SPI双接口可选
校准技巧:
- 上电后需等待5ms初始化
- 海平面气压需通过本地气象站校准
- 温度补偿系数要定期更新
3. 电路搭建与供电方案
3.1 整体接线图
code复制[V3.3]----[BMP280]
| SDA--A4
| SCL--A5
|
[5V]----[DS18B20]--D2
| |
| [4.7KΩ]
|
[SD模块]--CS--D10
MOSI--D11
MISO--D12
SCK--D13
3.2 电源管理方案
实测功耗数据:
- 空闲状态:15mA
- 传感器采样:25mA
- SD卡写入峰值:75mA
推荐供电方案:
- 移动场景:3.7V锂电池+升压模块
- 固定场景:5V/1A电源适配器
- 极端环境:太阳能板+18650电池组
重要提示:避免使用劣质USB线供电,电压跌落会导致SD卡写入失败
4. 核心代码实现
4.1 库文件引入
cpp复制#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <DS18B20.h>
#include <Adafruit_BMP280.h>
4.2 传感器初始化
cpp复制#define SD_CS 10
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DS18B20 sensors(&oneWire);
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(9600);
while(!Serial);
if(!SD.begin(SD_CS)) {
Serial.println("SD卡初始化失败");
return;
}
if(!bmp.begin(0x76)) {
Serial.println("BMP280未找到");
}
sensors.begin();
sensors.setResolution(12); // 设置12位分辨率
}
4.3 数据采集逻辑
cpp复制void loop() {
sensors.requestTemperatures();
float temp1 = sensors.getTempCByIndex(0);
float temp2 = bmp.readTemperature();
float pressure = bmp.readPressure() / 100.0F; // 转换为hPa
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if(dataFile) {
dataFile.print(millis());
dataFile.print(",");
dataFile.print(temp1);
dataFile.print(",");
dataFile.print(temp2);
dataFile.print(",");
dataFile.println(pressure);
dataFile.close();
}
delay(60000); // 每分钟记录一次
}
5. 数据存储优化技巧
5.1 文件系统管理
推荐的文件命名规则:
- 按日期:YYYYMMDD.csv
- 按批次:LOG_001.TXT
- 添加设备ID:NODE1_20230815.DAT
实测发现:
- 每个文件不超过2MB时读写最稳定
- 定期关闭文件可防止FAT表损坏
- 提前创建子目录能提高可靠性
5.2 数据格式优化
高效记录格式示例:
code复制timestamp,temp1,temp2,pressure
45321,25.63,25.61,1013.25
45981,25.65,25.62,1013.24
二进制存储方案:
cpp复制struct SensorData {
uint32_t timestamp;
float temp1;
float temp2;
float pressure;
};
6. 常见问题排查
6.1 SD卡无法识别
排查步骤:
- 检查CS引脚是否接对(通常D10)
- 确认卡格式化为FAT32
- 尝试降低SPI时钟速度
- 更换质量更好的SD卡
6.2 传感器读数异常
温度传感器故障:
- 检查上拉电阻是否接好
- 测量总线电压(正常3-5V)
- 尝试单独连接传感器
气压数据漂移:
- 避免阳光直射传感器
- 检查采样间隔是否过短
- 更新校准参数
6.3 数据丢失问题
预防措施:
- 每次写入后调用flush()
- 添加备用电池供电
- 实现异常重启恢复机制
7. 项目扩展方向
7.1 无线传输版本
可集成方案:
- ESP-01 WiFi模块
- HC-12无线串口
- NRF24L01 2.4G射频
7.2 低功耗优化
实测技巧:
- 采样间隔延长至5分钟
- 使用睡眠模式(功耗可降至0.5mA)
- 选用低功耗LDO稳压器
7.3 外壳设计与防水
3D打印建议:
- 留出传感器通风孔
- 添加硅胶密封圈槽
- 设计可更换电池仓
我在实际部署中发现,用热缩管整体包裹电路板,再配合防水接头,可以在户外环境中稳定运行半年以上。对于需要高频采样的场景,建议在代码中添加异常重启机制,当检测到系统卡死时自动复位。