作者 by 超米 / 2024-12-14 / 暂无评论 / 100 个足迹
#include <WiFi.h>
#include <PubSubClient.h>
// WiFi 设置
const char* ssid = "your_SSID"; // 替换为你的Wi-Fi名称
const char* password = "your_PASSWORD"; // 替换为你的Wi-Fi密码
// MQTT 设置
const char* mqtt_server = "your_mqtt_broker_host"; // 替换为你的MQTT代理的IP地址或域名
const int mqtt_port = 1883; // 默认端口是1883,如果你的MQTT代理使用其他端口,修改此值
const char* mqtt_user = "your_mqtt_username"; // 如果有的话,替换为你的MQTT用户名
const char* mqtt_password = "your_mqtt_password"; // 如果有的话,替换为你的MQTT密码
const char* mqtt_topic_light = "home/light"; // 灯的主题
const char* mqtt_topic_buzzer = "home/buzzer"; // 蜂鸣器的主题
// GPIO 引脚设置
const int light_pin = 23; // 替换为你连接灯的GPIO引脚
const int buzzer_pin = 22; // 替换为你连接蜂鸣器的GPIO引脚
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// 启动串口监视器
Serial.begin(115200);
// 设置GPIO引脚为输出模式
pinMode(light_pin, OUTPUT);
pinMode(buzzer_pin, OUTPUT);
digitalWrite(light_pin, LOW); // 初始化灯为关闭
digitalWrite(buzzer_pin, LOW); // 初始化蜂鸣器为关闭
// 连接Wi-Fi
connectWiFi();
// 设置MQTT服务器
client.setServer(mqtt_server, mqtt_port);
client.setCallback(mqttCallback);
}
void loop() {
// 保持与MQTT服务器的连接
if (!client.connected()) {
reconnect();
}
client.loop();
}
// 连接Wi-Fi函数
void connectWiFi() {
Serial.println();
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Connected to WiFi");
}
// 重新连接MQTT服务器
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// 尝试连接MQTT服务器
if (client.connect("ESP32_Client", mqtt_user, mqtt_password)) {
Serial.println("Connected to MQTT server");
// 订阅主题
client.subscribe(mqtt_topic_light);
client.subscribe(mqtt_topic_buzzer);
} else {
Serial.print("Failed to connect, rc=");
Serial.print(client.state());
delay(5000); // 如果连接失败,等待5秒再尝试
}
}
}
// 处理MQTT消息的回调函数
void mqttCallback(char* topic, byte* payload, unsigned int length) {
// 将接收到的消息转换为字符串
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
// 判断接收到的主题并根据消息控制GPIO
if (String(topic) == mqtt_topic_light) {
if (message == "ON") {
digitalWrite(light_pin, HIGH); // 打开灯
Serial.println("Light ON");
} else if (message == "OFF") {
digitalWrite(light_pin, LOW); // 关闭灯
Serial.println("Light OFF");
}
}
else if (String(topic) == mqtt_topic_buzzer) {
if (message == "ON") {
digitalWrite(buzzer_pin, HIGH); // 开启蜂鸣器
Serial.println("Buzzer ON");
} else if (message == "OFF") {
digitalWrite(buzzer_pin, LOW); // 关闭蜂鸣器
Serial.println("Buzzer OFF");
}
}
}
独特见解