0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Adafruit數(shù)據(jù)記錄儀防護(hù)板的說明

454398 ? 來源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2019-11-27 10:21 ? 次閱讀

概述

Adafruit數(shù)據(jù)記錄儀防護(hù)板的說明

這是一個方便的Arduino防護(hù)板:我們有很多人在尋找專用且設(shè)計良好的數(shù)據(jù)記錄防護(hù)板。我們努力設(shè)計出價格低廉但功能全面的設(shè)計。此防護(hù)罩可輕松為您的Arduino添加具有千兆字節(jié)存儲空間的“硬盤”!

此流行防護(hù)罩的最新版本具有流行原始防護(hù)罩的所有功能,并且與“ R3”兼容,因此您幾乎可以將其與任何Arduino或兼容產(chǎn)品一起使用。您可以在不到15分鐘的時間內(nèi)啟動并運(yùn)行它-將數(shù)據(jù)保存到任何FAT16或FAT32格式的SD卡上的文件中,以供任何繪圖,電子表格或分析程序讀取。本教程還將向您展示如何使用兩個免費(fèi)軟件程序來繪制數(shù)據(jù)。隨附的RTC(實時時鐘)可用于以當(dāng)前時間為所有數(shù)據(jù)添加時間戳,以便您確切地了解何時發(fā)生了什么!

數(shù)據(jù)記錄器是可靠,全面且通用的設(shè)計。它易于擴(kuò)展或修改,并得到在線文檔和庫的很好支持

功能:

SD卡接口可用于FAT16或FAT32格式的卡。內(nèi)置的3.3v電平轉(zhuǎn)換器電路使您可以超快地讀取或?qū)懭霐?shù)據(jù),并防止損壞SD卡

即使在拔下Arduino的情況下,實時時鐘(RTC)仍可以保持時間。紐扣電池備份可以持續(xù)多年

包含的庫以及用于SD和RTC的示例代碼,這意味著您可以快速上手

用于焊接連接器,電路或傳感器的原型區(qū)域。

li》

兩個可配置指示燈LED

板載3.3v穩(wěn)壓器既是可靠的參考電壓,又可可靠地運(yùn)行需要大量功率才能運(yùn)行的SD卡

使用“ R3布局”的I2CICSP/SPI端口,因此與各種Arduino和Arduino兼容產(chǎn)品兼容

在此新版本中,您可以將其與:

兼容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位)

當(dāng)然,您可以記錄任何您喜歡的東西,包括具有Arduino庫,串行數(shù)據(jù),位時序等等的數(shù)字傳感器!

安裝接頭連接器

Adafruit Data Logger防護(hù)板經(jīng)過測試,已組裝好所有組件和SD插槽,但是您仍然需要安裝接頭連接器,以便可以將其插入Arduino

,因為有兩個選項,所以我們不會預(yù)先組裝接頭!您可以使用普通的0.1英寸公頭(包括在屏蔽中)或Arduino Shield Stacking頭。這兩個選項還需要焊接一個2x3母頭。

帶公頭的組裝

大多數(shù)人都會對他與公頭的屏蔽罩組裝感到滿意。使用它們的好處是不要在項目的高度上添加任何東西,它們會建立良好的牢固連接。但是,您將無法在頂部堆疊另一個盾牌。權(quán)衡取舍!

翻轉(zhuǎn)并焊接另一側(cè)以及2x3接頭

將標(biāo)頭切成一定長度:

將標(biāo)頭條與在標(biāo)頭邊緣上的孔對齊屏蔽并切下標(biāo)題欄的4個部分以適合。

放置插頭:

將插頭部分(長針向下)插入Arduino/Metro的母頭中。另外,將2x3母頭插入USB另一側(cè)的相應(yīng)插針中。

放置防護(hù)罩:

將防護(hù)罩與排針對齊,然后按下。

然后焊接!

焊接每個引腳以確保良好的電接觸。有關(guān)焊接的技巧,請參閱《 Adafruit優(yōu)秀焊接指南》。

使用堆棧頭進(jìn)行組裝:堆棧頭為您的數(shù)據(jù)記錄儀提供了更大的靈活性。您可以將其與其他防護(hù)罩(例如RGB/LCD顯示器防護(hù)罩)結(jié)合使用,以使緊湊型測井儀具有用戶界面。您還可以將其與一個或多個Proto-Shield堆疊在一起,以增加更多的原型空間來與傳感器接口。

堆疊接頭安裝在板的頂部而不是底部,因此該過程與安裝簡單的公頭。

定位頭:

從屏蔽層頂部插入頁眉,然后將屏蔽層翻轉(zhuǎn)并將其放置在平坦的表面上。調(diào)整標(biāo)題以使其垂直。

請確保從屏蔽層的頂部插入插頭,以便可以將其與底部。

將板子放在Metro上并焊接2x3接頭

然后焊接!

將每個引腳焊接成固體電氣連接。

提示:從每個插頭部分焊接一個引腳。如果其中任何一個彎曲,只需重新加熱一個焊點并用手將其拉直即可。一旦所有接頭都直了,繼續(xù)焊接其余的引腳。

翻轉(zhuǎn)并焊接另一面

放置2x3母頭Arduino/Metro上的標(biāo)題

防護(hù)罩概述

數(shù)據(jù)記錄器防護(hù)罩有幾件事使其成為跟蹤數(shù)據(jù)的絕佳方法。這是盾牌的大致圖:

我們的最新版本為5V,3.3V和地面添加了電源軌:

div》 SD卡

大的SD卡夾可容納最大32G和最小32MB的SD/MMC存儲(任何格式的FAT16或FAT32)。如果您有MicroSD卡,則可以使用低成本的適配器SD卡比MicroSD更難丟失,并且有足夠的空間容納標(biāo)準(zhǔn)尺寸的存儲卡。

只需按一下即可插入,或拉出即可從該插槽中取出卡

SD活動LED 連接到時鐘引腳,當(dāng)數(shù)據(jù)經(jīng)過SPI時它將閃爍,這可以幫助您確定何時可以移除或插入SD卡或電源。

電平轉(zhuǎn)換器將所有信號從3.3V或5V DOW移動n至3.3V,因此您可以安全地將此屏蔽罩與 any Arduino一起使用,而不會損壞卡。便宜的屏蔽層使用電阻器進(jìn)行電平轉(zhuǎn)換,但這在高速或在所有電壓電平下均無法正常工作!

實時時鐘

這是計時設(shè)備。它包括一個8針芯片,一個矩形的32KHz晶體和一個電池座

電池座必須包含一個電池,以便RTC能夠跟蹤從Arduino斷開電源時的時間!使用任何與CR1220兼容的紐扣電池

CR1220 12mm直徑-3V鋰幣電池 strong》

產(chǎn)品ID:380

這些是最高質(zhì)量的產(chǎn)品。容量的電池,與iCufflinks,iNecklace,Datalogging和GPS Shields,GPS HAT等產(chǎn)品隨附的電池相同。每筆訂購一個電池。..

$ 0.95

入庫

添加到購物車

3.3V電源

板載3.3V LDO(低壓降)穩(wěn)壓器可保持屏蔽的3V零件運(yùn)行平穩(wěn)。一些舊的Arduinos沒有完整的3.3V穩(wěn)壓器,寫入SD卡可能會導(dǎo)致Arduino重新啟動。為了保持兼容性,我們只需將其保留在那里。右側(cè)還有一個綠色的PWR(電源)良好LED指示燈

用戶LED

我們有兩個用戶可配置的LED。將任何Arduino引腳上的電線連接到標(biāo)記有 L1 或 L2 的焊盤,并拉高以打開 LED1 或 LED2

LED右側(cè)的重置按鈕將重置整個Arduino,方便您在要重新啟動電路板時使用

原型開發(fā)區(qū)域

大的中間部分充滿了0.1“網(wǎng)格原型孔,因此您可以自定義您的

頂部和底部兩行原型孔是電源導(dǎo)軌。

突破墊

上面在分支板區(qū)域附近還顯示了一些額外的分支。

在SD卡持有者的右側(cè):

CD -這是SD卡上的卡檢測墊。將其接地后,將插入SD卡。它是漏極開路,使用上拉電阻(物理電阻或在軟件中啟用)

WP-這是SD卡上的寫保護(hù)板,您可以使用它來通過檢查此引腳來檢測卡上的寫保護(hù)選項卡。它是漏極開路,使用上拉電阻(物理電阻器或在軟件中啟用)

SQ -這是RTC的可選方波輸出。您必須發(fā)送命令將其打開,但這是選擇獲取精確方波的一種方法。我們主要將其用于測試。輸出是開漏輸出,因此具有上拉電阻(物理電阻或在軟件中啟用)

3V -這是穩(wěn)壓器輸出的3V。它是高質(zhì)量的3.3V參考電壓,您可能希望為傳感器供電。高達(dá)50mA可用

數(shù)字10號附近

CS -這是芯片選擇 SD卡的引腳。如果由于沖突而需要將跡線切割到引腳10,可以將該焊盤焊接到任何數(shù)字引腳上,并重新上載軟件

在數(shù)字3和#4附近 p》

L2 和 L1 -這些是可選的用戶LED。連接到任何數(shù)字引腳,將其拉高以打開相應(yīng)的LED。這些LED已經(jīng)串聯(lián)了470歐姆電阻。

接線和配置

從Datalogger屏蔽的B版本開始,我們不再使用數(shù)字引腳10、11、12、13用于SPI和A4,A5用于I2C?,F(xiàn)在,我們使用2x3 ICSP標(biāo)頭,這意味著您不需要特殊的自定義I2C或SPI庫即可與Mega,Leonardo或Zero(或其他任何將來的類型)的Arduino一起使用!

我具有哪個版本?

這是較舊的Datalogger屏蔽。特別要注意的是,原型區(qū)域完全充滿了0.1“間隔的孔

這是“與R3兼容”的數(shù)據(jù)記錄器。它具有較小的原型區(qū)域,并且在右側(cè)有一個2x3 SPI頭點

較舊的屏蔽插腳

在較舊的屏蔽上,插腳固定為固定 :

數(shù)字#13- SPI時鐘

數(shù)字#12- SPI MISO

數(shù)字#11- SPI MOSI

數(shù)字#10- SD卡芯片選擇(可以切割痕跡以重新分配)

SDA 已連接至 A4

SCL 已連接至 A5

RTC(DS13 07)I2C邏輯電平固定為5V

修訂版B屏蔽引腳排列

ICSP SCK- SPI時鐘

ICSP MISO- SPI MISO

ICSP MOSI- SPI MOSI

數(shù)字#10- SD卡芯片選擇(可以切割痕跡以重新分配)

SDA 不 連接到 A4

SCL not 連接到 A5

RTC(PCF8523)邏輯電平可以是3V或5V

在UNO上,請注意,數(shù)字#13與ICSP SCK相同,#12是ICSP MISO,#11是ICSP MOSI,SDA連接到A4,SCL連接到A5。但是,這僅適用于UNO!其他Arduino具有不同的連接。由于屏蔽不再假設(shè)它位于UNO上,因此它是最兼容的屏蔽。

在Rev B屏蔽的底部,您可以看到,如果您有一個較舊的Arduino,沒有ICSP 2x3接頭連接器,也沒有SDA/SCL引腳,則可以使焊接跳線短路。

如果您將屏蔽與3.3V邏輯Arduino配合使用,則可能需要更改 Vio 跳線。這就是I2C的10K上拉電阻。老實說,上拉非常弱,所以如果您忘記了,這沒什么大不了的。但是,如果可以的話,請在中心焊盤和5V之間切一條小線,然后焊接另一側(cè),以便將Vio連接到3V

較舊的數(shù)據(jù)記錄器Shield Leonardo&Mega Library

僅當(dāng)您有沒有SPI端口連接的較舊的Datalogger屏蔽。

僅當(dāng)您使用帶有舊版Datalogger防護(hù)罩的Leonardo或Mega時才需要!

如果您的屏蔽罩如上所示,并且在右側(cè)具有2x3引腳頭,請?zhí)^此頁面!

如果您的屏蔽罩沒有2x3引腳頭部分,并且您使用的是Mega或Leonardo(例如,不兼容UNO),那么您可以繼續(xù)閱讀!/p》

如果您使用的Leonardo或Mega帶有較舊的數(shù)據(jù)記錄屏蔽,則必須替換現(xiàn)有的SD卡庫以添加“任何引腳上的SD卡”支持。 如果您擁有Uno/Duemilanove/Diecimila,則不需要這樣做。如果您使用的是B版防護(hù)罩,那么也不需要這樣做!

首先,找到“核心庫”文件夾-如果您使用的是Windows或Linux,它將位于包含 Arduino 可執(zhí)行文件,查找 libraries 文件夾。在內(nèi)部,您會看到一個 SD 文件夾(其中將是 SD.cpp SD.h 等)

在庫文件夾中,新建一個名為 SDbackup 的文件夾。然后將 SD 文件夾拖到 SDbackup 中,這將“隱藏”舊的 SD 庫而不刪除它。 請注意,SDBackup必須位于庫文件夾的外部之外,以便有效地“隱藏” SD庫。

現(xiàn)在,我們將獲取新的SD庫,請訪問https://github。 com/adafruit/SD ,然后單擊 ZIP 下載按鈕,或單擊下面的按鈕

下載SD庫壓縮文件

解壓縮并重命名未壓縮的文件夾 SD 。檢查 SD 文件夾中是否包含 SD.cpp 和 SD.h

放置 SD 庫文件夾,即寫生簿庫文件夾。如果您是第一個庫,則可能需要創(chuàng)建庫子文件夾。有關(guān)如何安裝庫的更多詳細(xì)信息,請查看我們的超詳細(xì)教程,網(wǎng)址為http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use

使用Mega和Leonardo的SD庫因為Mega和Leonardo如果沒有相同的硬件SPI引腳分配,則需要指定將用于與卡進(jìn)行SPI通信的引腳。對于數(shù)據(jù)記錄器屏蔽,它們將是引腳10、11、12和13。在草圖中找到調(diào)用SD.begin()的位置(如下所示):

下載:文件

復(fù)制代碼

// 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)) {

并對其進(jìn)行更改,以添加這些引腳號,如下所示:

下載:文件

復(fù)制代碼

// 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草圖使用較低級別的庫直接與卡對話,因此調(diào)用card.init()而不是SD.begin()。

下載:file

復(fù)制代碼

// 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)) {

在調(diào)用card.init()時,必須更改調(diào)用以指定SPI引腳,如下所示:

下載:文件

復(fù)制代碼

// 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)) {

使用實時時鐘

是實時時鐘嗎?

記錄數(shù)據(jù)時,通常非常有用的是帶有時間戳記!這樣一來,您可以每隔一分鐘(通過檢查時鐘)或記錄一天中的什么時間記錄數(shù)據(jù)。

Arduino確實有一個稱為 millis()的內(nèi)置計時器。 ,并且該芯片還內(nèi)置了計時器,可以跟蹤更長的時間段,例如分鐘或幾天。那么,為什么要有單獨(dú)的RTC芯片呢?好吧,最大的原因是 millis()只跟蹤時間,因為Arduino上次通電是- ,這意味著何時通電打開后,毫秒計時器將設(shè)置為0。Arduino不知道它的“星期二”或“ 3月8日”,只能告訴我“自上次打開以來已經(jīng)過了14,000毫秒”。

好的,如果您想在Arduino上設(shè)置時間怎么辦?您必須編程日期和時間,從那時起您就可以算上它了。但是,如果失去電源,則必須重新設(shè)置時間。就像非常便宜的鬧鐘一樣:每次斷電時,它們都會閃爍 12:00

盡管某些項目可以使用這種基本的計時功能,但數(shù)據(jù)記錄器需要具有一致的計時功能,當(dāng)Arduino電池耗盡或重新編程時,計時不會重置。因此,我們包括一個單獨(dú)的RTC! RTC芯片是一種專門的芯片,可以跟蹤時間。它可以計算leap年,并且知道一個月中有多少天,但是它不考慮夏時制(因為它在不同的地方有所不同)

此圖顯示了具有實時功能的計算機(jī)主板時鐘稱為DS1387。

我們要使用的RTC是 PCF8523 或 DS1307 》。

如果您擁有Adafruit Datalogger Shield B版,則將使用PCF8523 -該RTC較DS1307更新且更好??匆幌缕帘握?,看看是否在芯片上方寫有 PCF8523 。

如果您使用的是較舊的Datalogger保護(hù)罩,則將使用DS1307 -沒有文本,因此您只需記住,如果不是 說是PCF8523,那就是DS1307

備用電池

只要有一個紐扣電池可以運(yùn)行,即使在

使用任何CR1220 3V鋰金屬紐扣電池:

CR1220直徑12毫米-3V鋰紐扣電池

產(chǎn)品ID:380

這些是最高質(zhì)量的產(chǎn)品,容量的電池,與iCufflinks,iNecklace,Datalogging和GPS Shields,GPS HAT等產(chǎn)品隨附的電池相同。每筆訂購一個電池。..

$ 0.95

入庫

添加到購物車

您必須安裝紐扣電池才能使RTC正常工作,如果沒有紐扣電池,它將表現(xiàn)得很奇怪,并可能在您嘗試使用Arduino時將其掛起,因此始終確保已安裝電池,即使電池沒電了。

RTC

RTC是一種i2c設(shè)備,這意味著它使用2條線進(jìn)行通信。這兩條線用于設(shè)置時間并進(jìn)行檢索。在Arduino UNO上,這些引腳還連接到模擬4 和 5 引腳。這有點煩人,因為我們當(dāng)然希望最多有6個模擬輸入來讀取數(shù)據(jù),而現(xiàn)在我們已經(jīng)丟失了2個。

對于RTC庫,我們將使用JeeLab卓越的分叉器可以在GitHub上找到RTC庫 。您可以通過訪問github存儲庫并手動下載來實現(xiàn)此目的,或者只需單擊此按鈕即可下載zip

下載RTC庫

重命名未壓縮的文件夾 RTClib ,并檢查 RTClib 文件夾是否包含 RTClib 。 cpp 和 RTClib 。h

將 RTClib 庫文件夾放在 arduinosketchfolder/libraries/文件夾。

如果您是第一個庫,則可能需要創(chuàng)建庫子文件夾。重新啟動IDE。

我們還提供了有關(guān)Arduino庫安裝的出色教程,網(wǎng)址為:

http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use

完成后,重新啟動IDE

第一次RTC測試

我們將演示的第一件事是一個測試草圖,它將每秒從RTC讀取一次時間。我們還將顯示如果您卸下電池并更換電池會發(fā)生什么,因為這會導(dǎo)致RTC停止。因此,要開始使用,請在未給Arduino供電或未將其插入USB的情況下從電池座中取出電池。等待3秒鐘,然后更換電池。這將重置RTC芯片。現(xiàn)在,為您的RTC加載匹配的草圖

對于Adafruit Datalogger盾牌版本B,打開示例-》 RTClib-》 pcf8523

較舊的Adafruit數(shù)據(jù)記錄器,請使用示例-》 RTClib-》 ds1307

在數(shù)據(jù)記錄器防護(hù)罩打開的情況下將其上傳到Arduino!

如果遇到問題,請確保運(yùn)行正確的示例! PCF8523和DS1307 RTC芯片不相同,因此它們有單獨(dú)的示例!

現(xiàn)在打開串行控制臺,并確保將波特率正確設(shè)置為 57600波特,您應(yīng)該會看到以下內(nèi)容:

每當(dāng)RTC芯片失去所有電源(包括備用電池)時,它將重置為較早的日期,并將時間報告為0:0:0或類似時間。 DS1307甚至不會數(shù)秒(已停止)。無論何時設(shè)置時間,這都會啟動時鐘的滴答聲。

因此,基本上,這里的結(jié)果是,您永遠(yuǎn)不要卸下電池您已設(shè)定時間。您不需要,電池座也非常貼合,因此除非面板被壓碎,否則電池不會“掉落”

設(shè)置時間

在加載了相同草圖的情況下,取消注釋以 RTC開頭的行。/strong》,例如:

下載:文件

復(fù)制代碼

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__)));

這行很可愛,它的作用是根據(jù)您使用的計算機(jī)獲取日期和時間(編譯時正確)代碼)并將其用于RTC編程。如果您的計算機(jī)時間設(shè)置不正確,則應(yīng)首先解決該問題。然后,您必須按上傳按鈕進(jìn)行編譯,然后立即上傳。如果您先編譯然后再上傳,則該時間將關(guān)閉時鐘。

然后打開“串行”監(jiān)視器窗口以顯示時間已設(shè)置

從現(xiàn)在開始,您不會必須再次設(shè)置時間:電池將使用5年或以上

讀取時間

現(xiàn)在,RTC快活了,我們想查詢一下時間。讓我們再次看一下草圖,看看如何完成

下載:文件

復(fù)制代碼

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獲取時間的方法幾乎只有一種,即調(diào)用 now(),此函數(shù)返回一個DateTime對象,該對象描述了調(diào)用 now()時的年,月,日,時,分和秒。

有一些RTC庫可以代替您調(diào)用 RTC.year()和 RTC.hour()之類的東西來獲取當(dāng)前的年份和小時。但是,存在一個問題,如果您碰巧在下一分鐘滾動之前在 3:14:59 詢問分鐘,然后在分鐘滾動之后詢問第二分鐘(所以在 3:15:00 ),您會看到時間為 3:14:00 ,該時間需要一分鐘。如果您以其他方式進(jìn)行操作,則可能會得到 3:15:59 -在另一方向上間隔一分鐘。

因為這不是特別不可能發(fā)生的情況-特別是如果您經(jīng)常查詢時間-我們會一次從RTC中獲取時間的“快照”,然后將其拆分為 day()或 second() (如上所示)。付出了更多的努力,但是我們認(rèn)為避免錯誤是值得的!

我們還可以通過調(diào)用 unixtime 來從DateTime對象中獲取“時間戳”,該計數(shù)會計數(shù)自1970年1月1日午夜以來的秒數(shù)(不計算leap秒)

下載:文件

復(fù)制代碼

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秒,因此我們可以輕松計算天數(shù)從那以后。當(dāng)您想要跟蹤自上次查詢以來已經(jīng)過去了多少時間,使一些數(shù)學(xué)變得容易得多時(例如檢查是否過了5分鐘,只需查看 unixtime()),這可能會很有用。增加了300,您不必?fù)?dān)心小時的變化)

使用SD卡

數(shù)據(jù)記錄器防護(hù)板的另一半是SD卡。 SD卡是我們存儲長期數(shù)據(jù)的方式。盡管Arduino芯片具有永久的EEPROM存儲,但只有幾百個字節(jié)-與2 gig SD卡相比很小。 SD卡非常便宜且易于獲得,它是長期存儲的明顯選擇,因此我們將其用作屏蔽。

SD卡不附帶屏蔽套件,但我們可以在其中隨身攜帶SD卡。保證工作的商店。幾乎所有SD卡都可以使用,但要注意一些廉價的卡是“假貨”,并且會引起頭痛。

4GB空白SD/MicroSD存儲卡

產(chǎn)品ID:102

使用此4GB micro-SD卡可以輕松添加大型存儲。它帶有SD適配器,因此您可以將其與我們的任何屏蔽罩或適配器一起使用!預(yù)格式化為FAT,因此無法使用。..

缺貨

缺貨

您還需要一種從SD卡進(jìn)行讀寫的方法。有時您可以使用相機(jī)和MP3播放器-插入相機(jī)后,您就可以將其視為磁盤。或者您可能需要SD卡讀卡器。 屏蔽 不 能夠?qū)D卡顯示為“硬盤”,例如某些MP3播放器或游戲,而Arduino沒有該硬件,因此您將需要一個外部讀取器!

USB MicroSD卡讀取器/寫入器-microSD/microSDHC/microSDXC

產(chǎn)品ID:939

這是最可愛的小型microSD卡讀/寫器-但不要被它的可愛性所迷惑!它速度快,可支持多達(dá)64 GB的SDXC卡!只需將卡滑入。..

$ 5.95

進(jìn)貨

添加到購物車

格式化在Windows/Mac操作系統(tǒng)

如果您購買了SD卡,則可能已經(jīng)使用FAT文件系統(tǒng)對其進(jìn)行了預(yù)格式化。但是,您可能對工廠格式化卡的方式有疑問,或者如果它是舊卡,則需要重新格式化。我們使用的Arduino SD庫支持 FAT16 和 FAT32 文件系統(tǒng)。如果您的SD卡非常小,例如說8-32 MB,您可能會發(fā)現(xiàn)它的格式為 FAT12 ,該格式不受支持。您必須重新格式化這些卡。無論哪種方式,即使使用新的總是格式化存儲卡的好主意!請注意,格式化會刪除卡,因此請先保存您想要的任何內(nèi)容

我們強(qiáng)烈建議您使用的是官方SD卡格式化程序?qū)嵱贸绦?由SD協(xié)會編寫,它解決了格式錯誤帶來的許多問題!

https上提供了官方SD格式化程序://www.sdcard.org/downloads/formatter_4/

下載并在您的計算機(jī)上運(yùn)行,該頁面上還有一個手冊鏈接供使用

下載適用于Windows的官方SD Formatter軟件

獲取卡信息

Arduino SD卡庫有一個內(nèi)置示例,可以幫助您測試屏蔽和連接

如果您使用的是較舊的沒有SPI頭連接的數(shù)據(jù)記錄屏蔽 ,并且您使用的是 Leonardo,Mega 或UNO以外的任何其他產(chǎn)品,則需要安裝規(guī)格SD庫的正式版本

在 SD 庫中打開文件 CardInfo 示例草圖:

該草圖不會向卡中寫入任何數(shù)據(jù),只會告訴您它是否能夠識別它,以及一些有關(guān)它的信息。嘗試確定是否支持SD卡時,這可能非常有用。在試用新卡之前,請先試用此草圖!

轉(zhuǎn)到草圖的開頭,并確保 chipSelect 行正確,這是因為數(shù)據(jù)記錄器屏蔽了我們的‘重新使用數(shù)字引腳10,因此將其更改為10!

如果您具有Datalogger Shield的pre-reB版本,并且您正在使用Mega或Leonardo,請在此處進(jìn)行檢查以調(diào)整引腳設(shè)置

好的,現(xiàn)在將SD卡插入Arduino并上傳草圖

打開串行監(jiān)視器,并在出現(xiàn)提示時在文本框中鍵入一個字符(并點擊發(fā)送)。您可能會得到類似以下的內(nèi)容:

它主要是亂碼,但查看卷類型為FAT16 部分以及卡的大?。ù蠹s2 GB,這應(yīng)該是有用的)很有用是)等。

如果您的卡片質(zhì)量較差(好品牌的盜版版本似乎更多),您可能會看到:

卡大部分響應(yīng),但是數(shù)據(jù)都很差。請注意,產(chǎn)品ID 為“不適用” ,并且沒有制造商ID 或 OEM ID 。該卡返回了一些SD錯誤。它基本上是一個壞場景,我只保留這張卡作為壞卡的例子!如果您收到類似這樣的消息(有響應(yīng)但它已損壞),則應(yīng)該扔掉卡

最后,嘗試取出SD卡并再次運(yùn)行草圖,您將得到以下內(nèi)容,

它甚至無法初始化SD卡。如果出現(xiàn)焊接錯誤或卡確實損壞

,也可能發(fā)生這種情況。如果您遇到SD卡問題,建議您使用上述SD格式化器首先確??ㄇ鍧嵅⒖梢允褂?!

光和溫度記錄器

簡介

已經(jīng)介紹了RTC和SD卡,并驗證了它們是否可以正常工作,我們可以繼續(xù)進(jìn)行日志記錄!

我們將使用一個非常好的詳細(xì)演示來展示這些最出色的數(shù)據(jù)的功能。測井屏蔽:我們將記錄溫度和相對光照水平,以確定:

隨著壓縮機(jī)的開啟和關(guān)閉,冰箱中的溫度變化多少?

保持門打開是否會導(dǎo)致溫度大幅下降?冷卻需要多長時間?

真的里面的燈在關(guān)門時會熄滅嗎?

構(gòu)建它!

您的項目會需要:

Arduino(當(dāng)然?。┳詈檬茿tmega328類型的-我們始終建議使用正式的“經(jīng)典” Arduino,例如Uno。

Adafruit數(shù)據(jù)記錄器防護(hù)罩-組裝的

SD卡,已格式化為FAT,并使用示例草圖進(jìn)行了測試

CdS光電管和匹配的10K下拉電阻

溫度傳感器,具有模擬輸出,例如TMP36

電池組,例如6-AA’brick‘和2.1mm DC插孔。

或,您可以將9V夾子用于一個電源,但一個9V供電的記錄儀將僅持續(xù)幾個小時,因此我們建議使用6xAA的

一些22 AWG導(dǎo)線,烙鐵,焊料等。

您可以在Adafruit商店中以折扣價獲得該列表中的大部分商品!

i》

rs

我們將使用兩個基本傳感器來記錄數(shù)據(jù),一個CdS光電管來跟蹤光(這將告訴我們門何時打開),以及一個半導(dǎo)體溫度傳感器來記錄冰箱的周圍溫度。

我們的站點上針對這些傳感器有兩個很棒的教程,如果您以前從未使用過它們或需要一些刷新,請立即閱讀!

Photocell教程

TMP36教程

我們將如下圖所示對傳感器進(jìn)行接線。

請注意,我們連接了 ARef,溫度傳感器的電源引腳和 3.3V 不是5.0V 的光傳感器-我們這樣做是因為5V線路噪聲很大,而3.3V穩(wěn)壓器是更好地過濾。在實際的電路板上,我們使用了數(shù)據(jù)記錄器穩(wěn)壓器提供的3.3V線,請參見下圖-理論上與Arduino相同,但我們更信任我們。

接線板上的原型區(qū)域是帶有焊墊的簡單孔陣列。下面的步驟說明了我們?nèi)绾螛?gòu)建此電路,并說明了一些基本的電路原型技術(shù)。為了清楚起見,我們將使用與上面電路圖中所示相同的色線:

傳感器的位置傳感器可以放置在原型區(qū)域的任何位置,但是我們選擇這種布置以簡化組件之間的連接。

準(zhǔn)備一些跳線測量一根電線(紅色)的長度足以從3v插孔延伸到溫度傳感器上方的1/2英寸處。從一端剝?nèi)ゴ蠹s3/4英寸,從另一端剝?nèi)ゴ蠹s1/4英寸。

測量另一端(黃色)從AREF引腳到達(dá)兩個傳感器之間的孔的長度足夠長。一端剝?nèi)?/2英寸,另一端剝?nèi)?/4英寸。

安裝跳線如圖所示放置跳線,長條形的末端靠近傳感器。

由于在原型制作區(qū)域的孔之間沒有信號跡線,因此我們將使用長的剝?nèi)サ哪┒藖磉B接電路板上組件的支腳。

建立連接

將第一個跳線(紅色)焊接到3v孔中。

彎曲電線的剝皮末端,使其緊靠光傳感器,溫度傳感器和AREF跳線的末端。

將傳感器支腳和AREF支腳折疊在3v跳線上并焊接以形成連接。

為傳感器添加更多跳線

從模擬引腳0到光傳感器和電阻器附近的孔。 (白色)

從GND到電阻另一端旁邊的孔(黑色)

從模擬引腳1到電阻旁邊的孔。溫度傳感器的中心引腳(綠色)

以及LED指示燈

從L1到數(shù)字引腳2(黃色)

從L2到數(shù)字引腳3(黃色)

焊接并修剪所有內(nèi)容連接使用相同的方法將組件支腿折疊在跳線上-進(jìn)行所有連接,如接線圖所示。

確保所有連接均已焊接。還要將電線和組件腳焊接到穿過孔的板上。

準(zhǔn)備電池組

將連接器上的黑色塑料套圈放在電池組電線上。

將紅色電線從電池組焊接到中心銷

將黑色電線焊接到外部槍管。

壓接以牢固地保持電線

擰緊黑色塑料套圈

現(xiàn)在,您的Light Temp Logger已連接好并可以進(jìn)行測試了!/div》

使用它!

Sensor test

我們現(xiàn)在將使用此草圖來測試傳感器,這是本教程中兩個示例的混搭

下載:文件

復(fù)制代碼

#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);

}

確定上傳此草圖,然后再次檢查串行監(jiān)視器

在我的工作室中,我的溫度約為24攝氏度,“光度”約為400-請記住,盡管溫度傳感器以C或F給出“絕對”讀數(shù),但光傳感器為

一旦您確認(rèn)傳感器已正確連接并運(yùn)行其時間來記錄日志,就無法精確地給出讀數(shù)!

測井草圖

從Git下載光和溫度測井草圖轂。插入SD卡。

在該部分的草圖頂部查找,并取消注釋任何相關(guān)的行。如果您不確定自己擁有哪一個,請查看RTC頁面以獲取詳細(xì)信息。

下載:文件

復(fù)制代碼

/************** 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。現(xiàn)在,我們將在仍“綁定”到計算機(jī)上的情況下對其進(jìn)行測試

在Arduno仍保持連接,閃爍并通電的情況下,將您的手放在光電管上幾秒鐘,然后將閃光燈照在它上面。您還應(yīng)該用手指擠壓溫度傳感器以對其加熱

使用電子表格繪制

當(dāng)您準(zhǔn)備檢查數(shù)據(jù)時,請拔下Arduino并將SD卡放入計算機(jī)的讀卡器中。您將至少看到一個文件,或者可能是幾個文件,每次記錄器最終運(yùn)行時都一個文件

我們將打開最新的一個。如果要使用圖形演示中使用的相同日志文件,請單擊此處下載。

查看數(shù)據(jù)的最快方法是使用OpenOffice或Excel之類的文件,您可以在其中打開.csv文件并將其直接導(dǎo)入電子表格

然后您可以通過選擇數(shù)據(jù)列來執(zhí)行一些繪圖操作

點擊圖表 按鈕并使用線條(我們認(rèn)為它們最適合此類圖表)

設(shè)置第一列作為標(biāo)簽

這將生成此圖

您可以清楚地看到我如何遮蔽傳感器,然后在其上照手電筒。

您可以使圖形顯示兩者都具有不同的軸(因為溫度變化是一組不同的單位。選擇臨時線(紅色),右鍵單擊并選擇格式化數(shù)據(jù)系列。在選項標(biāo)簽中,將數(shù)據(jù)系列與次要Y軸對齊。

或者您也可以僅使用 temp 數(shù)據(jù)

現(xiàn)在可以清楚地看到如何通過將其握在手指之間來對其進(jìn)行加熱

使用Gnuplot

Gnuplot是一個免費(fèi)的(但不是開源的?)超強(qiáng)大的繪圖程序。使用起來也很痛苦!但是,如果您買不起Mathematica或Matlab等專業(yè)的數(shù)學(xué)/繪圖軟件包,則Gnuplot可以做很多!

我們不足以提供有關(guān)gnuplot的完整教程,這里有一些我們發(fā)現(xiàn)方便的鏈接。 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/

我們發(fā)現(xiàn)按順序執(zhí)行以下命令將生成此數(shù)據(jù)的漂亮圖形,請確保將LOGTEST.CSV與 wgnuplot.exe 放在同一目錄中(或者,如果您知道如何引用目錄,則可以可以放在其他位置)

下載:文件

復(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)”

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軸刻度!您也可以輕松放大內(nèi)容。

其他繪圖儀

我們的朋友約翰還建議將Live-Graph作為免費(fèi)的繪圖程序-我們還沒有嘗試過,但是如果您需要進(jìn)行大量繪圖,它值得一看!/p》

便攜式日志記錄

當(dāng)然,有一個數(shù)據(jù)記錄器鏈接到臺式計算機(jī)并不是那么方便。我們可以通過增加電池組來制造便攜式記錄儀。獲得大量電量的最便宜方法是使用6節(jié)AA電池。我在這里用可充電電池和6xAA電池座制作了一個。它每秒運(yùn)行Arduino日志一次,持續(xù)18.5小時。如果您使用堿,則可以輕松獲得24小時或更長時間。

冰箱日志記錄

準(zhǔn)備好我的便攜式記錄儀之后,該做一些冰箱Loggin了!兩者都放在冰箱的中間架子中央。

我將其放置在晚上10點左右,然后第二天中午將其移除。如果您沒有冰箱,則可以從此zip文件中獲取數(shù)據(jù)并使用它。

以下是記錄的數(shù)據(jù):

您可以在中間看到并結(jié)束溫度和光照水平很高,因為記錄儀在冰箱外面。綠線是溫度,因此您可以看到溫度緩慢升高,然后每半小時左右啟動壓縮機(jī)。紅線表示門何時打開。今晚比平常更殘酷!

在大約12:40 AM放大圖,我們可以看到門打開時溫度是如何上升的,即使在幾秒鐘內(nèi)溫度也可以很快上升4度!

結(jié)論!

好的,這是一個詳細(xì)的項目,但是它是測試數(shù)據(jù)記錄的一個好項目的能力,尤其是因為它更難以修復(fù)現(xiàn)場的錯誤。通常,我們建議嘗試其他傳感器,并在可能的情況下在家進(jìn)行測試。記錄比所需更多的數(shù)據(jù),并使用軟件程序過濾不需要的內(nèi)容也是一個好主意。例如,我們不使用VCC日志,但是如果您的傳感器行為異常,它可能會為您提供電池壽命是否在影響它的線索。

代碼演練

簡介

這是“光和溫度記錄”草圖的演練。它冗長而詳盡,因此我們將其放在此處以供您細(xì)讀。我們強(qiáng)烈建議您仔細(xì)閱讀它,該代碼具有非常多的用途,并且我們的文字描述應(yīng)清楚說明其中為什么存在所有內(nèi)容!

在此處下載完整文件:

包含并定義

下載:文件

復(fù)制代碼

#include “SD.h”

#include

#include “RTClib.h” #include “SD.h”

#include

#include “RTClib.h”

確定這是文件的頂部,其中我們包括三個將要使用的庫:用于與卡對話的 SD 庫,可幫助Arduino的 Wire 庫使用i2c和 RTClib 與實時時鐘聊天

下載:文件

復(fù)制代碼

// 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

接下來都是“定義” -常量和可調(diào)整項。

LOG_INTERVAL是傳感器讀數(shù)之間的毫秒數(shù)。 1000是1秒,這不是一個不好的起點。

ECHO_TO_SERIA L確定是否將寫入卡的內(nèi)容也發(fā)送到串行監(jiān)視器。這會使記錄器更加緩慢,您可能需要串行監(jiān)視器來查看其他內(nèi)容。另一方面,它的使用很有用。我們將其設(shè)置為 1 以保持打開狀態(tài)。將其設(shè)置為 0 將其關(guān)閉

WAIT_TO_START意味著您必須向Arduino的串行端口發(fā)送一個字符才能啟動記錄。如果您啟用了此功能,則基本上無法使其脫離計算機(jī),因此我們暫時將其保持關(guān)閉狀態(tài)(設(shè)置為 0 )。如果要打開它,請將其設(shè)置為 1

其他定義更容易理解,因為它們只是引腳定義

redLEDpin是您連接到記錄儀護(hù)罩上紅色LED的一切

greenLEDpin是您連接到記錄儀護(hù)罩上綠色LED的一切

photocellPin是CdS單元連接到的模擬輸入

tempPin是TMP36連接到的模擬輸入

對象和錯誤()

下載:文件

復(fù)制代碼

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);

}

接下來,我們已經(jīng)有了RTC的所有對象以及SD卡芯片選擇引腳。對于我們所有的屏蔽,我們將 pin 10 用于SD卡芯片選擇線

接下來是error()功能,這對我們來說只是一個快捷方式,我們在以下情況下使用它發(fā)生了一件非常糟糕的事情,例如我們無法寫入SD卡或?qū)⑵浯蜷_。它將錯誤輸出到串行監(jiān)視器,打開紅色錯誤LED,然后永遠(yuǎn)處于while(1);循環(huán),也稱為 halt

設(shè)置

下載:文件

復(fù)制代碼

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現(xiàn)在我們進(jìn)入代碼。我們首先以9600波特初始化串口。如果我們將WAIT_TO_START設(shè)置為除 0 之外的任何值,則Arduino將等待直到用戶鍵入內(nèi)容為止。否則,它將進(jìn)入下一部分

下載:文件

復(fù)制代碼

// 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);

現(xiàn)在代碼開始與SD卡通信,它將嘗試初始化SD卡并找到FAT16/FAT32分區(qū)。

接下來它將嘗試創(chuàng)建日志文件。我們在這里做了一些棘手的事情,我們基本上希望將文件命名為 LOGGERnn 。 csv ,其中 nn 是一個數(shù)字。通過開始嘗試創(chuàng)建 LOGGER00.CSV 并在文件已經(jīng)存在時每次遞增,直到我們到達(dá) LOGGER99.csv ,我們基本上每次創(chuàng)建一個新文件Arduino啟動

要創(chuàng)建文件,我們使用一些Unix風(fēng)格的命令標(biāo)志,您可以在logfile.open() 過程中看到這些標(biāo)志。 FILE_WRITE 表示創(chuàng)建文件并向其中寫入數(shù)據(jù)。

假設(shè)我們成功創(chuàng)建了文件,則將名稱打印到串行端口。

下載:文件

復(fù)制代碼

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);

}

好的,我們在這里結(jié)束了。現(xiàn)在,我們通過初始化Wire庫開始RTC,并戳RTC以查看其是否還存在。

然后我們打印標(biāo)題。標(biāo)頭是文件的第一行,可幫助您的電子表格或數(shù)學(xué)程序確定接下來要執(zhí)行的操作。數(shù)據(jù)采用CSV(逗號分隔值)格式,因此標(biāo)頭也是如此:“ millis,time,light,temp”第一項 millis 是自Arduino啟動以來的毫秒數(shù),時間是RTC的時間和日期, light 是CdS單元中的數(shù)據(jù), temp 是讀取的溫度。

您將請注意,在每次調(diào)用 logfile.print()之后,我們都有#if ECHO_TO_SERIAL和匹配的 Serial.print()調(diào)用,接著是#if ECHO_TO_SERIAL,這就是調(diào)試我們前面提到的輸出。 logfile.print()調(diào)用是將數(shù)據(jù)寫入SD卡上的文件的功能,其作用與 Serial 版本非常相似。如果將 ECHO_TO_SERIAL 設(shè)置為頂部的 0 ,則看不到打印到串行終端的書面數(shù)據(jù)。

最后,我們將兩個LED引腳作為輸出,因此我們可以使用它們與用戶進(jìn)行通信。有一條注釋行用于設(shè)置模擬參考電壓。此代碼假定您將使用“默認(rèn)”參考,該參考是芯片的VCC電壓-在傳統(tǒng)的Arduino上這是5.0V。有時可以通過降低參考來獲得更高的精度。但是,我們暫時將其保持簡單!稍后,您可能要嘗試一下。

主循環(huán)

現(xiàn)在進(jìn)入循環(huán),循環(huán)基本上重復(fù)執(zhí)行以下操作:

等待直到下一次出現(xiàn)讀(每秒說一次-取決于我們定義的內(nèi)容)

詢問當(dāng)前時間和日期,以免RTC

將時間和日期記錄到SD卡上

讀取光電池和溫度傳感器

將這些讀數(shù)記錄到SD卡上

如果時間到,將數(shù)據(jù)同步到SD卡

時間戳

讓我們看一下第一部分:

下載:文件

復(fù)制代碼

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()調(diào)用,這就是使Arduino等待直到需要再次讀取的原因。如果您還記得我們 #defined ,則兩次讀數(shù)之間的延遲為1000毫秒(1秒)。由于兩次讀取之間有更多延遲,因此我們可以使用更少的電量,而無法盡快填充存儲卡。這基本上是一個折衷,您希望多久讀取一次數(shù)據(jù),但是對于基本的長期日志記錄,每秒獲取數(shù)據(jù)將導(dǎo)致大量數(shù)據(jù)!

然后我們打開綠色LED,這對于告訴我們,是的,我們現(xiàn)在正在讀取/寫入數(shù)據(jù)。

接下來,我們調(diào)用 millis ()以獲取“自arduino開啟以來的時間”并將其記錄到卡上。擁有它很方便-尤其是如果您最終不使用RTC時。

然后熟悉的 RTC.now()調(diào)用以獲取時間快照。有了這些信息后,我們便可以使用電子表格可以輕松識別的時間戳記(自2000年以來的秒數(shù))以及 YY/MM/DD HH:MM:SS 時間格式。我們兩者都有,因為時間戳的好處是它會單調(diào)增加,而打印日期的好處是它的可讀性

記錄傳感器數(shù)據(jù)

下一個是傳感器記錄代碼

下載:文件

復(fù)制代碼

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);

}

此代碼非常簡單,處理代碼已從我們之前的教程中刪除。然后我們只需將其打?。ǎ┑娇ㄉ?,并用逗號將兩者分開即可

我們通過關(guān)閉綠色LED指示燈完成

下載

文件 GitHub上的

EagleCAD PCB文件

Adafruit Fritzing庫中的Fritzing對象

修訂版C原理圖和構(gòu)造打印

版本B原理圖

點擊放大

原始版本原理圖

點擊放大

責(zé)任編輯:wv

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6455

    瀏覽量

    186388
收藏 人收藏

    評論

    相關(guān)推薦

    行車記錄儀CCC認(rèn)證的必要性分析

    行車記錄儀需要申請CCC認(rèn)證嗎?作為每臺需要正式上路的汽車來說,行車記錄儀是必備的車載產(chǎn)品,因此行車記錄儀再投入到每臺車進(jìn)行使用時都需要需要申請CCC認(rèn)證。以下英利檢測整合收集的一些是于行車
    的頭像 發(fā)表于 07-05 16:25 ?295次閱讀
    行車<b class='flag-5'>記錄儀</b>CCC認(rèn)證的必要性分析

    CAN總線數(shù)據(jù)記錄儀選型指南

    CAN總線數(shù)據(jù)記錄儀擁有多種型號和強(qiáng)大的功能,滿足了不同行業(yè)、不同場景下的數(shù)據(jù)記錄需求。今天,我們將針對Influx以及Kvaser兩個品牌的記錄儀
    的頭像 發(fā)表于 05-24 17:08 ?438次閱讀
    CAN總線<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>記錄儀</b>選型指南

    記錄儀定制_基于MT6762的音視頻記錄儀解決方案

    搭載聯(lián)發(fā)科MT6762新一代12納米高性能芯片的音視頻記錄儀,搭載了8核處理器和支持H.264高保真視頻編碼的芯片,使得這些記錄儀具備了出色的運(yùn)算和處理能力。無論是處理復(fù)雜的現(xiàn)場圖片還是進(jìn)行視頻快速運(yùn)算處理,都能夠記錄整個事件過
    的頭像 發(fā)表于 05-16 19:57 ?295次閱讀
    <b class='flag-5'>記錄儀</b>定制_基于MT6762的音視頻<b class='flag-5'>記錄儀</b>解決方案

    4G,5G執(zhí)法記錄儀人臉識別、人臉比對使用說明

    4G,5G執(zhí)法記錄儀人臉識別、人臉比對使用說明
    的頭像 發(fā)表于 05-13 17:41 ?852次閱讀
    4G,5G執(zhí)法<b class='flag-5'>記錄儀</b>人臉識別、人臉比對使用<b class='flag-5'>說明</b>

    數(shù)據(jù)記錄儀的選購知識介紹

    數(shù)據(jù)記錄儀是一種功能強(qiáng)大的小型自動電子測量設(shè)備。它們廣泛用于各種專業(yè)數(shù)據(jù)采樣和分析任務(wù),可以讓用戶捕獲特定環(huán)境或過程中的各類信息,或者在長時間范圍內(nèi)遠(yuǎn)程收集信息。
    發(fā)表于 04-24 10:34 ?166次閱讀

    4G執(zhí)法記錄儀,5G執(zhí)法記錄儀

    4G執(zhí)法記錄儀,5G執(zhí)法記錄儀系統(tǒng)設(shè)計
    的頭像 發(fā)表于 04-14 17:08 ?620次閱讀
    4G執(zhí)法<b class='flag-5'>記錄儀</b>,5G執(zhí)法<b class='flag-5'>記錄儀</b>

    無線數(shù)據(jù)記錄儀與傳統(tǒng)有線熱電偶系統(tǒng)的對比優(yōu)勢

    在過去的10-15年中,無線數(shù)據(jù)記錄系統(tǒng)逐漸取代了熱電偶系統(tǒng),用于食品、醫(yī)療和制藥行業(yè)的驗證。過去,使用記錄儀的一個主要缺點是在研究過程中缺乏實時數(shù)據(jù),但由于虹科EllabSKY選項可
    的頭像 發(fā)表于 03-08 08:04 ?619次閱讀
    無線<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>記錄儀</b>與傳統(tǒng)有線熱電偶系統(tǒng)的對比優(yōu)勢

    如何選擇CAN總線數(shù)據(jù)記錄儀 Kvaser Memorator Pro 5xHS

    什么是CAN總線數(shù)據(jù)記錄儀? CAN總線數(shù)據(jù)記錄儀是一種用于記錄CAN總線數(shù)據(jù)的設(shè)備。它通過CA
    的頭像 發(fā)表于 03-04 16:35 ?493次閱讀
    如何選擇CAN總線<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>記錄儀</b>  Kvaser Memorator Pro 5xHS

    溫濕度記錄儀HG-01

    溫濕度記錄儀HG-01說明
    發(fā)表于 01-24 10:05 ?0次下載

    車輛數(shù)據(jù)記錄儀 | GL系列產(chǎn)品

    面對車輛開發(fā)周期的不斷縮短、項目的快速迭代和新能源車輛的滲透,工程師對于車輛在實驗室、場地和道路試驗的數(shù)據(jù)記錄提出了更多的要求。數(shù)據(jù)記錄儀需要有滿足用戶試驗的諸多需求,例如不同的車輛總
    的頭像 發(fā)表于 12-28 08:25 ?679次閱讀
    車輛<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>記錄儀</b> | GL系列產(chǎn)品

    GL記錄儀及配置工具

    GLLogger(以下簡稱GL)是一種特殊的汽車數(shù)據(jù)記錄儀,被廣泛應(yīng)用于路試或臺架測試,該系列記錄儀支持CAN/CANFD、LIN、FlexRay以及車載以太網(wǎng)總線的數(shù)據(jù)
    的頭像 發(fā)表于 12-28 08:25 ?656次閱讀
    GL<b class='flag-5'>記錄儀</b>及配置工具

    can記錄儀使用時如何應(yīng)對震動問題?

    在使用CAN記錄儀時,如果面臨震動問題,可以采取以下一些方法來應(yīng)對: (1)選擇合適的記錄儀:選擇具有良好抗震性能的CAN記錄儀。一些記錄儀可能具有防震設(shè)計,如內(nèi)部防震結(jié)構(gòu)、防震橡膠墊
    的頭像 發(fā)表于 11-28 08:45 ?493次閱讀

    DIALOG 數(shù)據(jù)記錄儀配置工具及數(shù)據(jù)分析軟件

    強(qiáng)大的 Rebel 數(shù)據(jù)記錄儀配置工具。支持 Rebel 系列所有記錄儀所需的配置功能。同時可獲取記錄數(shù)據(jù),并對
    的頭像 發(fā)表于 11-22 11:48 ?597次閱讀
    DIALOG <b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>記錄儀</b>配置工具及<b class='flag-5'>數(shù)據(jù)</b>分析軟件

    燃?xì)鈹?shù)字壓力記錄儀的設(shè)計及應(yīng)用

    介紹了SZYJ-01燃?xì)鈹?shù)字壓力記錄儀的結(jié)構(gòu)、工作原理、主要技術(shù)參數(shù)、軟硬件設(shè)計及應(yīng)用事項,為該類壓力記錄儀的設(shè)計提供了思路。
    的頭像 發(fā)表于 11-15 15:59 ?593次閱讀
    燃?xì)鈹?shù)字壓力<b class='flag-5'>記錄儀</b>的設(shè)計及應(yīng)用

    TP700多通道數(shù)據(jù)記錄儀應(yīng)用案例

    記錄儀的0~5V/0~10V信號接入控制輸出電源,將模擬量可調(diào)電源的輸出接入溫控箱的加熱器。TP700多通道數(shù)據(jù)記錄儀可以設(shè)置一個溫度值,通過采集到的溫度大小控制電源輸出的電壓大小從而控制箱體溫度的加熱。
    發(fā)表于 11-06 16:07 ?438次閱讀
    TP700多通道<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>記錄儀</b>應(yīng)用案例