概述
这是一个方便的arduino防护板:我们有很多人在寻找专用且设计良好的数据记录防护板。我们努力设计出价格低廉但功能全面的设计。此防护罩可轻松为您的arduino添加具有千兆字节存储空间的“硬盘”!
此流行防护罩的最新版本具有流行原始防护罩的所有功能,并且与“ r3”兼容,因此您几乎可以将其与任何arduino或兼容产品一起使用。您可以在不到15分钟的时间内启动并运行它-将数据保存到任何fat16或fat32格式的sd卡上的文件中,以供任何绘图,电子表格或分析程序读取。本教程还将向您展示如何使用两个免费软件程序来绘制数据。随附的rtc(实时时钟)可用于以当前时间为所有数据添加时间戳,以便您确切地了解何时发生了什么!
数据记录器是可靠,全面且通用的设计。它易于扩展或修改,并得到在线文档和库的很好支持
功能:
sd卡接口可用于fat16或fat32格式的卡。内置的3.3v电平转换器电路使您可以超快地读取或写入数据,并防止损坏sd卡
即使在拔下arduino的情况下,实时时钟(rtc)仍可以保持时间。纽扣电池备份可以持续多年
包含的库以及用于sd和rtc的示例代码,这意味着您可以快速上手
用于焊接连接器,电路或传感器的原型区域。
li》
两个可配置指示灯led
板载3.3v稳压器既是可靠的参考电压,又可可靠地运行需要大量功率才能运行的sd卡
使用“ r3布局”的i2c和icsp/spi端口,因此与各种arduino和arduino兼容产品兼容
在此新版本中,您可以将其与:
兼容arduino uno或atmega328-4个模拟通道,分辨率为10位,如果不使用rtc,则为6个
arduino leonardo或atmega32u4兼容-12个模拟通道,分辨率为10位分辨率
兼容arduino mega或atmega2560-16个模拟输入(10位)
兼容arduino零或atsamd21-6个模拟输入(12位)
兼容arduino due-12个模拟输入(12位)
当然,您可以记录任何您喜欢的东西,包括具有arduino库,串行数据,位时序等等的数字传感器!
安装接头连接器
adafruit data logger防护板经过测试,已组装好所有组件和sd插槽,但是您仍然需要安装接头连接器,以便可以将其插入arduino
,因为有两个选项,所以我们不会预先组装接头!您可以使用普通的0.1英寸公头(包括在屏蔽中)或arduino shield stacking头。这两个选项还需要焊接一个2x3母头。
带公头的组装
大多数人都会对他与公头的屏蔽罩组装感到满意。使用它们的好处是不要在项目的高度上添加任何东西,它们会建立良好的牢固连接。但是,您将无法在顶部堆叠另一个盾牌。权衡取舍!
翻转并焊接另一侧以及2x3接头
将标头切成一定长度:
将标头条与在标头边缘上的孔对齐屏蔽并切下标题栏的4个部分以适合。
放置插头:
将插头部分(长针向下)插入arduino/metro的母头中。另外,将2x3母头插入usb另一侧的相应插针中。
放置防护罩:
将防护罩与排针对齐,然后按下。
然后焊接!
焊接每个引脚以确保良好的电接触。有关焊接的技巧,请参阅《 adafruit优秀焊接指南》。
使用堆栈头进行组装:堆栈头为您的数据记录仪提供了更大的灵活性。您可以将其与其他防护罩(例如rgb/lcd显示器防护罩)结合使用,以使紧凑型测井仪具有用户界面。您还可以将其与一个或多个proto-shield堆叠在一起,以增加更多的原型空间来与传感器接口。
堆叠接头安装在板的顶部而不是底部,因此该过程与安装简单的公头。
定位头:
从屏蔽层顶部插入页眉,然后将屏蔽层翻转并将其放置在平坦的表面上。调整标题以使其垂直。
请确保从屏蔽层的顶部插入插头,以便可以将其与底部。
将板子放在metro上并焊接2x3接头
然后焊接!
将每个引脚焊接成固体电气连接。
提示:从每个插头部分焊接一个引脚。如果其中任何一个弯曲,只需重新加热一个焊点并用手将其拉直即可。一旦所有接头都直了,继续焊接其余的引脚。
翻转并焊接另一面
放置2x3母头arduino/metro上的标题
防护罩概述
数据记录器防护罩有几件事使其成为跟踪数据的绝佳方法。这是盾牌的大致图:
我们的最新版本为5v,3.3v和地面添加了电源轨:
div》 sd卡
大的sd卡夹可容纳最大32g和最小32mb的sd/mmc存储(任何格式的fat16或fat32)。如果您有microsd卡,则可以使用低成本的适配器sd卡比microsd更难丢失,并且有足够的空间容纳标准尺寸的存储卡。
只需按一下即可插入,或拉出即可从该插槽中取出卡
sd活动led 连接到时钟引脚,当数据经过spi时它将闪烁,这可以帮助您确定何时可以移除或插入sd卡或电源。
电平转换器将所有信号从3.3v或5v dow移动n至3.3v,因此您可以安全地将此屏蔽罩与 any arduino一起使用,而不会损坏卡。便宜的屏蔽层使用电阻器进行电平转换,但这在高速或在所有电压电平下均无法正常工作!
实时时钟
这是计时设备。它包括一个8针芯片,一个矩形的32khz晶体和一个电池座
电池座必须包含一个电池,以便rtc能够跟踪从arduino断开电源时的时间!使用任何与cr1220兼容的纽扣电池
cr1220 12mm直径-3v锂币电池 strong》
产品id:380
这些是最高质量的产品。容量的电池,与icufflinks,inecklace,datalogging和gps shields,gps hat等产品随附的电池相同。每笔订购一个电池。..
$ 0.95
入库
添加到购物车
3.3v电源
板载3.3v ldo(低压降)稳压器可保持屏蔽的3v零件运行平稳。一些旧的arduinos没有完整的3.3v稳压器,写入sd卡可能会导致arduino重新启动。为了保持兼容性,我们只需将其保留在那里。右侧还有一个绿色的pwr(电源)良好led指示灯
用户led
我们有两个用户可配置的led。将任何arduino引脚上的电线连接到标记有 l1 或 l2 的焊盘,并拉高以打开 led1 或 led2
led右侧的重置按钮将重置整个arduino,方便您在要重新启动电路板时使用
原型开发区域
大的中间部分充满了0.1“网格原型孔,因此您可以自定义您的
顶部和底部两行原型孔是电源导轨。
突破垫
上面在分支板区域附近还显示了一些额外的分支。
在sd卡持有者的右侧:
cd -这是sd卡上的卡检测垫。将其接地后,将插入sd卡。它是漏极开路,使用上拉电阻(物理电阻或在软件中启用)
wp-这是sd卡上的写保护板,您可以使用它来通过检查此引脚来检测卡上的写保护选项卡。它是漏极开路,使用上拉电阻(物理电阻器或在软件中启用)
sq -这是rtc的可选方波输出。您必须发送命令将其打开,但这是选择获取精确方波的一种方法。我们主要将其用于测试。输出是开漏输出,因此具有上拉电阻(物理电阻或在软件中启用)
3v -这是稳压器输出的3v。它是高质量的3.3v参考电压,您可能希望为传感器供电。高达50ma可用
数字10号附近
cs -这是芯片选择 sd卡的引脚。如果由于冲突而需要将迹线切割到引脚10,可以将该焊盘焊接到任何数字引脚上,并重新上载软件
在数字3和#4附近 p》
l2 和 l1 -这些是可选的用户led。连接到任何数字引脚,将其拉高以打开相应的led。这些led已经串联了470欧姆电阻。
接线和配置
从datalogger屏蔽的b版本开始,我们不再使用数字引脚10、11、12、13用于spi和a4,a5用于i2c。现在,我们使用2x3 icsp标头,这意味着您不需要特殊的自定义i2c或spi库即可与mega,leonardo或zero(或其他任何将来的类型)的arduino一起使用!
我具有哪个版本?
这是较旧的datalogger屏蔽。特别要注意的是,原型区域完全充满了0.1“间隔的孔
这是“与r3兼容”的数据记录器。它具有较小的原型区域,并且在右侧有一个2x3 spi头点
较旧的屏蔽插脚
在较旧的屏蔽上,插脚固定为固定 :
数字#13- spi时钟
数字#12- spi miso
数字#11- spi mosi
数字#10- sd卡芯片选择(可以切割痕迹以重新分配)
sda 已连接至 a4
scl 已连接至 a5
rtc(ds13 07)i2c逻辑电平固定为5v
修订版b屏蔽引脚排列
icsp sck- spi时钟
icsp miso- spi miso
icsp mosi- spi mosi
数字#10- sd卡芯片选择(可以切割痕迹以重新分配)
sda 不 连接到 a4
scl not 连接到 a5
rtc(pcf8523)逻辑电平可以是3v或5v
在uno上,请注意,数字#13与icsp sck相同,#12是icsp miso,#11是icsp mosi,sda连接到a4,scl连接到a5。但是,这仅适用于uno!其他arduino具有不同的连接。由于屏蔽不再假设它位于uno上,因此它是最兼容的屏蔽。
在rev b屏蔽的底部,您可以看到,如果您有一个较旧的arduino,没有icsp 2x3接头连接器,也没有sda/scl引脚,则可以使焊接跳线短路。
如果您将屏蔽与3.3v逻辑arduino配合使用,则可能需要更改 vio 跳线。这就是i2c的10k上拉电阻。老实说,上拉非常弱,所以如果您忘记了,这没什么大不了的。但是,如果可以的话,请在中心焊盘和5v之间切一条小线,然后焊接另一侧,以便将vio连接到3v
较旧的数据记录器shield leonardo&mega library
仅当您有没有spi端口连接的较旧的datalogger屏蔽。
仅当您使用带有旧版datalogger防护罩的leonardo或mega时才需要!
如果您的屏蔽罩如上所示,并且在右侧具有2x3引脚头,请跳过此页面!
如果您的屏蔽罩没有2x3引脚头部分,并且您使用的是mega或leonardo(例如,不兼容uno),那么您可以继续阅读!/p》
如果您使用的leonardo或mega带有较旧的数据记录屏蔽,则必须替换现有的sd卡库以添加“任何引脚上的sd卡”支持。 如果您拥有uno/duemilanove/diecimila,则不需要这样做。如果您使用的是b版防护罩,那么也不需要这样做!
首先,找到“核心库”文件夹-如果您使用的是windows或linux,它将位于包含 arduino 可执行文件,查找 libraries 文件夹。在内部,您会看到一个 sd 文件夹(其中将是 sd.cpp sd.h 等)
在库文件夹中,新建一个名为 sdbackup 的文件夹。然后将 sd 文件夹拖到 sdbackup 中,这将“隐藏”旧的 sd 库而不删除它。 请注意,sdbackup必须位于库文件夹的外部之外,以便有效地“隐藏” sd库。
现在,我们将获取新的sd库,请访问https://github。 com/adafruit/sd ,然后单击 zip 下载按钮,或单击下面的按钮
下载sd库压缩文件
解压缩并重命名未压缩的文件夹 sd 。检查 sd 文件夹中是否包含 sd.cpp 和 sd.h
放置 sd 库文件夹,即写生簿库文件夹。如果您是第一个库,则可能需要创建库子文件夹。有关如何安装库的更多详细信息,请查看我们的超详细教程,网址为http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use
使用mega和leonardo的sd库因为mega和leonardo如果没有相同的硬件spi引脚分配,则需要指定将用于与卡进行spi通信的引脚。对于数据记录器屏蔽,它们将是引脚10、11、12和13。在草图中找到调用sd.begin()的位置(如下所示):
下载:文件
复制代码
// see if the card is present and can be initialized:
if (!sd.begin(chipselect)) {
// see if the card is present and can be initialized:
if (!sd.begin(chipselect)) {
并对其进行更改,以添加这些引脚号,如下所示:
下载:文件
复制代码
// see if the card is present and can be initialized:
if (!sd.begin(10, 11, 12, 13)) {
// see if the card is present and can be initialized:
if (!sd.begin(10, 11, 12, 13)) {
cardinfo cardinfo草图使用较低级别的库直接与卡对话,因此调用card.init()而不是sd.begin()。
下载:file
复制代码
// we‘ll use the initialization code from the utility libraries
// since we’re just testing if the card is working!
while (!card.init(spi_half_speed, chipselect)) {
// we‘ll use the initialization code from the utility libraries
// since we’re just testing if the card is working!
while (!card.init(spi_half_speed, chipselect)) {
在调用card.init()时,必须更改调用以指定spi引脚,如下所示:
下载:文件
复制代码
// we‘ll use the initialization code from the utility libraries
// since we’re just testing if the card is working!
while (!card.init(spi_half_speed, 10, 11, 12, 13)) {
// we‘ll use the initialization code from the utility libraries
// since we’re just testing if the card is working!
while (!card.init(spi_half_speed, 10, 11, 12, 13)) {
使用实时时钟
是实时时钟吗?
记录数据时,通常非常有用的是带有时间戳记!这样一来,您可以每隔一分钟(通过检查时钟)或记录一天中的什么时间记录数据。
arduino确实有一个称为 millis()的内置计时器。 ,并且该芯片还内置了计时器,可以跟踪更长的时间段,例如分钟或几天。那么,为什么要有单独的rtc芯片呢?好吧,最大的原因是 millis()只跟踪时间,因为arduino上次通电是- ,这意味着何时通电打开后,毫秒计时器将设置为0。arduino不知道它的“星期二”或“ 3月8日”,只能告诉我“自上次打开以来已经过了14,000毫秒”。
好的,如果您想在arduino上设置时间怎么办?您必须编程日期和时间,从那时起您就可以算上它了。但是,如果失去电源,则必须重新设置时间。就像非常便宜的闹钟一样:每次断电时,它们都会闪烁 12:00
尽管某些项目可以使用这种基本的计时功能,但数据记录器需要具有一致的计时功能,当arduino电池耗尽或重新编程时,计时不会重置。因此,我们包括一个单独的rtc! rtc芯片是一种专门的芯片,可以跟踪时间。它可以计算leap年,并且知道一个月中有多少天,但是它不考虑夏时制(因为它在不同的地方有所不同)
此图显示了具有实时功能的计算机主板时钟称为ds1387。
我们要使用的rtc是 pcf8523 或 ds1307 》。
如果您拥有adafruit datalogger shield b版,则将使用pcf8523 -该rtc较ds1307更新且更好。看一下屏蔽罩,看看是否在芯片上方写有 pcf8523 。
如果您使用的是较旧的datalogger保护罩,则将使用ds1307 -没有文本,因此您只需记住,如果不是 说是pcf8523,那就是ds1307
备用电池
只要有一个纽扣电池可以运行,即使在
使用任何cr1220 3v锂金属纽扣电池:
cr1220直径12毫米-3v锂纽扣电池
产品id:380
这些是最高质量的产品,容量的电池,与icufflinks,inecklace,datalogging和gps shields,gps hat等产品随附的电池相同。每笔订购一个电池。..
$ 0.95
入库
添加到购物车
您必须安装纽扣电池才能使rtc正常工作,如果没有纽扣电池,它将表现得很奇怪,并可能在您尝试使用arduino时将其挂起,因此始终确保已安装电池,即使电池没电了。
rtc
rtc是一种i2c设备,这意味着它使用2条线进行通信。这两条线用于设置时间并进行检索。在arduino uno上,这些引脚还连接到模拟4 和 5 引脚。这有点烦人,因为我们当然希望最多有6个模拟输入来读取数据,而现在我们已经丢失了2个。
对于rtc库,我们将使用jeelab卓越的分叉器可以在github上找到rtc库 。您可以通过访问github存储库并手动下载来实现此目的,或者只需单击此按钮即可下载zip
下载rtc库
重命名未压缩的文件夹 rtclib ,并检查 rtclib 文件夹是否包含 rtclib 。 cpp 和 rtclib 。h
将 rtclib 库文件夹放在 arduinosketchfolder/libraries/文件夹。
如果您是第一个库,则可能需要创建库子文件夹。重新启动ide。
我们还提供了有关arduino库安装的出色教程,网址为:
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use
完成后,重新启动ide
第一次rtc测试
我们将演示的第一件事是一个测试草图,它将每秒从rtc读取一次时间。我们还将显示如果您卸下电池并更换电池会发生什么,因为这会导致rtc停止。因此,要开始使用,请在未给arduino供电或未将其插入usb的情况下从电池座中取出电池。等待3秒钟,然后更换电池。这将重置rtc芯片。现在,为您的rtc加载匹配的草图
对于adafruit datalogger盾牌版本b,打开示例-》 rtclib-》 pcf8523
较旧的adafruit数据记录器,请使用示例-》 rtclib-》 ds1307
在数据记录器防护罩打开的情况下将其上传到arduino!
如果遇到问题,请确保运行正确的示例! pcf8523和ds1307 rtc芯片不相同,因此它们有单独的示例!
现在打开串行控制台,并确保将波特率正确设置为 57600波特,您应该会看到以下内容:
每当rtc芯片失去所有电源(包括备用电池)时,它将重置为较早的日期,并将时间报告为0:0:0或类似时间。 ds1307甚至不会数秒(已停止)。无论何时设置时间,这都会启动时钟的滴答声。
因此,基本上,这里的结果是,您永远不要卸下电池您已设定时间。您不需要,电池座也非常贴合,因此除非面板被压碎,否则电池不会“掉落”
设置时间
在加载了相同草图的情况下,取消注释以 rtc开头的行。/strong》,例如:
下载:文件
复制代码
if (! rtc.initialized()) {
serial.println(“rtc is not running!”);
// following line sets the rtc to the date & time this sketch was compiled
rtc.adjust(datetime(f(__date__), f(__time__))); if (! rtc.initialized()) {
serial.println(“rtc is not running!”);
// following line sets the rtc to the date & time this sketch was compiled
rtc.adjust(datetime(f(__date__), f(__time__)));
这行很可爱,它的作用是根据您使用的计算机获取日期和时间(编译时正确)代码)并将其用于rtc编程。如果您的计算机时间设置不正确,则应首先解决该问题。然后,您必须按上传按钮进行编译,然后立即上传。如果您先编译然后再上传,则该时间将关闭时钟。
然后打开“串行”监视器窗口以显示时间已设置
从现在开始,您不会必须再次设置时间:电池将使用5年或以上
读取时间
现在,rtc快活了,我们想查询一下时间。让我们再次看一下草图,看看如何完成
下载:文件
复制代码
void loop () {
datetime now = rtc.now();
serial.print(now.year(), dec);
serial.print(‘/’);
serial.print(now.month(), dec);
serial.print(‘/’);
serial.print(now.day(), dec);
serial.print(“ (”);
serial.print(daysoftheweek[now.dayoftheweek()]);
serial.print(“) ”);
serial.print(now.hour(), dec);
serial.print(‘:’);
serial.print(now.minute(), dec);
serial.print(‘:’);
serial.print(now.second(), dec);
serial.println(); void loop () {
datetime now = rtc.now();
serial.print(now.year(), dec);
serial.print(‘/’);
serial.print(now.month(), dec);
serial.print(‘/’);
serial.print(now.day(), dec);
serial.print(“ (”);
serial.print(daysoftheweek[now.dayoftheweek()]);
serial.print(“) ”);
serial.print(now.hour(), dec);
serial.print(‘:’);
serial.print(now.minute(), dec);
serial.print(‘:’);
serial.print(now.second(), dec);
serial.println();
使用rtclib获取时间的方法几乎只有一种,即调用 now(),此函数返回一个datetime对象,该对象描述了调用 now()时的年,月,日,时,分和秒。
有一些rtc库可以代替您调用 rtc.year()和 rtc.hour()之类的东西来获取当前的年份和小时。但是,存在一个问题,如果您碰巧在下一分钟滚动之前在 3:14:59 询问分钟,然后在分钟滚动之后询问第二分钟(所以在 3:15:00 ),您会看到时间为 3:14:00 ,该时间需要一分钟。如果您以其他方式进行操作,则可能会得到 3:15:59 -在另一方向上间隔一分钟。
因为这不是特别不可能发生的情况-特别是如果您经常查询时间-我们会一次从rtc中获取时间的“快照”,然后将其拆分为 day()或 second() (如上所示)。付出了更多的努力,但是我们认为避免错误是值得的!
我们还可以通过调用 unixtime 来从datetime对象中获取“时间戳”,该计数会计数自1970年1月1日午夜以来的秒数(不计算leap秒)
下载:文件
复制代码
serial.print(“ since 2000 = ”);
serial.print(now.unixtime());
serial.print(“s = ”);
serial.print(now.unixtime() / 86400l);
serial.println(“d”); serial.print(“ since 2000 = ”);
serial.print(now.unixtime());
serial.print(“s = ”);
serial.print(now.unixtime() / 86400l);
serial.println(“d”);
由于一天中有60 * 60 * 24 = 86400秒,因此我们可以轻松计算天数从那以后。当您想要跟踪自上次查询以来已经过去了多少时间,使一些数学变得容易得多时(例如检查是否过了5分钟,只需查看 unixtime()),这可能会很有用。增加了300,您不必担心小时的变化)
使用sd卡
数据记录器防护板的另一半是sd卡。 sd卡是我们存储长期数据的方式。尽管arduino芯片具有永久的eeprom存储,但只有几百个字节-与2 gig sd卡相比很小。 sd卡非常便宜且易于获得,它是长期存储的明显选择,因此我们将其用作屏蔽。
sd卡不附带屏蔽套件,但我们可以在其中随身携带sd卡。保证工作的商店。几乎所有sd卡都可以使用,但要注意一些廉价的卡是“假货”,并且会引起头痛。
4gb空白sd/microsd存储卡
产品id:102
使用此4gb micro-sd卡可以轻松添加大型存储。它带有sd适配器,因此您可以将其与我们的任何屏蔽罩或适配器一起使用!预格式化为fat,因此无法使用。..
缺货
缺货
您还需要一种从sd卡进行读写的方法。有时您可以使用相机和mp3播放器-插入相机后,您就可以将其视为磁盘。或者您可能需要sd卡读卡器。 屏蔽 不 能够将sd卡显示为“硬盘”,例如某些mp3播放器或游戏,而arduino没有该硬件,因此您将需要一个外部读取器!
usb microsd卡读取器/写入器-microsd/microsdhc/microsdxc
产品id:939
这是最可爱的小型microsd卡读/写器-但不要被它的可爱性所迷惑!它速度快,可支持多达64 gb的sdxc卡!只需将卡滑入。..
$ 5.95
进货
添加到购物车
格式化在windows/mac操作系统下
如果您购买了sd卡,则可能已经使用fat文件系统对其进行了预格式化。但是,您可能对工厂格式化卡的方式有疑问,或者如果它是旧卡,则需要重新格式化。我们使用的arduino sd库支持 fat16 和 fat32 文件系统。如果您的sd卡非常小,例如说8-32 mb,您可能会发现它的格式为 fat12 ,该格式不受支持。您必须重新格式化这些卡。无论哪种方式,即使使用新的总是格式化存储卡的好主意!请注意,格式化会删除卡,因此请先保存您想要的任何内容
我们强烈建议您使用的是官方sd卡格式化程序实用程序-由sd协会编写,它解决了格式错误带来的许多问题!
https上提供了官方sd格式化程序://www.sdcard.org/downloads/formatter_4/
下载并在您的计算机上运行,该页面上还有一个手册链接供使用
下载适用于windows的官方sd formatter软件
获取卡信息
arduino sd卡库有一个内置示例,可以帮助您测试屏蔽和连接
如果您使用的是较旧的没有spi头连接的数据记录屏蔽 ,并且您使用的是 leonardo,mega 或uno以外的任何其他产品,则需要安装规格sd库的正式版本
在 sd 库中打开文件 cardinfo 示例草图:
该草图不会向卡中写入任何数据,只会告诉您它是否能够识别它,以及一些有关它的信息。尝试确定是否支持sd卡时,这可能非常有用。在试用新卡之前,请先试用此草图!
转到草图的开头,并确保 chipselect 行正确,这是因为数据记录器屏蔽了我们的‘重新使用数字引脚10,因此将其更改为10!
如果您具有datalogger shield的pre-reb版本,并且您正在使用mega或leonardo,请在此处进行检查以调整引脚设置
好的,现在将sd卡插入arduino并上传草图
打开串行监视器,并在出现提示时在文本框中键入一个字符(并点击发送)。您可能会得到类似以下的内容:
它主要是乱码,但查看卷类型为fat16 部分以及卡的大小(大约2 gb,这应该是有用的)很有用是)等。
如果您的卡片质量较差(好品牌的盗版版本似乎更多),您可能会看到:
卡大部分响应,但是数据都很差。请注意,产品id 为“不适用” ,并且没有制造商id 或 oem id 。该卡返回了一些sd错误。它基本上是一个坏场景,我只保留这张卡作为坏卡的例子!如果您收到类似这样的消息(有响应但它已损坏),则应该扔掉卡
最后,尝试取出sd卡并再次运行草图,您将得到以下内容,
它甚至无法初始化sd卡。如果出现焊接错误或卡确实损坏
,也可能发生这种情况。如果您遇到sd卡问题,建议您使用上述sd格式化器首先确保卡清洁并可以使用!
光和温度记录器
简介
已经介绍了rtc和sd卡,并验证了它们是否可以正常工作,我们可以继续进行日志记录!
我们将使用一个非常好的详细演示来展示这些最出色的数据的功能。测井屏蔽:我们将记录温度和相对光照水平,以确定:
随着压缩机的开启和关闭,冰箱中的温度变化多少?
保持门打开是否会导致温度大幅下降?冷却需要多长时间?
真的里面的灯在关门时会熄灭吗?
构建它!
您的项目会需要:
arduino(当然!)最好是atmega328类型的-我们始终建议使用正式的“经典” arduino,例如uno。
adafruit数据记录器防护罩-组装的
sd卡,已格式化为fat,并使用示例草图进行了测试
cds光电管和匹配的10k下拉电阻
温度传感器,具有模拟输出,例如tmp36
电池组,例如6-aa’brick‘和2.1mm dc插孔。
或,您可以将9v夹子用于一个电源,但一个9v供电的记录仪将仅持续几个小时,因此我们建议使用6xaa的
一些22 awg导线,烙铁,焊料等。
您可以在adafruit商店中以折扣价获得该列表中的大部分商品!
i》
rs
我们将使用两个基本传感器来记录数据,一个cds光电管来跟踪光(这将告诉我们门何时打开),以及一个半导体温度传感器来记录冰箱的周围温度。
我们的站点上针对这些传感器有两个很棒的教程,如果您以前从未使用过它们或需要一些刷新,请立即阅读!
photocell教程
tmp36教程
我们将如下图所示对传感器进行接线。
请注意,我们连接了 aref,温度传感器的电源引脚和 3.3v 不是5.0v 的光传感器-我们这样做是因为5v线路噪声很大,而3.3v稳压器是更好地过滤。在实际的电路板上,我们使用了数据记录器稳压器提供的3.3v线,请参见下图-理论上与arduino相同,但我们更信任我们。
接线板上的原型区域是带有焊垫的简单孔阵列。下面的步骤说明了我们如何构建此电路,并说明了一些基本的电路原型技术。为了清楚起见,我们将使用与上面电路图中所示相同的色线:
传感器的位置传感器可以放置在原型区域的任何位置,但是我们选择这种布置以简化组件之间的连接。
准备一些跳线测量一根电线(红色)的长度足以从3v插孔延伸到温度传感器上方的1/2英寸处。从一端剥去大约3/4英寸,从另一端剥去大约1/4英寸。
测量另一端(黄色)从aref引脚到达两个传感器之间的孔的长度足够长。一端剥去1/2英寸,另一端剥去1/4英寸。
安装跳线如图所示放置跳线,长条形的末端靠近传感器。
由于在原型制作区域的孔之间没有信号迹线,因此我们将使用长的剥去的末端来连接电路板上组件的支脚。
建立连接
将第一个跳线(红色)焊接到3v孔中。
弯曲电线的剥皮末端,使其紧靠光传感器,温度传感器和aref跳线的末端。
将传感器支脚和aref支脚折叠在3v跳线上并焊接以形成连接。
为传感器添加更多跳线
从模拟引脚0到光传感器和电阻器附近的孔。 (白色)
从gnd到电阻另一端旁边的孔(黑色)
从模拟引脚1到电阻旁边的孔。温度传感器的中心引脚(绿色)
以及led指示灯
从l1到数字引脚2(黄色)
从l2到数字引脚3(黄色)
焊接并修剪所有内容连接使用相同的方法将组件支腿折叠在跳线上-进行所有连接,如接线图所示。
确保所有连接均已焊接。还要将电线和组件脚焊接到穿过孔的板上。
准备电池组
将连接器上的黑色塑料套圈放在电池组电线上。
将红色电线从电池组焊接到中心销
将黑色电线焊接到外部枪管。
压接以牢固地保持电线
拧紧黑色塑料套圈
现在,您的light temp logger已连接好并可以进行测试了!/div》
使用它!
sensor test
我们现在将使用此草图来测试传感器,这是本教程中两个示例的混搭
下载:文件
复制代码
#include
#include
/* sensor test sketch
for more information see http://www.ladyada.net/make/logshield/lighttemp.html
*/
#define aref_voltage 3.3 // we tie 3.3v to aref and measure it with a multimeter!
int photocellpin = 0; // the cell and 10k pulldown are connected to a0
int photocellreading; // the analog reading from the analog resistor divider
//tmp36 pin variables
int temppin = 1; //the analog pin the tmp36’s vout (sense) pin is connected to
//the resolution is 10 mv / degree centigrade with a
//500 mv offset to allow for negative temperatures
int tempreading; // the analog reading from the sensor
void setup(void) {
// we‘ll send debugging information via the serial monitor
serial.begin(9600);
// if you want to set the aref to something other than 5v
analogreference(external);
}
void loop(void) {
photocellreading = analogread(photocellpin);
serial.print(“light reading = ”);
serial.print(photocellreading); // the raw analog reading
// we’ll have a few threshholds, qualitatively determined
if (photocellreading 《 10) {
serial.println(“ - dark”);
} else if (photocellreading 《 200) {
serial.println(“ - dim”);
} else if (photocellreading 《 500) {
serial.println(“ - light”);
} else if (photocellreading 《 800) {
serial.println(“ - bright”);
} else {
serial.println(“ - very bright”);
}
tempreading = analogread(temppin);
serial.print(“temp reading = ”);
serial.print(tempreading); // the raw analog reading
// converting that reading to voltage, which is based off the reference voltage
float voltage = tempreading * aref_voltage / 1024;
// print out the voltage
serial.print(“ - ”);
serial.print(voltage); serial.println(“ volts”);
// now print out the temperature
float temperaturec = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mv offset
//to degrees ((volatge - 500mv) times 100)
serial.print(temperaturec); serial.println(“ degrees c”);
// now convert to fahrenheight
float temperaturef = (temperaturec * 9 / 5) + 32;
serial.print(temperaturef); serial.println(“ degrees f”);
delay(1000);
} #include
#include
/* sensor test sketch
for more information see http://www.ladyada.net/make/logshield/lighttemp.html
*/
#define aref_voltage 3.3 // we tie 3.3v to aref and measure it with a multimeter!
int photocellpin = 0; // the cell and 10k pulldown are connected to a0
int photocellreading; // the analog reading from the analog resistor divider
//tmp36 pin variables
int temppin = 1; //the analog pin the tmp36‘s vout (sense) pin is connected to
//the resolution is 10 mv / degree centigrade with a
//500 mv offset to allow for negative temperatures
int tempreading; // the analog reading from the sensor
void setup(void) {
// we’ll send debugging information via the serial monitor
serial.begin(9600);
// if you want to set the aref to something other than 5v
analogreference(external);
}
void loop(void) {
photocellreading = analogread(photocellpin);
serial.print(“light reading = ”);
serial.print(photocellreading); // the raw analog reading
// we‘ll have a few threshholds, qualitatively determined
if (photocellreading 《 10) {
serial.println(“ - dark”);
} else if (photocellreading 《 200) {
serial.println(“ - dim”);
} else if (photocellreading 《 500) {
serial.println(“ - light”);
} else if (photocellreading 《 800) {
serial.println(“ - bright”);
} else {
serial.println(“ - very bright”);
}
tempreading = analogread(temppin);
serial.print(“temp reading = ”);
serial.print(tempreading); // the raw analog reading
// converting that reading to voltage, which is based off the reference voltage
float voltage = tempreading * aref_voltage / 1024;
// print out the voltage
serial.print(“ - ”);
serial.print(voltage); serial.println(“ volts”);
// now print out the temperature
float temperaturec = (voltage - 0.5) * 100 ; //converting from 10 mv per degree wit 500 mv offset
//to degrees ((volatge - 500mv) times 100)
serial.print(temperaturec); serial.println(“ degrees c”);
// now convert to fahrenheight
float temperaturef = (temperaturec * 9 / 5) + 32;
serial.print(temperaturef); serial.println(“ degrees f”);
delay(1000);
}
确定上传此草图,然后再次检查串行监视器
在我的工作室中,我的温度约为24摄氏度,“光度”约为400-请记住,尽管温度传感器以c或f给出“绝对”读数,但光传感器为
一旦您确认传感器已正确连接并运行其时间来记录日志,就无法精确地给出读数!
测井草图
从git下载光和温度测井草图毂。插入sd卡。
在该部分的草图顶部查找,并取消注释任何相关的行。如果您不确定自己拥有哪一个,请查看rtc页面以获取详细信息。
下载:文件
复制代码
/************** if you have a ds1307 uncomment this line **************/
//rtc_ds1307 rtc; // define the real time clock object
/************** if you have a pcf8523 uncomment this line **************/
//rtc_pcf8523 rtc; // define the real time clock object
/**********************************************************************/ /************** if you have a ds1307 uncomment this line **************/
//rtc_ds1307 rtc; // define the real time clock object
/************** if you have a pcf8523 uncomment this line **************/
//rtc_pcf8523 rtc; // define the real time clock object
/**********************************************************************/
将草图上传到arduino。现在,我们将在仍“绑定”到计算机上的情况下对其进行测试
在arduno仍保持连接,闪烁并通电的情况下,将您的手放在光电管上几秒钟,然后将闪光灯照在它上面。您还应该用手指挤压温度传感器以对其加热
使用电子表格绘制
当您准备检查数据时,请拔下arduino并将sd卡放入计算机的读卡器中。您将至少看到一个文件,或者可能是几个文件,每次记录器最终运行时都一个文件
我们将打开最新的一个。如果要使用图形演示中使用的相同日志文件,请单击此处下载。
查看数据的最快方法是使用openoffice或excel之类的文件,您可以在其中打开.csv文件并将其直接导入电子表格
然后您可以通过选择数据列来执行一些绘图操作
点击图表 按钮并使用线条(我们认为它们最适合此类图表)
设置第一列作为标签
这将生成此图
您可以清楚地看到我如何遮蔽传感器,然后在其上照手电筒。
您可以使图形显示两者都具有不同的轴(因为温度变化是一组不同的单位。选择临时线(红色),右键单击并选择格式化数据系列。在选项标签中,将数据系列与次要y轴对齐。
或者您也可以仅使用 temp 数据
现在可以清楚地看到如何通过将其握在手指之间来对其进行加热
使用gnuplot
gnuplot是一个免费的(但不是开源的?)超强大的绘图程序。使用起来也很痛苦!但是,如果您买不起mathematica或matlab等专业的数学/绘图软件包,则gnuplot可以做很多!
我们不足以提供有关gnuplot的完整教程,这里有一些我们发现方便的链接。 google一定会帮助您找到更多的教程和链接。也是最好的老师。
http://www.cs.hmc.edu/~vrable/gnuplot/using-gnuplot.html
http://www.duke.edu/~hpgavin/gnuplot.html
http://www.ibm.com/developerworks/library/l-gnuplot/
我们发现按顺序执行以下命令将生成此数据的漂亮图形,请确保将logtest.csv与 wgnuplot.exe 放在同一目录中(或者,如果您知道如何引用目录,则可以可以放在其他位置)
下载:文件
复制代码
set xlabel “time” # set the lower x-axis label to ’time‘
set xtics rotate by -270 # have the time-marks on their side
set ylabel “light level (qualitative)” # set the left y-axis label
set ytics nomirror # tics only on left side
set y2label “temperature in fahrenheit” # set the right y-axis label
set y2tics border # put tics no right side
set key box top left # legend box
set key box linestyle 0
set xdata time # the x-axis is time
set format x “%h:%m:%s” # display as time
set timefmt “%s” # but read in as ’unix timestamp‘
plot “logtest.csv” using 2:4 with lines title “light levels”
replot “logtest.csv” using 2:5 axes x1y2 with lines title “temperature (f)”
set xlabel “time” # set the lower x-axis label to ’time‘
set xtics rotate by -270 # have the time-marks on their side
set ylabel “light level (qualitative)” # set the left y-axis label
set ytics nomirror # tics only on left side
set y2label “temperature in fahrenheit” # set the right y-axis label
set y2tics border # put tics no right side
set key box top left # legend box
set key box linestyle 0
set xdata time # the x-axis is time
set format x “%h:%m:%s” # display as time
set timefmt “%s” # but read in as ’unix timestamp‘
plot “logtest.csv” using 2:4 with lines title “light levels”
replot “logtest.csv” using 2:5 axes x1y2 with lines title “temperature (f)”
这是这样的:
请注意超酷的双面y轴刻度!您也可以轻松放大内容。
其他绘图仪
我们的朋友约翰还建议将live-graph作为免费的绘图程序-我们还没有尝试过,但是如果您需要进行大量绘图,它值得一看!/p》
便携式日志记录
当然,有一个数据记录器链接到台式计算机并不是那么方便。我们可以通过增加电池组来制造便携式记录仪。获得大量电量的最便宜方法是使用6节aa电池。我在这里用可充电电池和6xaa电池座制作了一个。它每秒运行arduino日志一次,持续18.5小时。如果您使用碱,则可以轻松获得24小时或更长时间。
冰箱日志记录
准备好我的便携式记录仪之后,该做一些冰箱loggin了!两者都放在冰箱的中间架子中央。
我将其放置在晚上10点左右,然后第二天中午将其移除。如果您没有冰箱,则可以从此zip文件中获取数据并使用它。
以下是记录的数据:
您可以在中间看到并结束温度和光照水平很高,因为记录仪在冰箱外面。绿线是温度,因此您可以看到温度缓慢升高,然后每半小时左右启动压缩机。红线表示门何时打开。今晚比平常更残酷!
在大约12:40 am放大图,我们可以看到门打开时温度是如何上升的,即使在几秒钟内温度也可以很快上升4度!
结论!
好的,这是一个详细的项目,但是它是测试数据记录的一个好项目的能力,尤其是因为它更难以修复现场的错误。通常,我们建议尝试其他传感器,并在可能的情况下在家进行测试。记录比所需更多的数据,并使用软件程序过滤不需要的内容也是一个好主意。例如,我们不使用vcc日志,但是如果您的传感器行为异常,它可能会为您提供电池寿命是否在影响它的线索。
代码演练
简介
这是“光和温度记录”草图的演练。它冗长而详尽,因此我们将其放在此处以供您细读。我们强烈建议您仔细阅读它,该代码具有非常多的用途,并且我们的文字描述应清楚说明其中为什么存在所有内容!
在此处下载完整文件:
包含并定义
下载:文件
复制代码
#include “sd.h”
#include
#include “rtclib.h” #include “sd.h”
#include
#include “rtclib.h”
确定这是文件的顶部,其中我们包括三个将要使用的库:用于与卡对话的 sd 库,可帮助arduino的 wire 库使用i2c和 rtclib 与实时时钟聊天
下载:文件
复制代码
// a simple data logger for the arduino analog pins
#define log_interval 1000 // mills between entries
#define echo_to_serial 1 // echo data to serial port
#define wait_to_start 0 // wait for serial input in setup()
// the digital pins that connect to the leds
#define redledpin 3
#define greenledpin 4
// the analog pins that connect to the sensors
#define photocellpin 0 // analog 0
#define temppin 1 // analog 1 // a simple data logger for the arduino analog pins
#define log_interval 1000 // mills between entries
#define echo_to_serial 1 // echo data to serial port
#define wait_to_start 0 // wait for serial input in setup()
// the digital pins that connect to the leds
#define redledpin 3
#define greenledpin 4
// the analog pins that connect to the sensors
#define photocellpin 0 // analog 0
#define temppin 1 // analog 1
接下来都是“定义” -常量和可调整项。
log_interval是传感器读数之间的毫秒数。 1000是1秒,这不是一个不好的起点。
echo_to_seria l确定是否将写入卡的内容也发送到串行监视器。这会使记录器更加缓慢,您可能需要串行监视器来查看其他内容。另一方面,它的使用很有用。我们将其设置为 1 以保持打开状态。将其设置为 0 将其关闭
wait_to_start意味着您必须向arduino的串行端口发送一个字符才能启动记录。如果您启用了此功能,则基本上无法使其脱离计算机,因此我们暂时将其保持关闭状态(设置为 0 )。如果要打开它,请将其设置为 1
其他定义更容易理解,因为它们只是引脚定义
redledpin是您连接到记录仪护罩上红色led的一切
greenledpin是您连接到记录仪护罩上绿色led的一切
photocellpin是cds单元连接到的模拟输入
temppin是tmp36连接到的模拟输入
对象和错误()
下载:文件
复制代码
rtc_ds1307 rtc; // define the real time clock object
// for the data logging shield, we use digital pin 10 for the sd cs line
const int chipselect = 10;
// the logging file
file logfile;
void error(char *str)
{
serial.print(“error: ”);
serial.println(str);
// red led indicates error
digitalwrite(redledpin, high);
while(1);
} rtc_ds1307 rtc; // define the real time clock object
// for the data logging shield, we use digital pin 10 for the sd cs line
const int chipselect = 10;
// the logging file
file logfile;
void error(char *str)
{
serial.print(“error: ”);
serial.println(str);
// red led indicates error
digitalwrite(redledpin, high);
while(1);
}
接下来,我们已经有了rtc的所有对象以及sd卡芯片选择引脚。对于我们所有的屏蔽,我们将 pin 10 用于sd卡芯片选择线
接下来是error()功能,这对我们来说只是一个快捷方式,我们在以下情况下使用它发生了一件非常糟糕的事情,例如我们无法写入sd卡或将其打开。它将错误输出到串行监视器,打开红色错误led,然后永远处于while(1);循环,也称为 halt
设置
下载:文件
复制代码
void setup(void)
{
serial.begin(9600);
serial.println();
#if wait_to_start
serial.println(“type any character to start”);
while (!serial.available());
#endif //wait_to_start
void setup(void)
{
serial.begin(9600);
serial.println();
#if wait_to_start
serial.println(“type any character to start”);
while (!serial.available());
#endif //wait_to_start
k现在我们进入代码。我们首先以9600波特初始化串口。如果我们将wait_to_start设置为除 0 之外的任何值,则arduino将等待直到用户键入内容为止。否则,它将进入下一部分
下载:文件
复制代码
// initialize the sd card
serial.print(“initializing sd card.。.”);
// make sure that the default chip select pin is set to
// output, even if you don’t use it:
pinmode(10, output);
// see if the card is present and can be initialized:
if (!sd.begin(chipselect)) {
serial.println(“card failed, or not present”);
// don‘t do anything more:
return;
}
serial.println(“card initialized.”);
// create a new file
char filename[] = “logger00.csv”;
for (uint8_t i = 0; i 《 100; i++) {
filename[6] = i/10 + ’0‘;
filename[7] = i%10 + ’0‘;
if (! sd.exists(filename)) {
// only open a new file if it doesn’t exist
logfile = sd.open(filename, file_write);
break; // leave the loop!
}
}
if (! logfile) {
error(“couldnt create file”);
}
serial.print(“logging to: ”);
serial.println(filename); // initialize the sd card
serial.print(“initializing sd card.。.”);
// make sure that the default chip select pin is set to
// output, even if you don‘t use it:
pinmode(10, output);
// see if the card is present and can be initialized:
if (!sd.begin(chipselect)) {
serial.println(“card failed, or not present”);
// don’t do anything more:
return;
}
serial.println(“card initialized.”);
// create a new file
char filename[] = “logger00.csv”;
for (uint8_t i = 0; i 《 100; i++) {
filename[6] = i/10 + ‘0’;
filename[7] = i%10 + ‘0’;
if (! sd.exists(filename)) {
// only open a new file if it doesn‘t exist
logfile = sd.open(filename, file_write);
break; // leave the loop!
}
}
if (! logfile) {
error(“couldnt create file”);
}
serial.print(“logging to: ”);
serial.println(filename);
现在代码开始与sd卡通信,它将尝试初始化sd卡并找到fat16/fat32分区。
接下来它将尝试创建日志文件。我们在这里做了一些棘手的事情,我们基本上希望将文件命名为 loggernn 。 csv ,其中 nn 是一个数字。通过开始尝试创建 logger00.csv 并在文件已经存在时每次递增,直到我们到达 logger99.csv ,我们基本上每次创建一个新文件arduino启动
要创建文件,我们使用一些unix风格的命令标志,您可以在logfile.open() 过程中看到这些标志。 file_write 表示创建文件并向其中写入数据。
假设我们成功创建了文件,则将名称打印到串行端口。
下载:文件
复制代码
wire.begin();
if (!rtc.begin()) {
logfile.println(“rtc failed”);
#if echo_to_serial
serial.println(“rtc failed”);
#endif //echo_to_serial
}
logfile.println(“millis,time,light,temp”);
#if echo_to_serial
serial.println(“millis,time,light,temp”);
#if echo_to_serial// attempt to write out the header to the file
if (logfile.writeerror || !logfile.sync()) {
error(“write header”);
}
pinmode(redledpin, output);
pinmode(greenledpin, output);
// if you want to set the aref to something other than 5v
//analogreference(external);
} wire.begin();
if (!rtc.begin()) {
logfile.println(“rtc failed”);
#if echo_to_serial
serial.println(“rtc failed”);
#endif //echo_to_serial
}
logfile.println(“millis,time,light,temp”);
#if echo_to_serial
serial.println(“millis,time,light,temp”);
#if echo_to_serial// attempt to write out the header to the file
if (logfile.writeerror || !logfile.sync()) {
error(“write header”);
}
pinmode(redledpin, output);
pinmode(greenledpin, output);
// if you want to set the aref to something other than 5v
//analogreference(external);
}
好的,我们在这里结束了。现在,我们通过初始化wire库开始rtc,并戳rtc以查看其是否还存在。
然后我们打印标题。标头是文件的第一行,可帮助您的电子表格或数学程序确定接下来要执行的操作。数据采用csv(逗号分隔值)格式,因此标头也是如此:“ millis,time,light,temp”第一项 millis 是自arduino启动以来的毫秒数,时间是rtc的时间和日期, light 是cds单元中的数据, temp 是读取的温度。
您将请注意,在每次调用 logfile.print()之后,我们都有#if echo_to_serial和匹配的 serial.print()调用,接着是#if echo_to_serial,这就是调试我们前面提到的输出。 logfile.print()调用是将数据写入sd卡上的文件的功能,其作用与 serial 版本非常相似。如果将 echo_to_serial 设置为顶部的 0 ,则看不到打印到串行终端的书面数据。
最后,我们将两个led引脚作为输出,因此我们可以使用它们与用户进行通信。有一条注释行用于设置模拟参考电压。此代码假定您将使用“默认”参考,该参考是芯片的vcc电压-在传统的arduino上这是5.0v。有时可以通过降低参考来获得更高的精度。但是,我们暂时将其保持简单!稍后,您可能要尝试一下。
主循环
现在进入循环,循环基本上重复执行以下操作:
等待直到下一次出现读(每秒说一次-取决于我们定义的内容)
询问当前时间和日期,以免rtc
将时间和日期记录到sd卡上
读取光电池和温度传感器
将这些读数记录到sd卡上
如果时间到,将数据同步到sd卡
时间戳
让我们看一下第一部分:
下载:文件
复制代码
void loop(void)
{
datetime now;
// delay for the amount of time we want between readings
delay((log_interval -1) - (millis() % log_interval));
digitalwrite(greenledpin, high);
// log milliseconds since starting
uint32_t m = millis();
logfile.print(m); // milliseconds since start
logfile.print(“, ”);
#if echo_to_serial
serial.print(m); // milliseconds since start
serial.print(“, ”);
#endif
// fetch the time
now = rtc.now();
// log time
logfile.print(now.get()); // seconds since 2000
logfile.print(“, ”);
logfile.print(now.year(), dec);
logfile.print(“/”);
logfile.print(now.month(), dec);
logfile.print(“/”);
logfile.print(now.day(), dec);
logfile.print(“ ”);
logfile.print(now.hour(), dec);
logfile.print(“:”);
logfile.print(now.minute(), dec);
logfile.print(“:”);
logfile.print(now.second(), dec);
#if echo_to_serial
serial.print(now.get()); // seconds since 2000
serial.print(“, ”);
serial.print(now.year(), dec);
serial.print(“/”);
serial.print(now.month(), dec);
serial.print(“/”);
serial.print(now.day(), dec);
serial.print(“ ”);
serial.print(now.hour(), dec);
serial.print(“:”);
serial.print(now.minute(), dec);
serial.print(“:”);
serial.print(now.second(), dec);
#endif //echo_to_serial
void loop(void)
{
datetime now;
// delay for the amount of time we want between readings
delay((log_interval -1) - (millis() % log_interval));
digitalwrite(greenledpin, high);
// log milliseconds since starting
uint32_t m = millis();
logfile.print(m); // milliseconds since start
logfile.print(“, ”);
#if echo_to_serial
serial.print(m); // milliseconds since start
serial.print(“, ”);
#endif
// fetch the time
now = rtc.now();
// log time
logfile.print(now.get()); // seconds since 2000
logfile.print(“, ”);
logfile.print(now.year(), dec);
logfile.print(“/”);
logfile.print(now.month(), dec);
logfile.print(“/”);
logfile.print(now.day(), dec);
logfile.print(“ ”);
logfile.print(now.hour(), dec);
logfile.print(“:”);
logfile.print(now.minute(), dec);
logfile.print(“:”);
logfile.print(now.second(), dec);
#if echo_to_serial
serial.print(now.get()); // seconds since 2000
serial.print(“, ”);
serial.print(now.year(), dec);
serial.print(“/”);
serial.print(now.month(), dec);
serial.print(“/”);
serial.print(now.day(), dec);
serial.print(“ ”);
serial.print(now.hour(), dec);
serial.print(“:”);
serial.print(now.minute(), dec);
serial.print(“:”);
serial.print(now.second(), dec);
#endif //echo_to_serial
第一个重要的事情是 delay()调用,这就是使arduino等待直到需要再次读取的原因。如果您还记得我们 #defined ,则两次读数之间的延迟为1000毫秒(1秒)。由于两次读取之间有更多延迟,因此我们可以使用更少的电量,而无法尽快填充存储卡。这基本上是一个折衷,您希望多久读取一次数据,但是对于基本的长期日志记录,每秒获取数据将导致大量数据!
然后我们打开绿色led,这对于告诉我们,是的,我们现在正在读取/写入数据。
接下来,我们调用 millis ()以获取“自arduino开启以来的时间”并将其记录到卡上。拥有它很方便-尤其是如果您最终不使用rtc时。
然后熟悉的 rtc.now()调用以获取时间快照。有了这些信息后,我们便可以使用电子表格可以轻松识别的时间戳记(自2000年以来的秒数)以及 yy/mm/dd hh:mm:ss 时间格式。我们两者都有,因为时间戳的好处是它会单调增加,而打印日期的好处是它的可读性
记录传感器数据
下一个是传感器记录代码
下载:文件
复制代码
int photocellreading = analogread(photocellpin);
delay(10);
int tempreading = analogread(temppin);
// converting that reading to voltage, for 3.3v arduino use 3.3
float voltage = (tempreading * 5.0) / 1024.0;
float temperaturec = (voltage - 0.5) * 100.0 ;
float temperaturef = (temperaturec * 9.0 / 5.0) + 32.0;
logfile.print(“, ”);
logfile.print(photocellreading);
logfile.print(“, ”);
logfile.println(temperaturef);
#if echo_to_serial
serial.print(“, ”);
serial.print(photocellreading);
serial.print(“, ”);
serial.println(temperaturef);
#endif //echo_to_serial
digitalwrite(greenledpin, low);
} int photocellreading = analogread(photocellpin);
delay(10);
int tempreading = analogread(temppin);
// converting that reading to voltage, for 3.3v arduino use 3.3
float voltage = (tempreading * 5.0) / 1024.0;
float temperaturec = (voltage - 0.5) * 100.0 ;
float temperaturef = (temperaturec * 9.0 / 5.0) + 32.0;
logfile.print(“, ”);
logfile.print(photocellreading);
logfile.print(“, ”);
logfile.println(temperaturef);
#if echo_to_serial
serial.print(“, ”);
serial.print(photocellreading);
serial.print(“, ”);
serial.println(temperaturef);
#endif //echo_to_serial
digitalwrite(greenledpin, low);
}
此代码非常简单,处理代码已从我们之前的教程中删除。然后我们只需将其打印()到卡上,并用逗号将两者分开即可
我们通过关闭绿色led指示灯完成
下载
文件 github上的
eaglecad pcb文件
adafruit fritzing库中的fritzing对象
修订版c原理图和构造打印
版本b原理图
点击放大
原始版本原理图
点击放大
特斯拉新型储能系统亮相PG&E
UPS设计工程的实施技术
光学技术搭配进阶传感器 VR沉浸式应用体验
在全球化时代为何华为要面临如此阵痛
固态电池能解决新能源汽车的续航问题吗
Adafruit数据记录仪防护板的说明
区块链是如何保护个人隐私的
96GHz毫米波雷达检测飞机跑道障碍物解决方案详解
输电线路导线舞动在线监测装置的作用是什么
大神确认华为P10指纹识别,为何小米5S中枪了呢?
小米或打响同股不同权第一枪,业界却称不一定赚钱
详谈平板电脑和笔记本电脑的区别
一个从程序员到IT工程师的故事
智慧城市:防涝排水物联网在线监测报警系统
谷歌Pixel 手机运行daydream VR也难逃发热问题的窘境
Mini LED屏幕供货紧缺致苹果新款ipad Pro预购推迟
莱迪思FPGA解决方案帮助降低可再生能源的成本
Keil MDK使用GCC编译器的方法
小米平板5详细配置、售价信息揭晓
客厅也能玩全景声影院?索尼回音壁HT-ST5000简评