这个教程的目的是通过ESP8266接入4路5v继电器,并实现通过ThingsPanel来控制设备,进而使用各种传感器和时间触发方式,实现自动化。
1、4路继电器
2、ESP8266开发板
3、外接的灯
1、VCC接入ESP8266的5V
2、GND接GND
3、IN1 IN2 IN3 IN4分别接入ESP8266的16 14 12 13
4、灯的电源线接入了IN1对应开关部分的最边上两个
在ThingsPanel中创建设备
具体步骤是:
1、创建设备并选择4路继电器插件
2、在编辑参数位置记住设备用户名、密码、MQTT用户名
刷写代码使用ardruino IDE。
刷写代码之前,记住这些是需要修改的
1、WiFi的账号密码
2、里面所有的404e41c1-f212-f1a5-2a5e-eef508e34088都换成自己MQTT用户名的
// 引入必要的库
#include <ESP8266WiFi.h> // 用于ESP8266 WiFi连接
#include <PubSubClient.h> // MQTT客户端库
#include <ArduinoJson.h> // 用于处理JSON数据
// WiFi的SSID和密码
const char* ssid = "Redmi";
const char* password = "123456789";
// MQTT服务器的相关信息
const char* mqtt_server = "dev.thingspanel.cn";
const int mqtt_port = 1883;
const char* mqtt_user = "404e41c1-f212-f1a5-2a5e-eef508e34089";
const char* mqtt_password = "";
WiFiClient espClient; // WiFi的客户端实例
PubSubClient client(espClient); // 为ESP8266WiFi创建一个MQTT客户端
// 继电器连接的GPIO针脚
const int relayPins[] = {16, 14, 12, 13};
const int numOfRelays = 4;
// 存储上一次继电器状态的数组
int lastRelayStatus[numOfRelays];
// 定义上报状态的时间间隔
unsigned long nextReportTime = 0;
const long reportInterval = 30000; // 30秒
void setup() {
Serial.begin(115200); // 启动串口通信
// 初始化继电器针脚
for (int i = 0; i < numOfRelays; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], LOW); // 初始状态设置为LOW
lastRelayStatus[i] = digitalRead(relayPins[i]) == HIGH ? 1 : 0; // 保存初始状态
}
setupWiFi(); // 连接到WiFi
client.setServer(mqtt_server, mqtt_port); // 设置MQTT服务器
client.setCallback(callback); // 设置当接收到订阅消息时的回调函数
// 保持尝试连接到MQTT服务器,直到连接成功
while (!client.connected()) {
reconnect();
}
publishRelayStatus(); // 发布初始状态
nextReportTime = millis() + reportInterval;
}
// 连接到WiFi的函数
void setupWiFi() {
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
// 等待连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// 当接收到MQTT消息时的回调函数
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (unsigned int i = 0; i < length; i++) {
msg += (char)payload[i]; // 从payload构建字符串
}
DynamicJsonDocument doc(1024);
deserializeJson(doc, msg); // 将字符串解析为JSON
bool stateChanged = false; // 检查继电器状态是否发生变化
for (int i = 1; i <= numOfRelays; i++) {
String key = "switch" + String(i);
if (doc.containsKey(key)) {
int currentStatus = doc[key] == 1 ? HIGH : LOW;
if (digitalRead(relayPins[i - 1]) != currentStatus) {
stateChanged = true; // 如果状态发生变化,更新flag
digitalWrite(relayPins[i - 1], currentStatus); // 更新继电器状态
}
}
}
// 如果状态发生变化,发送更新
if (stateChanged) {
publishRelayStatus();
}
}
// 重新连接到MQTT服务器的函数
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("404e41c1-f212-f1a5-2a5e-eef508e34088", mqtt_user, mqtt_password)) {
Serial.println("connected");
client.subscribe("device/attributes/404e41c1-f212-f1a5-2a5e-eef508e34088");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
}
}
}
// 发布继电器状态的函数
void publishRelayStatus() {
DynamicJsonDocument doc(1024);
for (int i = 1; i <= numOfRelays; i++) {
int currentState = digitalRead(relayPins[i - 1]) == HIGH ? 1 : 0;
doc["switch" + String(i)] = currentState;
if (lastRelayStatus[i - 1] != currentState) {
lastRelayStatus[i - 1] = currentState;
}
}
String relayStatus;
serializeJson(doc, relayStatus); // 将JSON转换为字符串
client.publish("device/attributes", relayStatus.c_str()); // 发布状态
}
void loop() {
if (!client.connected()) {
reconnect(); // 如果失去连接,则尝试重新连接
}
client.loop();
// 检查是否需要发送状态更新
if (millis() >= nextReportTime) {
publishRelayStatus();
nextReportTime = millis() + reportInterval;
}
}
在ThingsPanel中打开设备监控,找到4路继电器,即可操作设备
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。