Цель этого руководства — подключить 4 канала реле 5 В через ESP8266 и управлять устройством через ThingsPanel, а затем использовать различные датчики и методы запуска по времени для достижения автоматизации.
1. 4-ходовое реле
2. Плата разработки ESP8266.
3. Внешнее освещение
1. VCC подключен к 5 В ESP8266.
2、ЗЕМЛЯ 接ЗЕМЛЯ
3. IN1 IN2 IN3 IN4 подключены к 16 14 12 13 ESP8266 соответственно.
4. Шнур питания лампы подключается к двум крайним переключателям, соответствующим IN1.
существоватьThingsPanelсередина Создать устройство
Конкретные шаги таковы:
1. Создайте устройство и выберите плагин 4-стороннего реле.
2. При редактировании параметров запомните имя пользователя, пароль и имя пользователя MQTT.
Флэш-кодиспользоватьardruino IDE。
Перед Флэш-кодом помните, что его необходимо изменить.
1. Пароль учетной записи Wi-Fi.
2. Все 404e41c1-f212-f1a5-2a5e-eef508e34088 внутри заменяются вашим собственным именем пользователя MQTT.
// Импортируйте необходимые библиотеки
#include <ESP8266WiFi.h> // для ESP8266 Wi-Fi-соединение
#include <PubSubClient.h> // Клиентская библиотека MQTT
#include <ArduinoJson.h> // Для обработки данных JSON
// SSID и пароль Wi-Fi
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; // Экземпляр Wi-Fi-клиента
PubSubClient client(espClient); // Создайте клиент MQTT для ESP8266WiFi.
// Выводы 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); // Исходное состояние установлено на НИЗКИЙ.
lastRelayStatus[i] = digitalRead(relayPins[i]) == HIGH ? 1 : 0; // Сохранить исходное состояние
}
setupWiFi(); // Подключиться к Wi-Fi
client.setServer(mqtt_server, mqtt_port); // Настройте MQTT-сервер
client.setCallback(callback); // Установите функцию обратного вызова при получении сообщения о подписке
// Продолжайте попытки подключения к серверу MQTT, пока соединение не будет успешным.
while (!client.connected()) {
reconnect();
}
publishRelayStatus(); // опубликовать исходное состояние
nextReportTime = millis() + reportInterval;
}
// Подключиться к Функции Wi-Fi
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]; // Создать строку из полезных данных
}
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; // Если статус изменится, обновите флаг
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,Найдите четырехходовое реле.,Вот и всерабочее оборудование