• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何将 SD 卡数据记录器添加到Arduino项目

arduino 项目的差异很大,从家庭酿酒管理器到气象站,再到高级家庭自动化。通常你会想要记录这些项目的数据。在本教程中,我将向您展示如何将 SD 卡和实时时钟模块集成到项目中以允许时间戳数据记录。

收集组件、工具和库

组件

  • 标准面包板

  • Arduino 本教程使用 Nano,但大多数模型应该可以工作

  • MicroSD 卡分线板

  • 微型 SD 卡

  • 实时时钟

  • 温湿度传感器

  • 22 号连接线(多种颜色)

  • 9V 电池夹带导线

工具

  • 烙铁

  • 焊接

  • 三手工具

  • 带有 Arduino IDE 编程计算机

  • 适用于您的 Arduino 的 USB 电缆——用于 Nano 的 Mini B

图书馆

从他们的存储库下载以下 Arduino 库。对于每个库,将文件夹解压缩到Arduino/libraries文件夹中。将每个文件夹分别重命名为SDRTCLibDHTArduino IDE 无法处理文件名中的破折号。

  • 用于使用 SD 卡的Adafruit SD 库(sdfat 库的包装器)

  • Adafruit RTCLib fork在实时时钟中读取和设置时间

  • 用于读取温度和湿度的Adafruit DHT 传感器库

关于选择数据记录器的一句话

数据记录器可作为离散元件提供,成本从 35 美元到数百美元不等。选择正确的记录器是项目中的一个重要决定。检索深海观测项目以发现去年的数据已损坏,这将是一个巨大的失望。 

与所有项目一样,您需要考虑功耗,但在为特定项目选择数据记录器时,您还需要注意其他几个功能。

环境条件

也许该项目将处于恶劣的条件下。物理颠簸、高温、潮湿和其他条件会影响选择。有可以承受不同条件的记录器。一定要知道您的项目和记录器将在哪里生活并选择正确的技术。

接口类型

有串行记录器可以处理任何协议、I2C、RS232、CAN、SPI 等。接口协议会影响日志数据的写入速度。确保选择符合项目技术和写入速度要求的记录器。  

日志检索

如果无法检索记录的数据,那就不好了。这是众所周知的树倒下,周围没有人听到它。确保您了解如何从您选择的记录器中检索数据。在某些离散记录器 IC 芯片的情况下,您必须构建一个外部接口,您可以使用该接口从芯片中提取数据。

时间

一些记录器只是转储数据,而另一些记录器具有非常准确的数据记录时间戳。如您所料,时间戳越准确,价格通常越高。如果您的项目需要时间戳到纳秒的非常高速的日志记录,那么记录器将比不知道它是什么时间的记录器运行得更多。  

持久性

当您超出存储的末尾时,这就是您想要发生的事情。方案各不相同,从停止记录到开始覆盖最旧的数据。

媒体类型/耐用性

确保您评估设备内存可以被覆盖多少次,以及当它开始出现故障时的计划是什么。如果您必须在 10,000 次覆盖后更换整个记录器,则该值将取决于您计划每秒进行的写入次数。

SD卡记录仪

使用 SD 卡进行日志记录的好处很多。它相对便宜。您可以选择自己的日志记录格式以及是否需要时间戳。介质磨损后可轻松更换,并可快速取出并由任何标准计算机读取。  

SD 卡记录也有一些缺点。 

这不是潮湿可能影响触点的最佳恶劣环境。它还消耗了微控制器上的许多宝贵引脚。在实时时钟 (RTC) 和 SD 分线板之间,它使用六个不同类型的引脚。  

我为本教程选择了 SD 卡记录器,因为使用 SD 卡来写入和读取日志很容易和灵活。更重要的是,使用 SD 卡和 RTC 的技能将在各种其他项目中派上用场。

构建项目

按照以下步骤组装面包板。本教程使用一个简单的温度和湿度传感器来收集数据以进行记录。完成这些步骤后,您应该有一个类似于下图的面包板。

如何将 SD 卡数据记录器添加到Arduino项目  第1张完成的 SD 卡数据记录器

组装 SD 分线板

SD 卡分线板带有通孔、面包板友好的接头,但它们没有连接。一个快速的焊接过程将解决这个问题,并允许您如图所示放置电路板。

格式化并插入 SD 卡

将 SD 卡放入计算机并验证它是否已使用 FAT32 文件系统格式化。您可能需要一个 MicroSD 到标准 SD 卡的适配器。组件列表中的 SD 卡带有一个适配器。小心地将 SD 卡插入分线板。

组装实时时钟

实时时钟或 RTC 板作为套件提供,需要更多的焊接才能组装在一起。所有组件都包含在套件中。按照分步说明组装电路板,包括通孔接头。 

确保在组装后将随附的电池插入夹子中。如果没有安装电池,它将无法正常工作。RTC 仅在没有主电压时从电池中汲取能量,因此电池应该可以使用数年。

连接 9V 电池夹

许多电池盒(如上面零件列表中的电池盒)都带有对面包板不友好的导线。为了使引线面包板友好,将电线或插头引脚焊接到每根引线的末端。

关于 SD 卡读卡器的一句话

SD 卡读卡器的价格比本教程中推荐的要便宜得多。然而,问题是 SD 卡读卡器是 3 伏技术,而 Arduino 使用 5 伏微控制器。 

这意味着为了安全地使用带有 Arduino 的 SD 卡读卡器,需要一个逻辑电平转换器来转换两者之间的电压。这增加了成本和复杂性。零件清单中指定的阅读器可能会贵一点,但它有几件事情要做。

  • 它有一个内置的逻辑电平转换器,因此不需要额外的组件或接线。它不使用电阻来降低电压,这会减慢对卡的读写速度。因此,它可以安全地直接连接到 Arduino

  • 它使用微型 SD 卡,占用空间非常小

  • 有很多可用的代码和示例

阅读器使用 SPI 协议进行通信。Arduino 板带有为该协议设计的某些引脚。虽然可以在紧要关头使用备用引脚,但通过使用硬件专用引脚,您将获得最快和最可靠的性能。

示意图中指示的引脚对于 Arduino Uno 或 Arduino Nano 是准确的。

对 Arduino 进行编程

组装好项目硬件后,下一步就是对其进行编程。下载与本教程一起打包的 zip,或从github 存储库下载此数据记录项目的 zip。

  • datalogger.ino在 Arduino IDE 中打开

  • 使用 USB 转 USB 迷你电缆将 Arduino Nano 连接到计算机

  • 确保串行端口设置为使用工具 > 串行端口菜单连接 Arduino 时计算机检测到的端口

  • 确保使用工具 > 板菜单将板设置为带有 ATmega328 的 Arduino Nano

  • 通过单击“验证”按钮验证库是否已正确安装并确保没有错误

  • 将电池连接到项目。这似乎是一个奇怪的步骤,但 Arduino、RTC、传感器和 SD 卡读卡器都拉了足够的电压,我发现我的 USB 端口没有提供足够一致的电力并且项目不断重置。腾出时间连接 9V 电池。当我这样做时,我注意到 Arduino 上的状态指示灯明显变亮

  • 使用上传按钮将代码推送到 Arduino

  • 编辑代码以注释掉该行:rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); 通过将 a//放在该行的开头。第一次上传代码时,它会将 RTC 的日期和时间设置为编译时。但是你不想在每次板子重置时都重新设置时钟来编译时间。上传没有这个的代码rtc.adjust将在下次启动时单独保留时钟时间

  • 再次上传代码,将时间设置行注释掉

  • Control-Shift-M打开Serial Monitor窗口并确保将其设置为19200 baud您应该看到 Arduino 初始化,输出如下例所示

Initializing datalogger with RTC version 1.0
Starting Temp and Humidity Sensor
Starting SDCard reader and card
Opening logfile for write.
Starting Real Time Clock
Unixtime: 1405787147
1405787148,2014/7/19 16:25:48,69.80,40.00
1405787151,2014/7/19 16:25:51,69.80,40.00
1405787155,2014/7/19 16:25:55,69.80,40.00
1405787158,2014/7/19 16:25:58,69.80,40.00
1405787162,2014/7/19 16:26:02,69.80,40.00
1405787165,2014/7/19 16:26:05,69.80,40.00

关于程序的说明

数据记录器程序将 RTC 库、DHT 库和 SD 库中的功能融合在一起。程序顶部有几个选项可供您调整,例如数据文件的名称和您拥有的 DHT 类型。 

但是,如果您使用上面建议的组件,所有默认值都应该可以正常工作。

主循环

程序 simple 的主循环做了三件事。

  • 从传感器读取温度和湿度。我从我写的另一个教程中借用了一些代码:在您的家中构建无线传感器网络 

  • 将检索到的数据格式化成逗号分隔的列表发送到日志函数

  • 将数据发送到logThis()写入卡的函数

  • 睡三秒

只要 SD 卡上有电源和空间,它就会重复该过程。

日志记录

logThis()函数将数据字符串作为参数,从 RTC 获取时间,使用数据对其进行格式化并将其写入日志文件。日志文件名在#define程序部分中指定。当设置开始时,草图会打开日志文件,这样文件记录器就不必为每个日志条目重新打开它。下面显示的神秘sprintf命令格式化数据。 

如果要更改记录数据的方式,请确保您熟悉sprintf 函数,并且可以移动格式和数据元素。如果您只需要重新排序日期字段,您只需更改逗号之间的顺序,一切都应该正常工作。

sprintf(message, "%ld,%d/%d/%d %02d:%02d:%02d,%s",epoch,Year,Month,Day,Hour,Minute,Second,logmessage );

最后,该dataFile.println(message)命令将格式化的字符串写入文件。该函数的行为就像Serial.println命令一样。

SD 卡上的 FAT32 文件系统有一些限制值得了解。文件名也必须是 8.3 格式。它可以容纳的最大文件大小是 2GB 文件,它只能容纳 268,173,300 个文件。希望你能忍受这些限制。

时间

函数now.year()和朋友执行从 RTC 板读取当前时间元素(unix 纪元、年、月、日、小时、分钟、秒)并返回值所需的工作。

实时时钟最酷的地方在于它们当然可以计时。虽然代码和项目可以继续做其他重要的事情,比如确保你的啤酒在合适的温度下发酵,但它只是继续保持时间。即使您的项目断电,它仍会使用独立电池继续运行。 

你需要做的就是问它,它会告诉你现在几点了。这当然非常适合记录数据。零件清单中指定的组件是一个合格的计时器,但规格说它每天最多可以增加两秒。 

如果这让您彻夜难眠,那么请查看花哨的ChronoDot,以使用完全相同的协议获得更高的精度。在这个项目中,它可以与 RTC 完全互换,只需多花几美元,而且它是完全组装好的。

测试 

您已经构建了项目,对其进行了编程(两次),并阅读了所有关于上述操作理论的内容。是时候尝试一下了。

  1. 将电路板设置在温度和湿度感兴趣的地方并插入电池

  2. 让记录器运行一段时间收集数据

  3. 稍微从项目中移除电源并移除 SD 卡

  4. 将卡放入全尺寸适配器,然后将 SD 卡插入计算机。

  5. 打开文件datalog.txt

您应该会看到类似以下内容。

1405787012,2014/7/19 16:23:32,69.80,40.00
1405787015,2014/7/19 16:23:35,69.80,40.00
1405787019,2014/7/19 16:23:39,69.80,40.00
1405787022,2014/7/19 16:23:42,69.80,40.00
1405787026,2014/7/19 16:23:46,69.80,40.00
1405787029,2014/7/19 16:23:49,69.80,40.00
1405787053,2014/7/19 16:24:13,69.80,40.00

结论

在本教程中,我向您展示了如何将 SD 卡和实时时钟模块集成到您的项目中。使用示例代码,您可以记录较长时间的数据,这些数据可以快速轻松地复制到计算机上。 

完成此项目后,您可能会尝试对其进行一些修改或升级。尝试升级时间芯片以获得更准确的时间戳。包含的程序只是一遍又一遍地写入同一个文件,直到它写满为止。您可以尝试创建基于日期的文件轮换方案来每周轮换文件一次。 

我什至没有提到读卡器的卡检测线,它允许您在尝试任何读取或写入操作之前修改原理图和电路板以测试卡的存在。祝你好运,体验愉快。


文章目录
  • 收集组件、工具和库
    • 组件
    • 工具
    • 图书馆
  • 关于选择数据记录器的一句话
    • 环境条件
    • 接口类型
    • 日志检索
    • 时间
    • 持久性
    • 媒体类型/耐用性
    • SD卡记录仪
  • 构建项目
  • 组装 SD 分线板
  • 格式化并插入 SD 卡
  • 组装实时时钟
  • 连接 9V 电池夹
  • 关于 SD 卡读卡器的一句话
  • 对 Arduino 进行编程
  • 关于程序的说明
    • 主循环
    • 日志记录
    • 时间
  • 测试
  • 结论