前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP8266接入4路继电器遥控灯【附源码】

ESP8266接入4路继电器遥控灯【附源码】

原创
作者头像
用户9549256
修改2023-08-24 07:41:33
5660
修改2023-08-24 07:41:33
举报
文章被收录于专栏:开源物联网开源物联网

这个教程的目的是通过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用户名的

代码语言:javascript
复制
// 引入必要的库
#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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 所使用的设备
  • 接线方式
  • 创建设备
  • 刷写代码
  • 操作设备
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档