大多數農民使用大部分耕地,很難到達和追蹤大片土地的每個角落。有時可能會出現不均勻的水灑。這導致農作物質量不佳,進一步導致經濟損失。在這種情況下,使用最新物聯網技術的智能灌溉系統很有幫助,并有助于輕松耕作。
智能灌溉系統具有廣泛的自動化整個灌溉系統的范圍。在這里,我們正在使用 ESP8266 NodeMCU 模塊和 DHT11 傳感器構建基于物聯網的灌溉系統。它不僅會根據土壤中的水分含量自動灌溉水,還會將數據發送到 ThingSpeak 服務器以跟蹤土地狀況。該系統將包括一個水泵,該水泵將用于根據土地環境條件(如濕度、溫度和濕度)向土地灑水。
我們之前構建了類似的自動植物灌溉系統,它在移動設備上發送警報,但不在物聯網云上。除此之外,雨水報警和土壤濕度檢測電路也有助于構建智能灌溉系統。
在開始之前,重要的是要注意不同的作物需要不同的土壤濕度、溫度和濕度條件。因此,在本教程中,我們使用的這種作物需要大約 50-55% 的土壤水分。因此,當土壤水分流失到 50% 以下時,電機泵將自動啟動灑水,并繼續灑水,直到水分達到 55%,然后泵將關閉。傳感器數據將在定義的時間間隔內發送到 ThingSpeak 服務器,以便可以從世界任何地方對其進行監控。
所需組件
NodeMCU ESP8266
土壤濕度傳感器模塊
水泵模塊
繼電器模塊
DHT11
連接電線
電路原理圖
該物聯網智能灌溉系統的電路圖如下:
為自動灌溉系統編程 ESP8266 NodeMCU
對于 ESP8266 NodeMCU 模塊的編程,僅使用 DHT11 傳感器庫作為外部庫。濕度傳感器提供模擬輸出,可通過 ESP8266 NodeMCU 模擬引腳 A0 讀取。由于 NodeMCU 無法從其 GPIO 提供大于 3.3V 的輸出電壓,因此我們使用繼電器模塊來驅動 5V 電機泵。濕度傳感器和 DHT11 傳感器也由外部 5V 電源供電。
從包含必要的庫開始。
?
#include#include
?
由于我們使用的是 ThingSpeak 服務器,因此需要 API 密鑰才能與服務器通信。要了解我們如何從 ThingSpeak 獲取 API 密鑰,您可以訪問之前關于 ThingSpeak 上實時溫度和濕度監控的文章。
?
字符串 apiKey = "X5AQ445IKMBYW31H const char* 服務器 = "api.thingspeak.com";
?
下一步是編寫 SSID 和密碼等 Wi-Fi 憑據。
?
const char *ssid = "CircuitDigest"; const char *pass = "xxxxxxxxxxx";
?
定義連接 DHT 的 DHT 傳感器引腳并選擇 DHT 類型。
?
#define DHTPIN D3 DHT dht(DHTPIN, DHT11);
?
濕度傳感器輸出連接到 ESP8266 NodeMCU 的引腳 A0。并且電機引腳連接到 NodeMCU 的 D0。
?
常量int濕氣Pin = A0; 常量 int motorPin = D0;
?
我們將使用millis()函數在每個定義的時間間隔后發送數據,這里是 10 秒。避免了延遲(),因為它會在定義的延遲中停止程序,而微控制器無法執行其他任務。在此處了解有關delay() 和 millis() 之間區別的更多信息。
?
無符號長間隔 = 10000; unsigned long previousMillis = 0;
?
將電機引腳設置為輸出,并首先關閉電機。開始 DHT11 傳感器讀數。
?
pinMode(motorPin,輸出); 數字寫入(motorPin,低);// 最初保持電機關閉 dht.begin();
?
嘗試使用給定的 SSID 和密碼連接 Wi-Fi,然后等待 Wi-Fi 連接,如果已連接,則轉到下一步。
?
WiFi.開始(ssid,通過); 而(WiFi.status()!= WL_CONNECTED) { 延遲(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi 連接"); }
?
定義啟動程序的當前時間并將其保存在一個變量中,以便與經過的時間進行比較。
?
無符號長 currentMillis = millis();
?
讀取溫度和濕度數據并將它們保存到變量中。
?
浮動 h = dht.readHumidity(); 浮動 t = dht.readTemperature();
?
如果 DHT 已連接且 ESP8266 NodeMCU 能夠讀取讀數,則繼續下一步或從此處返回再次檢查。
?
if (isnan(h) || isnan(t)) { Serial.println("讀取 DHT 傳感器失敗!"); 返回; }
?
從傳感器讀取濕度讀數并打印讀數。
?
濕度百分比 = ( 100.00 - ( (analogRead(moisturePin) / 1023.00) * 100.00 ) ); Serial.print("土壤水分="); 序列號.print(moisturePercentage); 序列號.println("%");
?
如果濕度讀數在所需的土壤濕度范圍之間,則保持泵關閉,或者如果超過所需的濕度,則打開泵。?
?
if (moisturePercentage < 50) { digitalWrite(motorPin, HIGH); } if (moisturePercentage > 50 && wetPercentage < 55) { digitalWrite(motorPin, HIGH); } if (moisturePercentage > 56) { digitalWrite(motorPin, LOW); }
?
現在每 10 秒調用一次sendThingspeak()函數將濕度、溫度和濕度數據發送到 ThingSpeak 服務器。
?
if ((unsigned long)(currentMillis - previousMillis) >= interval) { sendThingspeak(); 以前的米利斯 = 米利斯(); 客戶端.stop(); }
?
在sendThingspeak()函數中,我們檢查系統是否連接到服務器,如果是,則準備一個字符串,其中寫入濕度、溫度、濕度讀數,該字符串將與 API 密鑰和服務器地址一起發送到 ThingSpeak 服務器。
?
if (client.connect(server, 80)) { String postStr = apiKey; postStr += "&field1="; postStr += 字符串(水分百分比); postStr += "&field2="; postStr += 字符串(t); postStr += "&field3="; postStr += String(h); postStr += "\r\n\r\n";
?
最后,使用client.print()函數將數據發送到 ThingSpeak 服務器,該函數包含 API 密鑰、服務器地址和上一步準備的字符串。
?
client.print("POST /update HTTP/1.1\n"); client.print("主機:api.thingspeak.com\n"); client.print("連接:關閉\n"); client.print("X-THINGSPEAKAPIKEY:" + apiKey + "\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("內容長度:"); client.print(postStr.length()); client.print("\n\n"); client.print(postStr);
?
最后,這就是數據在 ThingSpeak Dashboard 上的外觀
最后一步完成了基于物聯網的智能灌溉系統的完整教程。請注意,當灑水后土壤濕度達到所需水平時,關閉電機非常重要。您可以制作一個更智能的系統,該系統可以包含對不同作物的不同控制。
#include
#include
String apiKey = "X5AQ3EGIKMBYW31H"; // 在此處輸入您的 Write API 密鑰
const char* server = "api.thingspeak.com";
const char *ssid = "CircuitLoop"; // 輸入您的 WiFi 名稱
const char *pass = "circuitdigest101"; // 輸入您的 WiFi 密碼
#define DHTPIN D3 // 連接 dht11 的 GPIO 引腳
DHT dht(DHTPIN, DHT11);
WiFiClient客戶端;
常量int濕氣Pin = A0;// 濕度傳感器引腳
const int motorPin = D0;
無符號長間隔 = 10000;
unsigned long previousMillis = 0;
無符號長間隔1 = 1000;
unsigned long previousMillis1 = 0;
漂浮水分百分比;//濕度讀數
float h; // 濕度讀數
float t; //溫度讀數
無效設置()
{
Serial.begin(115200);
延遲(10);
pinMode(motorPin,輸出);
數字寫入(motorPin,低);// 最初保持電機關閉
dht.begin();
Serial.println("正在連接");
序列號.println(ssid);
WiFi.開始(ssid,通過);
而(WiFi.status()!= WL_CONNECTED)
{
延遲(500);
Serial.print("."); // 打印...直到沒有連接
}
Serial.println("");
Serial.println("WiFi 連接");
}
void loop()
{
unsigned long currentMillis = millis(); // 獲取當前時間
h = dht.readHumidity(); // 讀取濕度
t = dht.readTemperature(); //讀取溫度
if (isnan(h) || isnan(t))
{
Serial.println("讀取 DHT 傳感器失敗!");
返回;
}
濕度百分比 = ( 100.00 - ( (analogRead(moisturePin) / 1023.00) * 100.00 ) );
if ((unsigned long)(currentMillis - previousMillis1) >= interval1) {
Serial.print("Soil Moisture is = ");
序列號.print(moisturePercentage);
序列號.println("%");
以前的Millis1 = 毫秒();
}
if (moisturePercentage < 50) {
digitalWrite(motorPin, HIGH); // 調整電機
}
if (moisturePercentage > 50 &&吸濕百分比 < 55) {
digitalWrite(motorPin, HIGH); //打開電動泵
}
if (moisturePercentage > 56) {
digitalWrite(motorPin, LOW); // 關閉電機
}
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
發送事物說話();//向事物發送數據
previousMillis = millis();
客戶端.stop();
}
}
void sendThingspeak() {
if (client.connect(server, 80))
{
String postStr = apiKey; // 在 postStr 字符串中添加 api key
postStr += "&field1=";
postStr += 字符串(水分百分比);// 添加mositure readin
postStr += "&field2=";
postStr += 字符串(t);// 添加 tempr readin
postStr += "&field3=";
postStr += String(h); // 添加濕度
讀數 postStr += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("主機:api.thingspeak.com\n");
client.print("連接:關閉\n");
client.print("X-THINGSPEAKAPIKEY:" + apiKey + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("內容長度:");
client.print(postStr.length()); //發送字符串的長度
client.print("\n\n");
client.print(postStr); // 發送完整的字符串
Serial.print("Moisture Percentage: ");
序列號.print(moisturePercentage);
Serial.print("%.溫度:");
序列號.print(t);
序列號.print(h);
Serial.println("%. 發送到 Thingspeak。");
}
}
評論
查看更多