24小時(shí)聯(lián)系電話(huà):18217114652、13661815404
中文
行業(yè)資訊
帶有 ESP8266 和 DS18B20 的 WIFI 溫度監控器
帶有 ESP8266 和 DS18B20 的 WIFI 溫度監控器
今天,我們將創(chuàng )建一個(gè)wifi溫度監控系統。對于讀數,我們將使用 DS18B20 傳感器。對于數據處理和網(wǎng)頁(yè)創(chuàng )建,我們將使用我們已知的 ESP8266。
該項目將建設如下:
電路組裝
讀取 DS18B20 傳感器的代碼(我們將使用串行進(jìn)行測試)。
創(chuàng )建網(wǎng)頁(yè)(我們將使用 SPIFFS 存儲在 FLASH 中)。
但首先,讓我們了解一下傳感器及其使用的通信模型。
DS18B20
DS18B20是一款精度好、定制性好、實(shí)用、可靠、成本低的數字溫度傳感器。組合好?
傳感器監測范圍內的溫度:-55°C 至 +125°C(-67°F 至 +257°F),在 -10°C 至 +85°C 的范圍內精度為 +-0.5°C (在該范圍之外,這種不準確性會(huì )增加,但沒(méi)什么可笑的)。
它使用三個(gè)引腳進(jìn)行操作:
VDD(電源)
GND(接地)
DQ(數字通信)
VDD 以 3V 至 5.5V 的值工作,甚至可以省略。傳感器具有寄生模式,僅使用 DQ 和 GND 引腳,其電源來(lái)自通信引腳。這種模式效果很好,但更容易受到噪音的影響。
數據通信使用 DQ 引腳通過(guò) 1-Wire (OneWire) 協(xié)議進(jìn)行。我們稍后將討論該協(xié)議,但現在重要的是要知道,盡管只有一根電線(xiàn),但它允許雙向通信。
讀取是主動(dòng)執行的,微控制器發(fā)送命令并接收回包含信息的數據包。
除了讀取請求,傳感器還可以接收報警配置和數據格式命令。DallasTemperature 庫已經(jīng)為我們處理了大部分。包括為我們提供一些附加功能,例如在法拉第接收讀數。
市場(chǎng)上最常見(jiàn)的型號是TO-92封裝(看起來(lái)像晶體管)和防水封裝。由于其實(shí)際應用,這第二種更常見(jiàn),1m 長(cháng)的帶不銹鋼尖端的電纜。例如,它可用于控制水溫。讀取是主動(dòng)執行的,微控制器發(fā)送命令并接收回包含信息的數據包。
除了讀取請求,傳感器還可以接收報警配置和數據格式命令。DallasTemperature 庫已經(jīng)為我們處理了大部分。包括為我們提供一些附加功能,例如在法拉第接收讀數。
市場(chǎng)上最常見(jiàn)的型號是TO-92封裝(看起來(lái)像晶體管)和防水封裝。由于其實(shí)際應用,這第二種更常見(jiàn),1m 長(cháng)的帶不銹鋼尖端的電纜。例如,它可用于控制水溫。
單線(xiàn)
OneWire(或 1-Wire)是由 Dallas Semiconductor 設計的一種通信方法,它僅使用一條線(xiàn)路傳輸數據,并帶有發(fā)送誰(shuí)和何時(shí)發(fā)送的信號系統。
該方法與 i2C 非常相似,但它的數據傳輸速度要有限得多。另一個(gè)區別是在 1-wire 的情況下,可以省略電源引腳,在寄生模式下使用數據引腳(現在,您可能已經(jīng)注意到,盡管名稱(chēng)如此,該方法至少需要兩條線(xiàn):數據和地)。
通信在主從模式下完成,其中微控制器發(fā)送所有請求,其他設備僅在名義上請求時(shí)發(fā)送數據。
每個(gè)設備都有一個(gè)唯一的地址/名稱(chēng)。這允許我們在同一條數據線(xiàn)上連接多個(gè)設備。請求以廣播方式發(fā)送,在其中識別自身的設備會(huì )做出響應。
電路
我們應用的電路很簡(jiǎn)單。我們將傳感器的 VDD 引腳連接到 NodeMCU 的 3V3,GND 與 GND,我們將使用 D4 引腳作為傳感器數據。它可以是任何其他數字引腳。
此外,必須在數據引腳和 3V3 之間放置一個(gè) 4k7 歐姆電阻以增加穩定性。
查找 DS18B20 地址
正如我們之前看到的,每個(gè)傳感器都有一個(gè)唯一的地址,這個(gè)地址對于通信至關(guān)重要。我們可以將其理解為制造序列號。但是如何識別這個(gè)數字呢?
我們將創(chuàng )建一個(gè)幫助程序代碼來(lái)查找此地址。在這種情況下,代碼會(huì )掃描連接到引腳 D4 的任何設備。我們將使用串行監視器來(lái)可視化結果。
我們從導入 OneWire 和 DallasTemperature 庫開(kāi)始(不要忘記維護順序)。如果出現任何導入錯誤,您可以將它們添加到 Arduino IDE 的庫管理器中。
接下來(lái),我們在引腳 D4 上啟動(dòng)一個(gè) OneWire 對象,并使用該對象創(chuàng )建一個(gè)傳感器。從那一刻起,“傳感器”對象具有 DallasTemperature 庫提供的所有屬性和功能。
我們將使用兩個(gè)函數 Search(),它執行 OneWire 中的設備搜索,以及 reset_search() 重新開(kāi)始搜索。
我們的代碼所做的是開(kāi)始搜索,將結果保存在 addr 變量中,如果變量不為空,則將其寫(xiě)入串行中。
我們在串行監視器上找到了結果。如果有其他設備,它們也會(huì )出現在這里。留下地址,我們會(huì )需要的。
串行監視器讀取傳感器
現在我們知道了傳感器的地址。讓我們開(kāi)始讀取溫度的主要代碼。這里的目標是啟動(dòng)傳感器并每 10 秒讀取一次讀數。
我們以同樣的方式開(kāi)始,但這次我們使用收集到的地址創(chuàng )建了 sensor1 變量。
在 readDs18b20() 函數中,我們將使用兩個(gè)函數:
requestTemperatures() – 此函數不專(zhuān)門(mén)與任何傳感器通信,而是與所有傳感器通信。就像它說(shuō)的:如果你是 ds18b20,現在運行一個(gè)新的讀取并等待我的“以及傳感器的作用。
getTempC(address) – 在這里,我們將信息定向到每個(gè)感興趣的傳感器,這些傳感器以最后的讀數響應我們
在 Setup() 函數中,我們使用 begin() 函數啟動(dòng)傳感器,它會(huì )自動(dòng)執行讀數,如果您沒(méi)有發(fā)出新請求,傳感器仍會(huì )響應 getTemp() 函數,但會(huì )使用過(guò)時(shí)的值。
在循環(huán)中,我們有一個(gè)帶有 millis() 函數的計時(shí)器,以便每 10 秒讀取一次。
在串行監視器上,我們應該得到以下結果:
請注意,在第 15 行,我們向 Serial.println() 函數添加了另一個(gè)參數。有了這個(gè),我們定義了小數位數。
創(chuàng )建監控頁(yè)面
準備好閱讀后,讓我們創(chuàng )建一個(gè)網(wǎng)頁(yè)以在瀏覽器中查看此信息。請記住,稍后我們會(huì )將這些文件放在帶有 SPIFFS 的 FLASH ESP8266 中。
我們將構建以下屏幕:
為此,我們將使用兩個(gè)文件:
索引.html
樣式文件
頁(yè)面結構不是本文的重點(diǎn),但基本上,我們有 index.html 文件創(chuàng )建頁(yè)面本身并觸發(fā)一個(gè) javascript 函數來(lái)更新閱讀。
style.css 文件改進(jìn)了頁(yè)面的外觀(guān),但不影響其功能。
兩個(gè)文件都必須在項目文件夾內的數據文件夾中,并使用 ESP8266 Sketch Data Upload 傳輸。
完整代碼
將頁(yè)面保存到 FLASH 后,我們需要創(chuàng )建為頁(yè)面提供服務(wù)的結構。
在 wifi 上連接
創(chuàng )建一個(gè)網(wǎng)絡(luò )服務(wù)器
為對此的請求創(chuàng )建回調
這一步對我們來(lái)說(shuō)并不新鮮,但有幾點(diǎn)值得注意。
現在 readDs18b20() 函數也更新了一個(gè) String 類(lèi)型的變量。我們這樣做是因為服務(wù)器回調函數不接受整數或浮點(diǎn)變量。
對于服務(wù)器,我們有三個(gè)路由:
“/”將發(fā)送帶有最新傳感器讀數的 html 文件。
“/styled.css” 將發(fā)送 css 文件
“/state”將返回要更新的溫度變量。