7.實用實例系列2:nodeMcu實現溫濕度監測

7.實用實例系列2:nodeMcu實現溫濕度監測

前言

之前實現的是對繼電器的控制,但智能化控制,還需要一些檢測乃至監測,實時反饋環境變化,用來提供控制的依據,這樣才更智能。這里開始嘗試對用nodeMcu實現溫濕度的檢測,標題用監測是由于通過Domoticz實現溫濕度的顯示,通過它進行監測。
還需要交代的是,由于本人比較菜,很多知識都是不足,最后實現這個也是參考學習了一些網友的代碼。下篇文章本人學著通過ESPEasy同樣實現了相同的功能,那樣操作就更簡易了。

1、溫濕度傳感器

要實現這個溫濕度檢測功能,單單靠nodeMcu顯然是不行,它只是處理數據的,具體檢測還需要檢測傳感器。這里選用了SI7021高精度溫濕度傳感器模塊。

SI7021高精度溫濕度傳感器模塊.png

之所以說是模塊,是因為,它將傳感器需要的電路都集成,直接提供了電壓端口和檢測端口,不用我們買傳感器再根據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等,因為也會涉及,先參照這個建立固件,等郵件吧,再刷固件。

sp170724_225520.png

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固件用這個打印溫濕度
程序調試.png

好了,溫濕度檢測功能實現,那如何將數據上傳至Domoticz,實現可以在Domoticz上查看和記錄呢?

3.3、Domoticz設置

這里直接給出相關設置截圖
1、在硬件里增加傳感器


在硬件里增加傳感器
設置成功增加

2、創建傳感器,選擇類型

選擇類型
成功增加

3、查看傳感器

查看新建傳感器

4、查看idx和數據

注意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&param=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&param=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服務器

運行試試吧,記得把中文注釋刪掉。

程序運行截圖

運行結果中可以看到濕度溫度,還有連接信息。


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/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容