把 Arduino数据导进Excel:从SD卡日志到折线图一步到位
- 2026-09-21 16:19:38
传感器读数不难,难的是把数据变成能分析的结果。这套 Arduino UNO 方案足够直观:它不是只显示,而是把数据按“日期、时间、温度”的结构化格式写进 SD 卡文件,后续直接导入 Excel,生成温度随时间变化的曲线图。你会得到一个可复用的“数据记录 + 可视化”基础模板。
用 DS3231 实时时钟模块获取当前时间、日期与温度;
用 20×4 I2C LCD实时显示;
用 MicroSD 卡模块把数据写入文本文件进行长期保存;
最后把日志导入 Excel,生成“温度随时间变化”的折线图,便于进一步分析。

项目用到的材料清单
Arduino UNO 开发板
USB 2.0 A/B 数据线
小面包板
20×4 I2C LCD
DS3231 实时时钟(配 CR2032 电池)
MicroSD 卡模块 + MicroSD 卡
若干连接线
接线说明
项目电路图使用 Tinkercad 绘制,并给出了明确的引脚对应关系。
1)DS3231 与 LCD(I2C 总线共用)
SDA → Arduino A4
SCL → Arduino A5
GND → Arduino GND
VCC → Arduino 5V
2)MicroSD 卡模块(SPI)
CS → Arduino D10
SCK → Arduino D13
MOSI → Arduino D11
MISO → Arduino D12
GND → Arduino GND
VCC → Arduino 5V
需要安装的库
项目在库管理器中示例展示了两类关键库:
RTClib(Adafruit)用于 DS3231/RTC 相关功能
LiquidCrystal I2C(Marco Schwartz)用于 I2C LCD 显示
项目也提示:打开 Arduino IDE 的“库管理器”,可在顶部菜单进入 Tools → Manage Libraries。
核心程序逻辑:显示 + 记录(SD 卡日志)
项目提供了完整的 Arduino 示例程序文件(用于 LCD 显示与 SD 卡记录)。
这里按代码实现把关键逻辑提炼成“你一看就懂”的版本:
1)启动阶段做三件事
初始化 DS3231 与 LCD,并开启背光;
检测 DS3231 与 SD 卡是否正常可用,异常时在屏幕提示并停止;
如果 SD 卡里已存在
data.txt,就删除它,重新开始记录(避免与旧数据混在一起)。
2)循环阶段每秒做一次采集与记录
从 DS3231 读取当前日期时间与温度;
在 20×4 LCD 上显示星期、日期、时间与温度;
打开
data.txt追加写入一行数据,然后关闭文件。写入格式为:YYYY/MM/DD,HH:MM:SS,temperature
// Autor / Auteur : Zineb KANDOUSSI (https://www.facebook.com/SchoolSurSeineFR/)// Creation / Création : Le 04/05/2023// Description :// Displaying the current time, date and temperature on the 20x4 LCD screen and data logging to a microsd card// Affichage de l'heure et la date actuelle ansi que la température sur l'écran LCD 20x4 et l'enregistrement des données sur une carte microSD.// Inspired from this code : File => Examples => RTClib => ds3231 / inspiré de ce code : Fichier => Exemples => RTClib => ds3231#include<Wire.h>// Include the Wire library for I2C communication // Inclure la bibliothèque Wire pour la communication I2C#include<RTClib.h>// Include the RTClib library for the DS3231 module // Inclure la bibliothèque RTClib pour le module DS3231#include<LiquidCrystal_I2C.h>// Include the LiquidCrystal_I2C library for the LCD screen // Inclure la bibliothèque LiquidCrystal_I2C pour l'écran LCD#include<SD.h>// Include the SD library for the microSD card // Inclure la bibliothèque SD pour la carte microSDFile dataFile;RTC_DS3231 rtc; // Initialize the rtc object for the DS3231 module // Initialiser l'objet rtc pour le module DS3231LiquidCrystal_I2C lcd(0X27, 20, 4); // Initialize the lcd object for the LCD screen // Initialiser l'objet lcd pour l'écran LCDconst int chipSelect = 10; // Define the chip select pin for the microSD card // Définir le pin de sélection de la carte microSDchar daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};byte char_temp[8]={B00100,B01010,B01010,B01110,B01110,B11111,B11111,B01110}; // for thermometer icon / pour l'icône du thermomètrevoidsetup(){rtc.begin();lcd.init(); // Initialize the LCD screen // Initialiser l'écran LCDlcd.backlight(); // Activate the LCD screen backlight // Activer le rétroéclairage de l'écran LCDlcd.createChar(0,char_temp);if (! rtc.begin()) { // Check if the DS3231 module is connected and functional // Vérifier si le module DS3231 est connecté et fonctionnellcd.setCursor(0,1);lcd.print("DS3231 Error!");while (1);}if (!SD.begin(chipSelect)) { // Check if the microSD card is connected and functional // Vérifier si la carte microSD est connectée et fonctionnellelcd.setCursor(0,1);lcd.print("SD card error!");while (1);}if (rtc.lostPower()) { // Check if the main power supply of the DS3231 is removed // Vérifier si l'alimentation principale du DS3231 est coupéelcd.setCursor(0,1);lcd.print("RTC has lost power!");rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));}if (SD.exists("data.txt")) // Check if the "data.txt" file exists // Vérifier si le fichier "data.txt" existe{SD.remove("data.txt"); // If the file exists, remove it // Supprimer le fichier "data.txt" s'il existe}lcd.setCursor(0,1); // Move the LCD screen cursor to position 0,0 // Déplacer le curseur de l'écran LCD en position 0,0lcd.print(" School sur Seine...");delay(3000);lcd.clear();}voidloop(){DateTime now = rtc.now(); // Read current date and time from DS3231 module // Lire la date et l'heure actuelles depuis le module DS3231float tempC = rtc.getTemperature(); // Read temperature from DS3231 module // Lire la température depuis le module DS3231//------------------------------Date display - Affichage de la date-----------------------------//lcd.setCursor(6,0);lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);lcd.setCursor(0,1);lcd.print("Date:");lcd.setCursor(6,1);if (now.day() <=9 ){lcd.print("0");lcd.setCursor(7,1);lcd.print(now.day(),DEC);}else {lcd.print(now.day(),DEC);}lcd.setCursor(8,1);lcd.print(":");lcd.setCursor(9,1);if (now.month() <=9 ){lcd.print("0");lcd.setCursor(10,1);lcd.print(now.month(),DEC);}else {lcd.print(now.month(),DEC);}lcd.setCursor(11,1);lcd.print(":");lcd.setCursor(12,1);lcd.print(now.year(),DEC);//------------------------------Time dsiplay - Affichage du temps-----------------------------//lcd.setCursor(0, 2);lcd.print("Time:");lcd.setCursor(6,2);if (now.hour() <=9 ){lcd.print("0");lcd.setCursor(7,2);lcd.print(now.hour(),DEC);}else {lcd.print(now.hour(),DEC);}lcd.setCursor(8,2);lcd.print(":");lcd.setCursor(9,2);if (now.minute() <=9 ){lcd.print("0");lcd.setCursor(10,2);lcd.print(now.minute(),DEC);}else {lcd.print(now.minute(),DEC);}lcd.setCursor(11,2);lcd.print(":");lcd.setCursor(12,2);if (now.second() <=9 ){lcd.print("0");lcd.setCursor(13,2);lcd.print(now.second(),DEC);}else {lcd.print(now.second(),DEC);}//----------------------------Temperature display - Affichage de la température---------------------------//lcd.setCursor(0,3);lcd.print("Temp:");lcd.setCursor(6,3);lcd.print(rtc.getTemperature());lcd.setCursor(11,3);lcd.write((char)223);lcd.setCursor(12,3);lcd.print("C");lcd.setCursor(15,3);lcd.print(char(0));// Open the file for saving data. // ouverture du fichier pour enregistrer les donnéesdataFile = SD.open("data.txt", FILE_WRITE);// if the file is open, we save the data // si le fichier est ouvert, on enregistre les donnéesif (dataFile) {dataFile.print(now.year(), DEC);dataFile.print('/');dataFile.print(now.month(), DEC);dataFile.print('/');dataFile.print(now.day(), DEC);dataFile.print(',');dataFile.print(now.hour(), DEC);dataFile.print(':');dataFile.print(now.minute(), DEC);dataFile.print(':');dataFile.print(now.second(), DEC);dataFile.print(',');dataFile.println(tempC);dataFile.close();} else {lcd.setCursor(0,2);lcd.print("Recording error!");}delay(1000);}
把 SD 卡数据导入 Excel 并生成温度曲线
项目给出了非常具体的 Excel 操作步骤,用于把 DATA.txt(项目说明中使用该文件名表达日志文件)导入并生成折线图:
打开 Excel,新建工作簿
点击功能区 “Data/数据”
选择 “From Text/CSV(从文本/CSV)”
选择要导入的
DATA.txt文件并 Import在导入对话框中:Delimiter 选 “Comma”,Data Type Detection 选 “Do not detect data type”
点击 Load
数据会显示在工作表中
第二列设为 Time 格式,第三列设为 Number 格式并确认
将第三列中的逗号替换为小数点
选中第二、三列
点击 “Insert/插入”
在 Charts/图表中选择第一个 “2-D Line/二维折线图”
得到“温度随时间变化”的二维折线图;也可按需要调整标题、线条颜色与坐标轴范围




为什么推荐新手做这个项目?
这个方案把“采集—显示—存储—分析”完整走了一遍:
采集来自 DS3231(时间/日期/温度)
显示在 20×4 I2C LCD
存储到 SD 卡文本日志
最终在 Excel 中可视化成曲线图
如果你准备做更长期的环境记录、课堂实验数据采集或简单的项目数据分析,这个项目是一个非常直接、可复用的起点。
免责声明:本篇所发布的内容主要经 AI 整理、翻译国外技术网站与开源社区,版权归原作者所有,图片摘自原文,本文仅用于学习交流。如涉及侵权,请联系我们删除或更正。

点击阅读原文查看更多


