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
