当前位置:首页Arduino > 正文

Arduino智慧农业之通过MQTT协议接收远程命令,控制灌溉水泵的开关状态

作者:野牛程序员:2023-12-22 13:47:28Arduino阅读 2641

使用Arduino进行智慧农业的灌溉系统控制是一种有效的方式。通过MQTT协议,可以远程发送命令来控制水泵的开关状态。以下是一个简单的示例代码,假设已经安装了PubSubClient库,该库支持MQTT通信。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char *ssid = "你的WiFi名称";
const char *password = "你的WiFi密码";
const char *mqtt_server = "MQTT服务器地址";

const char *mqtt_username = "你的MQTT用户名";
const char *mqtt_password = "你的MQTT密码";
const char *mqtt_client_id = "你的MQTT客户端ID";

const char *subscribe_topic = "你的订阅主题";
const char *pump_control_topic = "控制水泵的主题";

const int pumpPin = D1;  // 水泵连接的引脚

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  pinMode(pumpPin, OUTPUT);
  digitalWrite(pumpPin, LOW);

  Serial.begin(115200);
  delay(10);

  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");

  Serial.println("WiFi连接成功");

  // 连接MQTT服务器
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  while (!client.connected()) {
    Serial.println("尝试连接MQTT服务器...");
    if (client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
      Serial.println("MQTT服务器连接成功");
    } else {
      Serial.print("连接失败, rc=");
      Serial.print(client.state());
      Serial.println(" 重新连接MQTT服务器尝试...");
      delay(5000);
    }
  }

  // 订阅主题
  client.subscribe(subscribe_topic);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }

  client.loop();
}

void callback(char *topic, byte *payload, unsigned int length) {
  Serial.print("收到消息 [");
  Serial.print(topic);
  Serial.print("] ");

  // 将接收到的消息转换为字符串
  String message;
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }

  Serial.println(message);

  // 根据接收到的消息控制水泵
  if (String(topic) == pump_control_topic) {
    if (message == "ON") {
      digitalWrite(pumpPin, HIGH);
      Serial.println("水泵已打开");
    } else if (message == "OFF") {
      digitalWrite(pumpPin, LOW);
      Serial.println("水泵已关闭");
    }
  }
}

void reconnect() {
  // 重新连接WiFi
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");

  // 重新连接MQTT服务器
  while (!client.connected()) {
    Serial.println("尝试重新连接MQTT服务器...");
    if (client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
      Serial.println("MQTT服务器连接成功");
      client.subscribe(subscribe_topic);
    } else {
      Serial.print("连接失败, rc=");
      Serial.print(client.state());
      Serial.println(" 重新连接MQTT服务器尝试...");
      delay(5000);
    }
  }
}

在这个例子中,通过MQTT协议订阅了一个主题(subscribe_topic),并监听了另一个主题(pump_control_topic)用于控制水泵。当接收到“ON”消息时,水泵被打开;当接收到“OFF”消息时,水泵被关闭。

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击