大多数农民使用大量耕地,很难到达并追踪大片土地的每个角落。有时可能会洒水不均匀。这导致农作物质量差,进一步导致经济损失。在这种情况下,使用最新物联网技术的智能灌溉系统会有所帮助,并易于耕种。
该智能灌溉系统,具有广泛的范围,以自动化完整的灌溉系统。在这里,我们使用ESP8266 NodeMCU模块和DHT11传感器构建基于IoT的灌溉系统。它不仅会根据土壤中的水分水平自动灌溉水,而且还会将数据发送到ThingSpeak Server以跟踪土地状况。该系统将包括一个水泵,该泵将根据土地环境条件(例如湿度,温度和湿度)向土地上洒水。
我们之前建立了类似的自动植物灌溉系统,该系统通过移动设备发送警报,但不通过IoT云发送警报。除此之外,雨水警报和土壤湿度检测器电路还有助于构建智能灌溉系统。
开始之前,重要的是要注意,不同的农作物需要不同的土壤水分,温度和湿度条件。因此,在本教程中,我们使用的农作物需要大约50-55%的土壤水分。因此,当土壤失去的水分少于50%时,电动泵将自动打开以洒水,并且它将继续洒水,直到水分升至55%为止,然后关闭泵。传感器数据将在定义的时间间隔内发送到ThingSpeak Server,以便可以在世界任何地方对其进行监视。
所需组件
- NodeMCU ESP8266
- 土壤湿度传感器模块
- 水泵模块
- 继电器模块
- DHT11
- 连接线
您可以购买该项目所需的所有组件。
电路原理图
该物联网智能灌溉系统的电路图如下:
为自动灌溉系统编程ESP8266 NodeMCU
为了对ESP8266 NodeMCU模块进行编程,仅将DHT11传感器库用作外部库。湿度传感器提供模拟输出,可通过ESP8266 NodeMCU模拟引脚A0读取。由于NodeMCU无法从其GPIO提供大于3.3V的输出电压,因此我们使用继电器模块来驱动5V电动泵。湿度传感器和DHT11传感器也由外部5V电源供电。
本教程的结尾给出了带有工作视频的完整代码,在这里我们将解释程序以了解项目的工作流程。
首先包括必要的库。
#包括
由于我们正在使用ThingSpeak服务器,因此API密钥对于与服务器进行通信是必需的。要了解我们如何从ThingSpeak获取API密钥,您可以访问有关ThingSpeak上实时温度和湿度监控的文章。
字符串apiKey =“ X5AQ445IKMBYW31H const char * server =” api.thingspeak.com“;
下一步是编写Wi-Fi凭证,例如SSID和密码。
const char * ssid =“ CircuitDigest”; const char * pass =“ xxxxxxxxxxx”;
定义DHT连接的DHT传感器引脚,然后选择DHT类型。
#定义DHTPIN D3 DHT dht(DHTPIN,DHT11);
湿度传感器的输出连接到ESP8266 NodeMCU的引脚A0。电机引脚连接到NodeMCU的D0。
const int wetPin = A0; const int motorPin = D0;
我们将使用 millis() 函数在每个已定义的时间间隔(此处为10秒)之后发送数据。避免使用 delay() ,因为它会在微控制器无法执行其他任务的预定延迟内停止程序。在此处了解有关delay()和millis()之间的区别的更多信息。
无符号长间隔= 10000; unsigned long前一个Millis = 0;
将电动机引脚设置为输出,并首先关闭电动机。开始DHT11传感器读数。
pinMode(motorPin,OUTPUT); digitalWrite(motorPin,LOW); //最初使电动机保持关闭状态 dht.begin();
尝试使用给定的SSID和密码连接Wi-Fi,然后等待Wi-Fi连接,如果已连接,请转到下一步。
WiFi.begin(ssid,pass); 而(WiFi.status()!= WL_CONNECTED) { delay(500); Serial.print(“。”); } Serial.println(“”); Serial.println(“ WiFi已连接”); }
定义启动程序的当前时间,并将其保存在变量中以与经过的时间进行比较。
unsigned long currentMillis = millis();
读取温度和湿度数据并将其保存为变量。
float h = dht.readHumidity(); 浮点数t = dht.readTemperature();
如果已连接DHT并且ESP8266 NodeMCU能够读取读数,则继续下一步或从此处返回以再次检查。
if(isnan(h)-isnan(t)) { Serial.println(“无法从DHT传感器读取!”); 返回; }
从传感器读取水分读数并打印读数。
wetPercentage =(100.00-((analogRead(moisturePin)/ 1023.00)* 100.00)); Serial.print(“土壤水分为=”); Serial.print(moisturePercentage); Serial.println(“%”);
如果湿度读数在所需的土壤湿度范围之间,请保持泵关闭,或者如果其超出所需的湿度,则打开泵。
如果(moisturePercentage <50){ digitalWrite(motorPin,HIGH); } 如果(moisturePercentage> 50 &&水分 Percentage <55){ digitalWrite(motorPin,HIGH); } 如果(moisturePercentage> 56){ digitalWrite(motorPin,LOW); }
现在,每隔10秒调用一次 sendThingspeak() 函数,将湿度,温度和湿度数据发送到ThingSpeak服务器。
if((unsigned long)(currentMillis-previousMillis)> = interval){ sendThingspeak(); previousMillis = millis(); client.stop(); }
在 sendThingspeak() 函数中,我们检查系统是否连接到服务器,如果是,则准备一个字符串,在其中写入湿度,温度,湿度读数,并将该字符串以及API密钥和服务器地址发送到ThingSpeak服务器。
如果(client.connect(server,80)) { 字符串postStr = apiKey; postStr + =“&field1 =”; postStr + = String(moisturePercentage); postStr + =“&field2 =”; postStr + = String(t); postStr + =“&field3 =”; postStr + =字符串(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(“ Connection:close \ n”); client.print(“ X-THINGSPEAKAPIKEY:” + apiKey +“ \ n”); client.print(“ Content-Type:application / x-www-form-urlencoded \ n”); client.print(“ Content-Length:”); client.print(postStr.length()); client.print(“ \ n \ n”); client.print(postStr);
最后,这就是ThingSpeak仪表板上的数据外观
最后一步完成了有关基于IoT的智能灌溉系统的完整教程。请注意,洒水后土壤水分达到所需水平时,请务必关闭电动机。您可以制作一个更智能的系统,其中可以包含对不同作物的不同控制。
如果您在执行此项目时遇到任何问题,请在下面评论或访问我们的论坛以获取更多相关问题及其答案。
在下面找到该项目的完整程序和演示视频。