背景知識視訊教程
- 使用NodeMCU(由ESP8266支援),MicroPython和PyCharm進行物聯網
- 使用MicroPython的微控制器和EPS32的Python權威指南
- 适用于使用ESP32 / ESP8266的所有人的MicroPython(入門)
IOT項目的最常見形式之一是使用傳感器将事件監控到的事件,這些傳感器将資料提供給另一台計算機,雲服務或本地伺服器(例如HTML伺服器)。 一種方法是将MicroPython開發闆連接配接到一組傳感器,然後記錄資料。 您可以在Internet上找到一些正常資料記錄器的示例,但是很少有将資料記錄與可視化元件結合在一起的。 實際上,了解資料是制定成功的物聯網解決方案的關鍵。
我們将探索将資料記錄與資料可視化相結合。 我們将使用HTML伺服器等技術。 我們還将看到如何使用模拟傳感器-一種産生模拟資料的傳感器,然後我們必須對其進行解釋。 實際上,我們将依靠電路闆的模數轉換(ADC)功能将讀取的電壓更改為我們可以使用的值。
介紹
我們将實施植物土壤濕度監測解決方案(為簡潔起見,我們将使用植物監測器)。 這将涉及使用一個或多個連接配接到我們的MicroPython開發闆的土壤濕度傳感器。 我們将設定一個計時器警報(中斷),使其定期運作以從傳感器讀取資料并将其存儲在逗号分隔值(CSV)檔案中。
下圖描繪了該項目的概念圖。 MicroPython闆将從土壤濕度傳感器讀取資料,然後根據要求通過HTML網頁顯示資料。
該項目的使用者界面是一個網頁,其中包含一個表,該表包含從日志檔案讀取的所有資料。 這是我們可以克服循環運作HTML伺服器的潛在問題的方法。 也就是說,我們不必中斷循環來讀取傳感器-隻需通過計時器警報回調即可完成。 可悲的是,該技術僅适用于WiPy和類似的電路闆。 我們将不得不對Pyboard使用其他技術。
通過将傳感器讀數與顯示屏分開,我們可以重複使用或修改它們,而不會在我們深入研究代碼時感到困惑。 例如,隻要可視化元件從檔案中讀取傳感器資料,傳感器讀取代碼的使用方式就無關緊要。 這兩個部分之間唯一的接口或連接配接是檔案的格式,并且由于我們使用的是CSV檔案,是以在我們的代碼中非常容易閱讀和使用。
為了使事情變得更有趣并使編碼更容易,我們将所有傳感器代碼放在單獨的代碼子產品中。
零件需求
所需的跳線數量将因您使用的傳感器數量以及是否使用需要網絡子產品的MicroPython闆而異。 每個傳感器需要三個跳線,如果使用的是CC3000 SPI轉接闆,則需要八根額外的線。 如果您打算使用Pyboard,則還需要添加一個實時時鐘以在斷電時保持時間
Pyboard固件不支援網絡時間協定(NTP)伺服器。 是以,您必須在每次打開闆上電源時初始化闆載RTC,将備用電池連接配接到闆上(請參閱闆的下面–您将看到需要焊接的引腳),或添加實時功能的時鐘子產品。
土壤水分傳感器有多種形式,但大多數都有兩個插腳插入土壤中,并使用少量電荷測量插腳之間的電阻。 讀數越高,土壤中的水分就越多。 但是,需要一些配置才能獲得可靠或現實的門檻值。 盡管制造商會提供門檻值建議,但可能需要進行一些實驗才能找到正确的值。
這些傳感器還可能受到環境因素的影響,這些環境因素包括植物所處的花盆類型,土壤成分以及其他因素。 是以,嘗試使用已知的水淹過的土壤,幹燥的土壤和适當照料的土壤将有助于您縮小環境的門檻。
特别值得注意的是這些土壤濕度傳感器是如何工作的。 如果要讓傳感器保持開機狀态,它們會随着時間推移而退化。 尖頭上的金屬可能會由于電解而降解,進而大大縮短其使用壽命。 您可以使用GPIO引腳的技術通過在想要讀取值時将其打開來為傳感器供電。 請記住,傳感器穩定時會有一個小的延遲,但是我們可以使用一個簡單的延遲來等待,然後讀取該值并關閉傳感器。 這樣,我們可以大大延長傳感器的使用壽命。
設定
下圖僅顯示兩個傳感器,但您可以根據需要添加更多傳感器。 但是,建議您從一個傳感器開始,直到使項目工作,然後再添加其他傳感器。 如果更簡單,則可以使用試驗闆将傳感器連接配接到MicroPython闆上,但是根據您計劃将闆放置的位置,可能不需要它。
接線
當然,您必須将土壤水分傳感器插入植物的土壤中。 如果您的植物距離電源較遠,則可能需要使用更長的電線來連接配接傳感器。 您應該從一個單一的小型植物和一個傳感器(或者為了測試,在一個植物中安裝兩個傳感器)開始,然後将其放置在靠近PC(或電源)的位置。
請務必在打開開發闆電源之前仔細檢查您的連接配接。 現在,讓我們談談我們需要編寫的代碼。
程式設計
我們将分兩個階段編寫代碼,并将在測試項目之前将所有内容放在一起。我們将有兩個主要部分:主代碼和封裝土壤傳感器的代碼子產品。 我們将HTML伺服器代碼和支援功能放在主代碼子產品中。 但是,在開始執行該項目的代碼之前,應先校準傳感器。
校對
傳感器的校準非常重要。 對于土壤濕度傳感器而言尤其如此,因為有許多不同的版本可用。 這些傳感器對土壤成分,溫度甚至植物所居住的盆栽類型也非常敏感。 是以,我們應該對已知的土壤水分進行試驗,以便知道在代碼中使用的範圍。
更具體地說,我們想對來自傳感器的觀察結果進行分類,以便可以确定植物是否需要澆水。 我們将使用“ dry”,“ Ok”和“ wet”值對從傳感器讀取的值進行分類。 看到這些标簽對于我們來說一目了然,很容易确定植物是否需要澆水。 在這種情況下,原始資料(例如1756的值)可能意義不大,但是如果看到“dry”,我們知道它需要水。
由于傳感器是模拟傳感器,是以我們将在闆上使用模數轉換。 當我們從引腳讀取資料時,我們将獲得0-4096範圍内的值。 該值與傳感器在土壤中讀取的電阻有關。 低值表示幹土,高值表示濕土。
我們必須确定這三種分類的門檻值。 同樣,有幾個因素會影響從傳感器讀取的值。 是以,您應該選擇幾盆土壤,其中一盆您覺得幹燥,另一盆已正确澆水,而第三盆過水。 最好的選擇是選擇一種幹燥的,進行測量,然後澆水直到土壤濕度正确,再進行測量,然後再次澆水直到水分過多。
代碼
校對土壤水分門檻值(WiPy)
</>
将上述代碼儲存并命名為threshold.py,并複制到WiPy上執行。如下:
</>
傳感代碼子產品
該項目的第一部分将是建立一個代碼子產品,以包含一個名為PlantMonitor的新類,該類包含從傳感器讀取資料并将資料儲存到檔案的所有功能。 打開一個新檔案,并将其命名為plant_monitor.py。
正如我們先前所了解的,為我們要使用的每個代碼子產品(類)建立一個設計是一個好主意。 我們将使用主代碼中的代碼子產品。 是以,我們需要一些函數來告知類讀取傳感器,以及一種擷取類用于資料的檔案名的方法。
通常,人們會設計一個代碼子產品以完全隐藏檔案及其上的所有操作,但是本文,類僅涉及讀取傳感器和寫入資料。 另外,由于主代碼需要讀取資料并使用HTML标簽對其進行格式化,是以将讀取功能放置在主代碼中更為合适。 也就是說,您應該努力将類似的代碼功能保持在一起,這有助于維護代碼。 例如,将所有HTML代碼儲存在一個檔案中,可以更輕松地修改HTML代碼(或重新使用它)。
我們将使用計時器中斷來讀取傳感器。 這使我們可以設定一個定期調用的函數,而無需監視或輪詢時間并直接調用該函數。 為了友善起見,我們提供了清晰的日志功能。 是以,我們隻需要兩個公共函數:一個清除日志,另一個則擷取檔案名。 除了初始化類之外,我們僅在想要重新整理資料(将其發送給用戶端)時才需要擷取檔案名。
設定和初始化
我們讨論了設定和初始化代碼子產品所需的代碼。 首先,我們需要導入一些内容,包括模數轉換器,引腳,安全磁盤(SD),計時器和作業系統庫的内容。
我們還需要為該類定義一些常量。我們用枚舉對讀取的土壤水分進行分類。 為此,我們将需要使用為分類确定的門檻值。 我們可以在檔案頂部使用常量,以便以後需要更改代碼以與其他傳感器配合使用或我們的植物條件發生變化(不同的花盆,土壤,環境等)時,可以更輕松地更改它們。 我們可以使用相同的原理來設定檔案名以包含資料。
我們還使用常數來定義讀取傳感器的頻率。 由于我們将使用循環讀取傳感器,每次讀取等待5秒,是以最少需要50-55秒才能讀取10個值。 是以,我們不能将更新頻率設定為少于一分鐘。 頻率以秒為機關。 雖然您可能希望将此值設定為較低的值進行測試,但您當然不希望每分鐘檢查一次植物的土壤濕度。
最後,我們需要一個将時間結構轉換為字元串的函數。我們将為該功能使用子產品級私有函數。
下方是顯示設定和初始化部分的代碼,将其放置在檔案的頂部。
</>
構造函數
該類的構造函數是所有主要工作發生的地方。 我們需要做幾件事,包括以下内容。
- 歸一化資料檔案的位置(路徑)
- 在清單中存儲的字典中設定傳感器
- 設定計時器中斷以定期讀取傳感器
我們通過嘗試使用SD卡來規範化資料檔案的路徑。 如果找不到SD卡,則預設使用閃存驅動器。 但是,您應該避免将資料寫入閃存驅動器,因為該驅動器較小,并且可能會填滿,而且寫入閃存驅動器會增加損壞驅動器或在執行過程中引起問題的風險。
我們為每個傳感器使用一個字典,是以我們可以定義傳感器的引腳,為傳感器供電的引腳,傳感器編号(任意辨別)以及傳感器的位置。 然後,我們将字典放在一個清單中,以友善使用循環,同時讀取所有傳感器。
最後,我們通過計時器警報類設定了一個中斷,以定期讀取傳感器。
代碼
</>
注意計時器警報的代碼。 在這裡,我們定義中斷的處理程式(回調),使用在頂部定義的常量定義頻率,然後将其設定為每N秒(定期)觸發一次。
公共函數
隻有兩個公共函數。 第一個clear_log()僅打開檔案進行寫入并關閉。 這有效地清空了檔案。 提供此函數是為了友善。 第二個函數get_filename()僅傳回用于存儲資料的檔案的名稱。 該名稱與常量SENSOR_DATA中的名稱不同,我們在構造函數中對路徑進行了規範化。
私有函數
有三個私有函數。 _get_value()函數與門檻值校準代碼中的代碼相同,在該代碼中,我們對傳感器進行了10次采樣并取平均值。 _read_sensors()函數是計時器警報中斷的回調,該中斷讀取我們定義的所有傳感器并将資料儲存到檔案中。 _convert_value()函數是一個輔助函數,用于根據傳感器資料确定土壤的分類。 此函數傳回字元串或“ dry”,“ Ok”或“ wet”。
完整代碼
詳情參閱http://viadean.com/mp_soil_moisture.html