ESP8266接入4路继电器遥控灯——通过ThingsPanel

发布日期:

这个教程的目的是通过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对应开关部分的最边上两个

创建设备

具体步骤是:

1、创建设备并选择4路继电器插件

2、在编辑参数位置记住设备用户名、密码、MQTT用户名

刷写代码

刷写代码使用ardruino IDE。

刷写代码之前,记住这些是需要修改的

1、WiFi的账号密码

2、里面所有的404e41c1-f212-f1a5-2a5e-eef508e34088都换成自己MQTT用户名的

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

// 替换以下的WiFi信息
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-eef508e34000";
const char* mqtt_password = "";

WiFiClient espClient;
PubSubClient client(espClient);

// 继电器连接的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); // 初始化为低电平
  }
  for (int i = 0; i < numOfRelays; i++) {
    lastRelayStatus[i] = digitalRead(relayPins[i]) == HIGH ? 1 : 0;
  }

  setupWiFi();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);

  // 确保首先连接到MQTT服务器
  while (!client.connected()) {
    reconnect();
  }

  // 向平台发送当前状态
  publishRelayStatus();

  nextReportTime = millis() + reportInterval;  // 初始化下次上报时间
}


void setupWiFi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  String msg;

  for (unsigned int i = 0; i < length; i++) {
    msg += (char)payload[i];
  }
  // 输出接收的报文
  Serial.print("Received Message: ");
  Serial.println(msg);

  DynamicJsonDocument doc(1024);
  deserializeJson(doc, msg);
  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;  // 状态发生变化
        digitalWrite(relayPins[i - 1], currentStatus);
      }
    }
  }

  // 如果有继电器的状态发生变化,则发送状态
  if (stateChanged) {
    publishRelayStatus();
  }
}


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"); // 替换你的MQTT控制主题
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      //delay(5000);
    }
  }
}

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);
  // 输出发送的报文
  Serial.print("Publishing Message: ");
  Serial.println(relayStatus);

  client.publish("device/attributes", relayStatus.c_str());
}


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

  // 检查是否到了上报状态的时间
  if (millis() >= nextReportTime) {
    publishRelayStatus();
    nextReportTime = millis() + reportInterval;  // 更新下次上报时间
  }
}

操作设备

在ThingsPanel中打开设备监控,找到4路继电器,即可操作设备

Github
Gitee
微信交流群
QQ交流群
商务咨询
北京极益科技有限公司 版权所有 ICP:京ICP备15045763号-12