7.實用實例系列2:nodeMcu實現溫濕度監測
前言
之前實現的是對繼電器的控制,但智能化控制,還需要一些檢測乃至監測,實時反饋環境變化,用來提供控制的依據,這樣才更智能。這里開始嘗試對用nodeMcu實現溫濕度的檢測,標題用監測是由于通過Domoticz實現溫濕度的顯示,通過它進行監測。
還需要交代的是,由于本人比較菜,很多知識都是不足,最后實現這個也是參考學習了一些網友的代碼。下篇文章本人學著通過ESPEasy同樣實現了相同的功能,那樣操作就更簡易了。
1、溫濕度傳感器
要實現這個溫濕度檢測功能,單單靠nodeMcu顯然是不行,它只是處理數據的,具體檢測還需要檢測傳感器。這里選用了SI7021高精度溫濕度傳感器模塊。
之所以說是模塊,是因為,它將傳感器需要的電路都集成,直接提供了電壓端口和檢測端口,不用我們買傳感器再根據datasheet買電阻電容焊電路。
選用這個主要考慮到它的精度較高,當然如果對精度要求不高,可以選用其它模塊,比如dt11等。
2、電路連接
之前這個圖,我們可以看到傳感器模塊上只有 4個接口,分別是CL、
DA、+、-,+、-明顯是電源,這款傳感器模塊3.3V供電就可以,用nodeMcu上的3.3V電源接口即可, CL、DA是通過I2C協議傳輸溫濕度數據的。nodeMcu是支持這個I2C協議的傳輸,具體可以參考https://nodemcu.readthedocs.io/en/master/en/modules/i2c/
其實所有的IO基本都支持使用I2C協議作為SCL和SDA,這里取了D3和D4,主要是方便接線。歡迎大家用其它端口嘗試。
3、軟件編寫
3.1、重新選擇nodeMcu功能模塊刷寫固件
這里涉及到一些nodeMcu的模塊,比如I2C,Si7021(我也是后來才知道原來本身自帶這個溫度傳感器的軟件模塊),由于之前沒有勾選這些模塊,需要重新建立固件刷寫,還是采用
2.NodeMcu上手準備中云固件編譯方式,刷寫方法是3.關于NodeMcu刷固件遇到的問題及解決,注意一下,這里需用支持浮點運算的float版固件(后面涉及一點浮點運算,原來用integer固件出了點問題)。模塊選擇如圖所示吧,其它模塊有些也是必選的,比如GPIO、timer、WiFi、net等,因為也會涉及,先參照這個建立固件,等郵件吧,再刷固件。
3.2、編寫溫濕度檢測程序
對于SI7021傳感器,官方就有相關的代碼教程,參考https://nodemcu.readthedocs.io/en/master/en/modules/si7021/。我們可以直接使用里面的例子。
貼一下代碼
local sda, scl = 4, 3
--設置數據傳輸端口,這里是D4、D3,即GPIO2、GPIO0
i2c.setup(0, sda, scl, i2c.SLOW)
-- 設置傳輸協議
si7021.setup()
--開啟si7021相關功能
hum, temp, hum_dec, temp_dec = si7021.read()
--讀取濕度、溫度、濕度小數值、溫度小數值
print(string.format("Humidity:\t\t%d.%03d\nTemperature:\t%d.%03d\n", hum, hum_dec, temp, temp_dec))
--integer固件用這個打印溫濕度
print("Humidity: "..hum.."\n".."Temperature: "..temp)
--Float固件用這個打印溫濕度
好了,溫濕度檢測功能實現,那如何將數據上傳至Domoticz,實現可以在Domoticz上查看和記錄呢?
3.3、Domoticz設置
這里直接給出相關設置截圖
1、在硬件里增加傳感器
2、創建傳感器,選擇類型
3、查看傳感器
4、查看idx和數據
目前還沒與nodeMcu連接,數據還沒有。注意idx號,后續數據上傳接口和這個有關系。
3.4、編寫數據上傳程序
由于之前LED控制是基于http傳輸,并不知道Domoticz的接口,所以找方法費了些時間,最后找到了什么值得買上面@pufand寫的把家裝進凈化器—90元打造全屋凈化新風系統這篇文章,里面網盤附了代碼,這里研究百度之后,發現了Domoticz的接口參考,具體可以看Domoticz_API及JSON網址。利用nodeMcu的net模塊,通過接口實現數據上傳。
程序如下:
conn=net.createConnection(net.TCP, 0)
--建立一個連接connection
conn:on("receive", function(conn, payload) print(payload) end )
conn:connect(8080,'192.168.8.93')
--連接Domoticz服務器IP和端口
conn:send("GET /json.htm?type=command¶m=udevice&idx="..idx.."&nvalue=0&svalue="..t..";"..h..";0 HTTP/1.1\r\nHost: www.local.lan\r\n".."Connection: keep-alive\r\nAccept: */*\r\n\r\n")
--根據Domoticz連接溫濕度端口用GET方式連接
--idx對應Domoticz中傳感器idx
--t,h對應溫度濕度
--nHost: www.local.lan這個是對主機網址命名
--目前隨意設置
3.5、匯總程序
總程序是通過分塊功能函數的方式,再在主程序進行調用的方式實現。
function setupwifi(SSID,password)
wifi.setmode(wifi.STATION)
wifi.sta.config(SSID,password)
end
--設置wifi連接,設置了一個連接wifi函數
function sendt(t,h,idx)
tmr.alarm(1, 1000, tmr.ALARM_AUTO,
--延時函數等待wifi連接
function()
if wifi.sta.getip()== nil then
print("not connected, Waiting...")
--未連接顯示等待
else
tmr.stop(1)
print("Config done, IP is "..wifi.sta.getip())
--連接顯示IP
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end )
conn:connect(8080,'192.168.8.93')
--連接Domoticz服務器IP和端口
conn:send("GET /json.htm?type=command¶m=udevice&idx="..idx.."&nvalue=0&svalue="..t..";"..h..";0 HTTP/1.1\r\nHost: www.local.lan\r\n".."Connection: keep-alive\r\nAccept: */*\r\n\r\n")
--利用Domoticz接口發送溫濕度數據
end
end)
end
--設置連接Domoticz服務器和發送數據函數
function humtemp()
local sda, scl = 4, 3
i2c.setup(0, sda, scl, i2c.SLOW)
si7021.setup()
hum, temp, hum_dec, temp_dec = si7021.read()
hum1=string.format("%0.2f",hum + hum_dec / 1000)
--取濕度
temp1=string.format("%0.2f",temp + temp_dec / 1000)
--取溫度
print(hum1,temp1)
return hum1,temp1
--返回濕度和溫度
end
--設置讀取溫濕度函數
----------------------------------------------------------------------
--以下為主程序
setupwifi("填入你的路由SSID","填入你的路由密碼")
tmr.alarm(2, 2000, tmr.ALARM_AUTO,
function()
hum,temp =humtemp()
--將溫濕度值賦值給hum和temp
sendt(temp,hum,6)
--發送hum和temp到idx為6的傳感器
end)
--延時2000ms重復讀取溫濕度和發送到Domoticz服務器
運行試試吧,記得把中文注釋刪掉。
運行結果中可以看到濕度溫度,還有連接信息。
可以觀察里面的溫度濕度數值數值是變化的。
結尾
本文利用SI7021高精度溫濕度傳感器模塊連接nodeMcu實現了溫濕度數據的采集,連接Domoticz后實現溫度濕度的實時監測。由于本身nodeMcu內嵌了SI7021模塊,簡化編程。通過學習發現解決了Domoticz接口傳輸問題。
當然實現了溫度濕度的監測,后面再加傳感器比如PM2.5、甲醛、二氧化碳等等,實現起來就照樣畫葫蘆了。
下一篇再介紹另外一種實現方式,不過要刷ESPEasy固件,但操作更簡單,無須編寫程序。
參考
官方文檔:https://nodemcu.readthedocs.io/en/master/en/modules/i2c/
https://nodemcu.readthedocs.io/en/master/en/modules/si7021/
Domoticz官方:https://www.domoticz.cn/wiki/Domoticz_API%E5%8F%8AJSON%E7%BD%91%E5%9D%80#.E6.B8.A9.E6.B9.BF.E5.BA.A6
值友@pufand:https://post.smzdm.com/p/539326/