步驟1:解碼無線信號
這是最大的障礙,我必須將這一階段的全部功勞交給JeeLabs的Dominique Pierre,我使用了該代碼(在Dominique的支持下)對我的所有傳感器進行了解碼。測試硬件很簡單(并在JeeLabs網(wǎng)站上進行了說明)。這里要注意的一點是,最初我使用的是Arduino UNO,但是(如后所述)我轉(zhuǎn)到了MEGA。出于測試和解碼目的,任何一個都可以使用,我強烈建議您執(zhí)行此步驟,然后再進行其他操作,以便您可以識別和驗證接收到的信號是否來自傳感器,并可以對其進行解釋。我使用了一個簡單的Excel電子表格來手動驗證解碼的信號并在開始任何氣象站編碼之前計算出校驗和。
步驟2:硬件
除了RF無線電接收器外,我還使用了RTC –您可以使用以太網(wǎng)屏蔽和NTP,但是我覺得重點在于應(yīng)該是日志記錄而不是Internet/服務(wù)器端,如果使用RTC時網(wǎng)絡(luò)中斷,則可以“離線”完成。我也為一個傳感器有限的朋友構(gòu)建了該項目的變體,因此包括一個“車載”壓力和溫度傳感器。您所使用的取決于您自己,稍后我會提供所有元素的示例代碼。該示意圖提供了已使用硬件的概述。我在Fritzing中構(gòu)建,還創(chuàng)建了一個“ mini Shield”,該插槽插入MEGA的“端”,以太網(wǎng)屏蔽即在該端完成(如圖中的白色所示)。該“防護罩”包括可選件的腳印和一些將來可選件的突圍針。已嘗試/測試的組合包括:
?用于Oregon Scientific傳感器的RF接收器和RTC
?用于Cresta傳感器,RTC和BMP085氣壓/溫度傳感器的RF接收器
?外部LM35溫度傳感器(防水和測量以及我們花園中溪流的溫度)和外部溪流深度監(jiān)控器(此處未詳細說明,但使用安裝在橋上的I2C超聲波測距儀來評估溪流的高度–有趣的是,大雨時深度可能在30cm到150cm之間變化! )。但是,任何組合都可以使用,并且可以將代碼修改為適當(dāng)?shù)娜罩?Web服務(wù)。
如上所示,示意圖顯示了屏蔽上的組件,不需要全部使用,但是可以使用選項如果想要的話。以太網(wǎng)屏蔽層也未顯示,只需插入MEGA。
您需要的組件:
1。 Arduino MEGA 2560
2。以太網(wǎng)屏蔽(帶有micro SD卡)
3。 RF 433MHz接收器(已使用Aurel RX-4M50RR30SF,從這里開始運行良好)
4??罩薪Y(jié)果5。 DS3234 RTC中斷模塊
6。 LM35溫度傳感器(最多2個,可選)
7。 BMP085壓力傳感器(可選)
為了將Arduino和“盾牌”安裝到標(biāo)準(zhǔn)Arduino外殼中,我不得不卸下了兩個定位銷,但是這些定位銷很容易折斷,并且不會影響到固定的安裝位置。硬件。請注意,在PCB上,接收器模塊位于PCB的下側(cè)(有足夠的空間),因此仍可以彈出存儲卡而不會受到干擾。
我用433MHz的鞭狀天線使設(shè)備看起來更整潔(未連接照片,但顯示為安裝在第二張照片的包裝盒中)–不確定其響應(yīng)是否比我的測試天線更好-一根電線;但是看起來更整潔并且更專業(yè)!
第3步:記錄數(shù)據(jù)的代碼
這是一個擴展步驟1的步驟,獲取接收到的信號并解釋這些信號以獲得“真實”值。這些數(shù)據(jù)存儲在全局變量中,因為數(shù)據(jù)在多個地方使用(即日志記錄階段和網(wǎng)頁服務(wù)頁面,第4步)。我通常使用整數(shù)來盡可能地節(jié)省內(nèi)存并加快處理速度,在將值記錄或“提供”到網(wǎng)絡(luò)時,除以10可以得到小數(shù)點后一位。我還包括了最大值和最小值的觸發(fā)器(如果在一年中的某個時刻斷電,它們會在午夜存儲在EEPROM中)。對于某些參數(shù),還有觸發(fā)器發(fā)送電子郵件(第5步)。我為那些需要驗證的元素添加了校驗和,因為偶爾會處理錯誤的數(shù)據(jù)并歪曲最大/最小數(shù)據(jù)。 Oregon Scientific信號的解碼基于互聯(lián)網(wǎng)上的信息以及此處的Cresta設(shè)備的信息。請注意,每個Oregon Scientific和Cresta設(shè)備的RF解碼代碼都不相同。這兩個示例都包含在示例草圖文件中。
第4步:Web服務(wù)代碼
有這有兩個關(guān)鍵要素。一種是直接從Arduino提供固定格式的頁面,本質(zhì)上是傳感器讀數(shù),電池狀態(tài),Arduino狀態(tài)等的列表。這對于“調(diào)試”這兩個軟件很有用,但也可以驗證硬件是否按預(yù)期工作–例如,如果傳感器由于超出范圍或受到干擾而未被解碼,則可以在“最新更新”詳細信息上對其進行監(jiān)視。第二個要素是提供更復(fù)雜的頁面。編碼的解決方案非常強大(我認為),因為它將從SD卡的根目錄加載模板文件(以文本形式),并在該文件中找到“變量”(以打開和關(guān)閉~~表示),在投放到網(wǎng)頁之前,將其替換為值。這意味著可以創(chuàng)建非常復(fù)雜的網(wǎng)頁,而無需重新編碼Arduino,也無需占用內(nèi)存/資源,包括對外部文件的引用,例如.css文件,圖像等,這些文件可以存儲在您自己的網(wǎng)站上,而不是在網(wǎng)站上提供最初,該代碼旨在在UNO上工作,但我需要為趨勢圖存儲大數(shù)據(jù)數(shù)組(48個值x 13組) (請參見示例網(wǎng)頁),盡管編譯大小低于32k,但Arduino因內(nèi)存“過載”而失敗。..轉(zhuǎn)到MEGA還允許添加附加功能(例如電子郵件,日出等),而不會出現(xiàn)問題。 。隨意優(yōu)化代碼并將其壓縮到UNO上。
示例文件(graphs.htm)在下面創(chuàng)建網(wǎng)頁,并利用Google Charts api通過簡單的超鏈接調(diào)用呈現(xiàn)圖表。請注意,該代碼僅適用于8.3命名文件(由于使用了SDFat),因此使用了.htm命名文件。要查看處理后的頁面,只需鍵入Arduino IP代碼:端口,然后輸入/graphs.htm。
該代碼還包括用于計算某些派生參數(shù)(例如云底高度和風(fēng)寒)的數(shù)學(xué)方法。除正常頁面交付外的URL:
?YourIP:Port/EEPROM –強制將當(dāng)前的最大和最?。ê拖掠甏螖?shù))記錄到EEPROM中。在出于任何原因斷電以確保維護年度數(shù)據(jù)之前執(zhí)行此操作很有用。注意:每天午夜只對EEPROM寫入一次。這可以延長Arduino EEPROM的壽命,并且由于我打算每天無限期供電,因此我認為每天就足夠了。
?YourIP:Port/TIME&year&year&mo&day&hr&mi –盡管已使用RTC,但它似乎會浪費一段時間。此功能允許用戶(通過Web)將RTC重置為“正確的時間”并更新夏令時的更改。
基本日志記錄和服務(wù)器代碼均基于此處的教程,并進行了修改以滿足我的需要和更改為Arduino 1.0編譯器。
庫參考
?TimeLord庫
?EEPROMWriteAnything庫
?RTCLib庫
?SDFat庫(和以太網(wǎng)/SD卡教程)
步驟5:電子郵件代碼
使用一個簡單的網(wǎng)頁客戶端,我將一個URL稱為php位于我網(wǎng)頁上的腳本,用于通過電子郵件發(fā)送設(shè)置的電子郵件分發(fā)列表。同樣,由于它是由Arduino托管的,因此我可以隨時更改電子郵件的分發(fā)和內(nèi)容。
氣象臺警報電子郵件php腳本:
《?php
//以下幾行閱讀了URL中的參數(shù)
$ TO =‘電子郵件地址1’;
$ TO。=‘,電子郵件地址2’;
$ FROM =‘您的電子郵件地址’;
$ SUBJECT =‘天氣站點更新”;
$ TIME = $ _REQUEST [“ TIME”];
$ TEMPNOW = $ _REQUEST [“ TEMPNOW”];
$ WSNOW = $ _REQUEST [“ WSNOW”];
$ WDNOW = $ _REQUEST [“ WDNOW”];
$ RAIN = $ _REQUEST [“ RAIN”];
$ TEMPMAX = $ _REQUEST [“ TEMPMAX”];
$ TEMPMIN = $ _REQUEST [“ TEMPMIN” ];
$ WSMAX = $ _REQUEST [“ WSMAX”];
$ TRIGGER = $ _REQUEST [“ TRIGGER”];
$ MESSAGE =’來自氣象站的消息
時間為‘。$ TIME 。 ’
-現(xiàn)在的溫度是‘。$ TEMPNOW。 ’C
-現(xiàn)在的風(fēng)速為‘。$ WSNOW。 “每小時deg
-今天下雨”。$ RAIN。 ’mm
-今天的最高溫度是‘。$ TEMPMAX。 ’C
-今天的最低溫度是‘。$ TEMPMIN。 ’C
-今天的最大風(fēng)速為‘。$ WSMAX。 ’mph
由于‘。$ TRIGGER發(fā)送了電子郵件。 ’;
//這將發(fā)送消息
mail($ TO,$ SUBJECT,$ MESSAGE,“發(fā)件人:”。$ FROM);
?》
如果有,還會發(fā)出一封電子郵件
步驟6:已知限制和需要改進的地方
1。我遇到的最大問題是,在檢查任何網(wǎng)頁請求時,Arduino缺少對RF信號的解碼。更改為Arduino 1.0會使情況變得更糟(似乎需要花費很多時間才能檢查任何服務(wù)器請求)。為了克服這個問題,我只會在收到并解碼了RF信號時檢查互聯(lián)網(wǎng)活動(這對我來說很有效,因為我有很多傳感器,每隔幾秒鐘就會收到一個信號),或者每5秒通過關(guān)于mills()的檢查。這在實踐中可行(用戶接收網(wǎng)頁的最大延遲約為5秒鐘,并且沒有明顯的閱讀損失),但是我敢肯定有更好的方法可以做到這一點,例如軟件中斷? 》 2。有些編碼很差(我可以更好地利用函數(shù)/過程,甚至可能更好地利用某些庫工作(這超出了我的能力)),而且我敢肯定,有更有效的方法可以達到相同的目的。該代碼可以正常工作,并且可以可靠地完成我的工作(運行幾個月沒有問題),但是歡迎任何改進/建議。
責(zé)任編輯:wv
-
Web服務(wù)器
+關(guān)注
關(guān)注
0文章
137瀏覽量
24356 -
Arduino
+關(guān)注
關(guān)注
187文章
6458瀏覽量
186504 -
氣象站
+關(guān)注
關(guān)注
1文章
736瀏覽量
15620
發(fā)布評論請先 登錄
相關(guān)推薦
評論