这个基于Arduino Nano的环境数据记录系统,是我最近完成的一个实用项目。它能够持续监测温度、气压和海拔高度,并将这些数据实时存储到SD卡中。这种设计非常适合野外气象监测、室内环境记录或者任何需要长时间采集环境数据的场景。
作为一名电子爱好者,我经常需要记录各种环境参数。市面上的数据记录仪要么价格昂贵,要么功能单一。于是我用Arduino Nano开发板配合BMP180气压传感器和SD卡模块,打造了这个成本不到100元但功能完备的数据记录系统。
整套系统最吸引人的特点是它的便携性和可靠性。Arduino Nano体积小巧,整个装置可以轻松放入口袋;使用SD卡存储数据,既保证了存储容量(支持最大32GB),又能方便地将数据导入电脑分析。实测下来,系统可以稳定运行数周不中断,数据完整无丢失。
在选择硬件时,我主要考虑了三个因素:性能、功耗和成本。经过多次对比测试,最终确定了以下配置:
注意:BMP180已经停产,市面上多为BMP085或更新的BME280。这三个传感器引脚兼容,代码也基本通用,但BME280还增加了湿度检测功能。
接线是项目成功的第一步,也是最容易出错的地方。下面这张表格是我经过多次实践总结出的最优接线方案:
| BMP180引脚 | Arduino Nano引脚 | 注意事项 |
|---|---|---|
| VCC | 3.3V | 绝对禁止接5V,会立即烧毁传感器 |
| GND | GND | 确保与Arduino共地 |
| SDA | A4 | I2C数据线 |
| SCL | A5 | I2C时钟线 |
| SD模块引脚 | Arduino Nano引脚 | 说明 |
|---|---|---|
| VCC | 5V | 大多数模块支持5V,但部分需要3.3V |
| GND | GND | 电源地 |
| MOSI | D11 | SPI数据输出 |
| MISO | D12 | SPI数据输入 |
| SCK | D13 | SPI时钟 |
| CS | D10 | 片选引脚,代码中需保持一致 |
接线时最容易犯的错误有两个:
我建议先用万用表检查所有连接,特别是电源线路,确认无误后再通电。
在开始编程前,需要安装必要的库文件:
提示:如果使用PlatformIO开发,可以在platformio.ini中添加:
code复制lib_deps = adafruit/Adafruit BMP085 Library@^1.0.0
完整的代码已经在前文给出,这里重点解析几个关键部分:
cpp复制void setup() {
Serial.begin(9600);
while (!Serial) {;}
// 传感器初始化
if (!bmp.begin()) {
Serial.println("BMP085 not found!");
}
// SD卡初始化
if (!SD.begin(SD_CS_PIN)) {
Serial.println("SD card initialization failed!");
}
}
这段代码完成了两个重要工作:
cpp复制void loop() {
if (millis() - lastRecordTime >= RECORD_INTERVAL) {
// 读取传感器数据
float temperature = bmp.readTemperature();
long pressure = bmp.readPressure();
// 写入SD卡
File dataFile = SD.open(fileName, FILE_WRITE);
if (dataFile) {
dataFile.print(millis());
dataFile.print(",");
dataFile.println(temperature, 2);
dataFile.close();
}
}
}
这里有几个值得注意的细节:
millis()而非delay()实现定时,避免阻塞程序flush()确保数据立即写入卡中原始代码中数据记录格式为:
code复制时间,温度,气压,海拔
我建议增加更多元数据,便于后期分析:
cpp复制// 在setup()中添加文件头
if (dataFile.size() == 0) {
dataFile.println("Date,Time,Temp_C,Pressure_hPa,Altitude_m,SeaLevelPressure");
dataFile.println("Device: ArduinoNano_BMP180");
dataFile.println("RecordingInterval: 1000ms");
}
这样生成的文件会包含设备信息和记录参数,几个月后查看数据也不会混淆。
现象:串口显示"SD card initialization failed!"
排查步骤:
现象:文件中有部分数据缺失
解决方案:
flush()和close()现象:温度或气压值明显偏离实际
处理方法:
cpp复制float temperature = bmp.readTemperature() + 0.5; // 示例:增加0.5°C补偿
要使系统适合长期户外使用,可以:
修改后的采集间隔代码:
cpp复制#include <LowPower.h>
void loop() {
recordData();
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // 睡眠8秒
}
系统可以轻松扩展更多环境传感器:
接线时注意:
采集的数据可以用Python进行专业分析:
python复制import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('sensor.csv')
data['Time'] = pd.to_datetime(data['Time'], unit='ms')
plt.figure(figsize=(12,6))
plt.plot(data['Time'], data['Temperature_C'])
plt.title('Temperature Trend')
plt.show()
这套系统我已经在多个项目中实际应用,最长的连续运行了3个月无故障。关键在于选择可靠的SD卡和稳定的电源。建议使用知名品牌的工业级SD卡,虽然价格贵一些,但数据无价。