使用ESP8266和DHT11构建基于物联网的智能灌溉系统

使用ESP8266和DHT11构建基于物联网的智能灌溉系统,第1张

  大多数农民使用大部分耕地,很难到达和追踪大片土地的每个角落。有时可能会出现不均匀的水洒。这导致农作物质量不佳,进一步导致经济损失。在这种情况下,使用最新物联网技术的智能灌溉系统很有帮助,并有助于轻松耕作。

  智能灌溉系统具有广泛的自动化整个灌溉系统的范围。在这里,我们正在使用 ESP8266 NodeMCU 模块和 DHT11 传感器构建基于物联网的灌溉系统。它不仅会根据土壤中的水分含量自动灌溉水,还会将数据发送到 ThingSpeak 服务器以跟踪土地状况。该系统将包括一个水泵,该水泵将用于根据土地环境条件(如湿度、温度和湿度)向土地洒水。

  我们之前构建了类似的自动植物灌溉系统,它在移动设备上发送警报,但不在物联网云上。除此之外,雨水报警和土壤湿度检测电路也有助于构建智能灌溉系统。

  在开始之前,重要的是要注意不同的作物需要不同的土壤湿度、温度和湿度条件。因此,在本教程中,我们使用的这种作物需要大约 50-55% 的土壤水分。因此,当土壤水分流失到 50% 以下时,电机泵将自动启动洒水,并继续洒水,直到水分达到 55%,然后泵将关闭。传感器数据将在定义的时间间隔内发送到 ThingSpeak 服务器,以便可以从世界任何地方对其进行监控。

  所需组件

  NodeMCU ESP8266

  土壤湿度传感器模块

  水泵模块

  继电器模块

  DHT11

  连接电线

  电路原理图

  该物联网智能灌溉系统的电路图如下:

使用ESP8266和DHT11构建基于物联网的智能灌溉系统,pYYBAGMMisGAGWM8AAEkDupyKak829.png,第2张

使用ESP8266和DHT11构建基于物联网的智能灌溉系统,poYBAGMMir2ADVDHAAbQ2jlrNVw332.png,第3张

  为自动灌溉系统编程 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 上的外观

使用ESP8266和DHT11构建基于物联网的智能灌溉系统,pYYBAGMMiqiAI7f7AAC7jW07bP4562.png,第4张

  最后一步完成了基于物联网的智能灌溉系统的完整教程。请注意,当洒水后土壤湿度达到所需水平时,关闭电机非常重要。您可以制作一个更智能的系统,该系统可以包含对不同作物的不同控制。
#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。");

}

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2999814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-26
下一篇 2022-09-26

发表评论

登录后才能评论

评论列表(0条)

保存