大多数农民使用大部分耕地,很难到达和追踪大片土地的每个角落。有时可能会出现不均匀的水洒。这导致农作物质量不佳,进一步导致经济损失。在这种情况下,使用最新物联网技术的智能灌溉系统很有帮助,并有助于轻松耕作。
智能灌溉系统具有广泛的自动化整个灌溉系统的范围。在这里,我们正在使用 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。");
}
}
评论
查看更多