Arduino智慧农业之通过MQTT协议接收远程命令,控制灌溉水泵的开关状态
作者:野牛程序员:2023-12-22 13:47:28Arduino阅读 2776
使用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

