概述
這是一個方便的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上的標題
防護罩概述
數據記錄器防護罩有幾件事使其成為跟蹤數據的絕佳方法。這是盾牌的大致圖:
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》
我們將使用兩個基本傳感器來記錄數據,一個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原理圖
點擊放大
原始版本原理圖
點擊放大
責任編輯:wv
-
Arduino
+關注
關注
187文章
6464瀏覽量
186681
發布評論請先 登錄
相關推薦
評論