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