传感器读数不难,难的是把数据变成能分析的结果。这套 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

项目在库管理器中示例展示了两类关键库:
项目也提示:打开 Arduino IDE 的“库管理器”,可在顶部菜单进入 Tools → Manage Libraries。


项目提供了完整的 Arduino 示例程序文件(用于 LCD 显示与 SD 卡记录)。
这里按代码实现把关键逻辑提炼成“你一看就懂”的版本:
1)启动阶段做三件事
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 LCD lcd.backlight(); // Activate the LCD screen backlight // Activer le rétroéclairage de l'écran LCD lcd.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 fonctionnel lcd.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 fonctionnelle lcd.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ée lcd.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,0 lcd.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 DS3231 float 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ées dataFile = SD.open("data.txt", FILE_WRITE); // if the file is open, we save the data // si le fichier est ouvert, on enregistre les données if (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);}
项目给出了非常具体的 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 整理、翻译国外技术网站与开源社区,版权归原作者所有,图片摘自原文,本文仅用于学习交流。如涉及侵权,请联系我们删除或更正。