// Підключення бібліотек
#include <WiFi.h> // Бібліотека для роботи з Wi-Fi
#include <PubSubClient.h> // Бібліотека для роботи з MQTT-протоколом
// Константи для налаштування Wi-Fi
const char* ssid = "Wokwi-GUEST"; // Ім'я мережі Wi-Fi
const char* password = ""; // Пароль до мережі Wi-Fi
// Константи для MQTT-з'єднання
const char* mqttServer = "broker.emqx.io"; // Адреса MQTT-брокера
const int mqttPort = 1883; // Порт MQTT-брокера
WiFiClient espClient; // Клієнт для з'єднання через Wi-Fi
PubSubClient client(espClient); // MQTT-клієнт, який використовує Wi-Fi клієнт
// Константи для пінів реле
const int relay1Pin = 22; // Пін для першого реле
const int relay2Pin = 21; // Пін для другого реле
// Змінна для лічильника стану
int buttonState = 1; // Поточний стан кнопки
// Функція для публікації стану реле
void publishRelayState(int state) {
char message[2]; // Буфер для збереження стану
snprintf(message, sizeof(message), "%d", state); // Форматування стану в рядок
client.publish("ESPStateRELE", message); // Публікація стану у топік MQTT
}
// Функція для керування реле залежно від стану
void handleRelayState(int state) {
Serial.print("Перемикання реле для стану: "); // Виведення повідомлення про зміну стану
Serial.println(state);
// Залежно від стану керуємо реле
switch (state) {
case 1:
digitalWrite(relay1Pin, HIGH); // Увімкнути перше реле
digitalWrite(relay2Pin, LOW); // Вимкнути друге реле
Serial.println("Реле 1: Увімкнено, Реле 2: Вимкнено");
break;
case 2:
digitalWrite(relay1Pin, HIGH); // Увімкнути перше реле
digitalWrite(relay2Pin, HIGH); // Увімкнути друге реле
Serial.println("Реле 1: Увімкнено, Реле 2: Увімкнено");
break;
case 3:
digitalWrite(relay1Pin, LOW); // Вимкнути перше реле
digitalWrite(relay2Pin, HIGH); // Увімкнути друге реле
Serial.println("Реле 1: Вимкнено, Реле 2: Увімкнено");
break;
case 4:
digitalWrite(relay1Pin, LOW); // Вимкнути перше реле
digitalWrite(relay2Pin, LOW); // Вимкнути друге реле
Serial.println("Реле 1: Вимкнено, Реле 2: Вимкнено");
break;
default:
Serial.println("Невідомий стан кнопки"); // Повідомлення про помилковий стан
break;
}
// Публікація стану реле
publishRelayState(state);
}
// Функція для підключення до Wi-Fi
void setup_wifi() {
delay(10); // Затримка для стабільності
Serial.print("Підключення до WiFi..."); // Початок підключення
WiFi.begin(ssid, password); // Запуск підключення до Wi-Fi
// Очікуємо підключення до Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(500); // Затримка між перевірками
Serial.print("."); // Виведення індикатора
}
Serial.print("\nWiFi підключено! Адреса: "); // Успішне підключення
Serial.println(WiFi.localIP()); // Виведення IP-адреси пристрою
}
// Обробка вхідних повідомлень від MQTT-брокера
void callback(char* topic, byte* payload, unsigned int length) {
String message = ""; // Змінна для збереження отриманого повідомлення
for (int i = 0; i < length; i++) {
message += (char)payload[i]; // Формуємо рядок з отриманих байтів
}
// Перевірка теми повідомлення
if (String(topic) == "ESPButton") {
if (message == "1") { // Якщо отримано значення "1"
buttonState++; // Збільшуємо лічильник стану
if (buttonState > 4) { // Якщо стан більше 4, скидаємо до 1
buttonState = 1;
}
Serial.print("Новий стан: "); // Виводимо новий стан
Serial.println(buttonState);
handleRelayState(buttonState); // Виклик функції для зміни стану реле
}
}
}
// Функція для підключення до MQTT-брокера
void reconnect() {
while (!client.connected()) { // Перевірка підключення MQTT-клієнта
Serial.print("Підключення до MQTT-брокеру..."); // Спроба підключення
Serial.println(".");
if (client.connect("ESP32RELE", "user1", "user2")) { // Підключення до брокера
Serial.println("MQTT-брокер підключено!"); // Успішне підключення
client.subscribe("ESPButton"); // Підписка на топік "ESPButton"
} else {
Serial.print(" Помилка підключення, rc="); // Виведення коду помилки
Serial.print(client.state());
Serial.println(" Спроба через 5 секунд");
delay(5000); // Затримка перед наступною спробою
}
}
}
// Функція налаштування
void setup() {
Serial.begin(115200); // Ініціалізація послідовного з'єднання
// Налаштування пінів реле як вихід
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
// Початковий стан реле: вимкнені
digitalWrite(relay1Pin, LOW);
digitalWrite(relay2Pin, LOW);
setup_wifi(); // Підключення до Wi-Fi
client.setServer(mqttServer, mqttPort); // Налаштування MQTT-брокера
client.setCallback(callback); // Прив'язка функції обробки повідомлень
}
// Головний цикл програми
void loop() {
if (!client.connected()) { // Якщо MQTT-клієнт не підключений
reconnect(); // Спроба повторного підключення
}
client.loop(); // Обробка подій MQTT
}