【物联网初探】- 08 - ESP32 操作电容式土壤湿度传感器(Arduino IDE)
文章目錄
- 1. 硬件、接線、環境配置
- 2. 電容式土壤濕度傳感器 (arduino)
- 3. ESP32 與電容式土壤濕度傳感器
- 3.1 接線
- 3.2 濕度數據讀取
- 3.3 濕度傳感器標定 Why , What , How
- 3.3.1 為什么要標定
- 3.3.2 標定什么
- 3.3.3 標定流程
- 3.3.4 確定函數對應關系
- 3.3.5 插入土壤深度
- 3.4 ESP32 土壤濕度測量 UDP 傳輸例子
1. 硬件、接線、環境配置
-
【物聯網初探】- 01 - ESP32 開發環境搭建 (Arduino IDE)
-
【物聯網初探】- 02 - ESP32 利用 SPI 聯通 TFT 彩屏 (Arduino IDE)
-
【物聯網初探】- 03 - ESP32 結合 TFT_eSPI 庫標定 TFT 觸摸屏 (Arduino IDE)
-
【物聯網初探】- 04 - ESP32 結合 LVGL 庫開發環境搭建 (Arduino IDE)
-
【物聯網初探】- 05 - ESP32 上 LVGL 庫的多個例程測試 (Arduino IDE)
-
【物聯網初探】- 06 - ESP32 利用 wifi 進行 TCP 通信(Arduino IDE)
-
【物聯網初探】- 07 - ESP32 利用 wifi 進行 UDP 通信(Arduino IDE)
2. 電容式土壤濕度傳感器 (arduino)
-
硬件外觀,某寶購入,挑了一個便宜的,4.75元一個,寬壓 DC 3.3 ~ 5.5 V 均可。
-
參考資料 :電容式濕度傳感器 - DFROBOT,該文檔講解非常詳細。
3. ESP32 與電容式土壤濕度傳感器
3.1 接線
-
濕度傳感器的板子上一共出來三根線,VCC 和 GND 正常接供電和接地即可,我這個傳感器 3.3V 和 5V 輸入都可以。
-
重點就是數據輸出的那根線,接一個不用的 GPIO 口即可,注意避開有特殊功能的口,接口定義參見 01 篇博客,這里我連接了 GPIO 4 ,對應我板子上標識的 G4 (這個 ESP32 的標識可能與你的不同,請參照你自己的電路圖確定 GPIO 號),這里注意,如果同時使用 wifi 可能會有 GPIO 口沖突問題,簡單的解決方法就是換不沖突的口來讀,見 3.4。
3.2 濕度數據讀取
-
只需利用 analogRead() 函數,讀取該 GPIO 口上的模擬數據。
-
請注意,該數據并不是相對濕度,而是一個參考值,這里引用 dfrobot 官網的一段解釋:
問題:為什么我們不能用防水的相對濕度傳感器去測量土壤濕度?
解釋:土壤濕度的定義是取1公斤土樣,徹底烘干,減少的重量(水的重量)與1公斤的比值成為土壤濕度。空氣相對濕度的定義是當前溫度下的絕對濕度與當前溫度下的飽和濕度的百分比。綜上土壤濕度跟空氣濕度不是一個概念,也不是一個數量級,土壤濕度10%時土壤中空氣的濕度已經100%了。注意:利用防水型相對濕度傳感器,將其埋在土壤里是不會損壞的,即使帶電再水里煮也不會損壞,但當面對濕度稍大的土壤,土壤中空氣濕度會長期是100%,測量就失去了意義。
-
極簡代碼
void setup() {Serial.begin(9600); } void loop() {Serial.println(analogRead(4));//濕度傳感器接ESP32上的GPIO號delay(100); }
3.3 濕度傳感器標定 Why , What , How
3.3.1 為什么要標定
- 在 3.2 的解釋基礎上,我們明確了該傳感器只能根據電容感應原理輸出一個數值,而不同的土壤濕度會影響電容,導致不同的輸出數據,雖然我們無法得知準確的土壤濕度數據,但是我們能根據測量值來定性的得知當前土壤相對的濕度關系。
3.3.2 標定什么
- 標定的是該傳感器在 干燥環境下的讀數 ,和 潮濕環境下的讀數 ,那么從植物澆水的角度來講,我們可以在植物土壤比較干燥的情況下測一次讀數,然后在澆透水之后測一次,以這兩次的數值為干、濕的參考基準,然后設置一個相對濕度的對應關系函數。
3.3.3 標定流程
-
**參考 電容式濕度傳感器 - DFROBOT 文檔中對該傳感器的標定建議,我們采用 空氣中的讀數 和 水中的讀數 ,作為 干、濕的參考區間 ,步驟如下:
-
首先,燒錄讀取傳感器數據的代碼,參考 3.2 極簡代碼即可,并打開 Arduino 上的串口監視器。
-
在空氣中觀察讀數,我手頭這個傳感器的讀數大約穩定在 2590 。
-
-
把傳感器下半部分插入水中,觀察讀數,大約穩定在 1090,至此我們就獲得了兩個極值。
3.3.4 確定函數對應關系
-
從上述測量值我們可以看出,模擬輸出的數值與濕度是成反比的,我們可以根據兩次測量值構造一個簡單的線性函數,實際上濕度與電容式傳感器測量值不一定是線性關系,如果想要得出稍微準確的對應關系,應該在不同濕度的土壤中做多次試驗來擬合曲線。
-
這里,我們就理想化的認為它符合線性關系,那么讀數 1090 記為 cmaxc_{max}cmax? , 對應土壤濕度 100% 記為 mmaxm_{max}mmax?; 讀數 2590 記為 cminc_{min}cmin? ,對應土壤濕度 0% 記為 mminm_{min}mmin?,當前土壤含水量為 mcurm_{cur}mcur?,ESP32 讀數為 ccurc_{cur}ccur?,構造線性函數如式(1):
mcur=(ccur?cmin)?(mmax?mmin)(cmax?cmin)(1)m_{cur} = (c_{cur} - c_{min})* \frac{(m_{max}-m_{min})}{(c_{max}-c_{min})} \tag 1 mcur?=(ccur??cmin?)?(cmax??cmin?)(mmax??mmin?)?(1)
3.3.5 插入土壤深度
-
推薦的插入深度如下圖,綠色區間為建議的深度,不可越過紅色線。
3.4 ESP32 土壤濕度測量 UDP 傳輸例子
-
wifi 與 adc 沖突問題,目前我偷懶解決,換了一個不沖突的 pin 口就好了,之前的 GPIO 4 無法讀取數據。
-
例程代碼
#include <WiFi.h>const char *ssid = "***"; const char *password = "***"; float c_min = 2590.0; //readings in air float c_max = 1090.0; //readings in water float m_min = 0.0; //min soil moisture float m_max = 100.0; //max soil moisture const int m_Pin = 32; //與wifi不沖突的pinWiFiUDP Udp; IPAddress remote_IP(192, 168, 1, 22); unsigned int remoteUdpPort = 6060; // 自定義遠程監聽端口void setup() {Serial.begin(9600);WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED){delay(200);Serial.print(".");}Serial.println("Connected");Serial.print("IP Address:");Serial.println(WiFi.localIP()); }void loop() {Udp.beginPacket(remote_IP, remoteUdpPort);//配置遠端ip地址和端口int c_cur = analogRead(m_Pin);//讀取GPIO上的模擬數據int m_cur = (c_cur - c_min) * (m_max - m_min) / (c_max - c_min);//公式(1)String str_m_cur(m_cur);Udp.println(str_m_cur);//把數據寫入發送緩沖區Udp.endPacket();//發送數據delay(1000); } -
測試結果正常,空氣中 UDP 遠端收到 0,水中收到 100 。
總結
以上是生活随笔為你收集整理的【物联网初探】- 08 - ESP32 操作电容式土壤湿度传感器(Arduino IDE)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超简单的倒计时代码编写
- 下一篇: SCI论文写作中常用的连接词和短语