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