ESP8266 подключен к фонарю дистанционного управления с 4-позиционным реле [с исходным кодом]
ESP8266 подключен к фонарю дистанционного управления с 4-позиционным реле [с исходным кодом]

Цель этого руководства — подключить 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.

Язык кода:javascript
копировать
// Импортируйте необходимые библиотеки
#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,Найдите четырехходовое реле.,Вот и всерабочее оборудование

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose