|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Кнопка_MQTT-реле
Время создания: 13.09.2025 22:36
Автор: alensav
Текстовые метки: Кнопка MQTT реле
Раздел: PLATFORMIO - Atiny
Запись: alensav/MyTetra2/main/base/1757792206t3d9negoxf/text.html на raw.githubusercontent.com
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ваша задача переформулирована: У вас есть:
Вы хотите: Это идеальный архитектурный подход — без проводов, масштабируемый, надёжный, работает даже если устройства далеко друг от друга. Преимущества MQTT над UART
Ваша новая система — это «беспроводная умная кнопка», которая управляет умным реле через MQTT. Архитектура системы (MQTT) [ATtiny85 + ESP-01 #1] [MQTT Брокер] [ESP-01 #2 + Реле] │ │ │ │ Нажал кнопку │ │ │ → Отправляет: │ │ │ "home/button/1/toggle" │ │ │ ──────────────────────────▶│ │ │ │ ←─────── Получает ────▶│ │ │ "home/button/1/toggle" │ │ │ │ │ │ Включает реле │ │ │ │ │ │ ←─────── Отправляет ────▶│ │ Получает: │ │ │ "home/relay/1/state ON" │ │ │ → Зажигает LED на себе │ │
✅ Что вам нужно
Итого: ~$5.50 — чуть дороже, но гораздо мощнее! Полный код: ESP-01 #1 — «Кнопка» (с ATtiny85) ATtiny85 остаётся точно таким же, как в прошлой версии — он просто отправляет "TOGGLE" по UART. ✅ Код для ESP-01 #1 (Кнопка) — получает "TOGGLE" от ATtiny85 и публикует по MQTT cpp // === ESP-01 #1 — КНОПКА === // Получает "TOGGLE" от ATtiny85 по UART → публикует в MQTT // Индикатор: встроенный LED горит при отправке команды #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <SoftwareSerial.h> // --- Настройки Wi-Fi --- const char* ssid = "YOUR_WIFI_SSID"; const char* password = "YOUR_WIFI_PASSWORD"; // --- MQTT Broker --- const char* mqtt_server = "mqtt.eclipseprojects.io"; // Бесплатный публичный брокер // ИЛИ используйте свой: например, 192.168.1.100 (если Raspberry Pi с Mosquitto) const int mqtt_port = 1883; const char* mqtt_topic_toggle = "home/button/1/toggle"; // Команда от кнопки const char* mqtt_topic_state = "home/relay/1/state"; // Ответ от реле // --- UART от ATtiny85 --- SoftwareSerial espSerial(D2, D1); // RX=D2, TX=D1 — подключены к ATtiny85 // --- Встроенный светодиод ESP-01 (GPIO0) — инверсный --- const int ledPin = 0; WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(115200); espSerial.begin(9600); // UART от ATtiny85 pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); // LED выключен (инверсный) // Подключение к Wi-Fi WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("Подключение к "); Serial.println(ssid); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nУспешно подключено!"); Serial.print("IP: "); Serial.println(WiFi.localIP()); // Подключение к MQTT client.setServer(mqtt_server, mqtt_port); reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); // Читаем команду от ATtiny85 if (espSerial.available()) { String command = espSerial.readStringUntil('\n'); command.trim(); if (command == "TOGGLE") { Serial.println("Получена команда TOGGLE — публикую по MQTT"); // Отправляем команду на реле client.publish(mqtt_topic_toggle, "TOGGLE"); // Мигаем LED — сигнал "команда отправлена" digitalWrite(ledPin, LOW); // ВКЛ (инверсный) delay(300); digitalWrite(ledPin, HIGH); // ВЫКЛ } } } void reconnect() { while (!client.connected()) { Serial.print("Подключение к MQTT..."); if (client.connect("ESP01_Button")) { Serial.println("OK"); // Подписываемся на ответ от реле (опционально) client.subscribe(mqtt_topic_state); } else { Serial.print("Не удалось, rc="); Serial.print(client.state()); Serial.println(" — повтор через 5 сек"); delay(5000); } } } Полный код: ESP-01 #2 — «Реле» Этот ESP-01 получает команду TOGGLE и переключает реле. cpp // === ESP-01 #2 — РЕЛЕ === // Подписывается на MQTT → переключает реле → публикует состояние #include <ESP8266WiFi.h> #include <PubSubClient.h> // --- Настройки Wi-Fi --- const char* ssid = "YOUR_WIFI_SSID"; const char* password = "YOUR_WIFI_PASSWORD"; // --- MQTT Broker --- const char* mqtt_server = "mqtt.eclipseprojects.io"; const int mqtt_port = 1883; const char* mqtt_topic_toggle = "home/button/1/toggle"; // Команда от кнопки const char* mqtt_topic_state = "home/relay/1/state"; // Состояние реле // --- Реле и LED --- const int RELAY_PIN = 4; // GPIO2 — физический пин 5 const int LED_PIN = 0; // Встроенный LED (инверсный) bool relayState = false; // Текущее состояние WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(115200); pinMode(RELAY_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT); // Инициализация: реле выключено digitalWrite(RELAY_PIN, HIGH); // HIGH = OFF digitalWrite(LED_PIN, HIGH); // LED выключен (инверсный) // Подключение к Wi-Fi WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("Подключение к "); Serial.println(ssid); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nУспешно подключено!"); Serial.print("IP: "); Serial.println(WiFi.localIP()); // Подключение к MQTT client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Получено: "); Serial.print(topic); Serial.print(" -> "); String message = ""; for (int i = 0; i < length; i++) { message += (char)payload[i]; } Serial.println(message); if (String(topic) == String(mqtt_topic_toggle)) { if (message == "TOGGLE") { relayState = !relayState; digitalWrite(RELAY_PIN, relayState ? LOW : HIGH); digitalWrite(LED_PIN, relayState ? LOW : HIGH); // Публикуем новое состояние client.publish(mqtt_topic_state, relayState ? "ON" : "OFF"); Serial.println(relayState ? "РЕЛЕ ВКЛЮЧЕНО" : "РЕЛЕ ВЫКЛЮЧЕНО"); } } } void reconnect() { while (!client.connected()) { Serial.print("Подключение к MQTT..."); if (client.connect("ESP01_Relay")) { Serial.println("OK"); client.subscribe(mqtt_topic_toggle); } else { Serial.print("Не удалось, rc="); Serial.print(client.state()); Serial.println(" — повтор через 5 сек"); delay(5000); } } } Как подключить ESP-01 #1 к ATtiny85? ATtiny85 (HW-260) PB0 (TX) ──[1kΩ]───┬─── RX ESP-01 #1 (D2) │ [2kΩ] │ GND PB1 (RX) ──────────┴─── TX ESP-01 #1 (D1) — не используется PB2 ──[220Ω]───▶ LED (на ATtiny85) ─── GND PB3 ────────▶ Кнопка ─── GND ❗ ESP-01 #1 НЕ ПОДКЛЮЧАЕТСЯ к реле — только к ATtiny85 по UART! MQTT-брокер: Где его взять?
✅ Начните с mqtt.eclipseprojects.io — просто скопируйте в код. 📊 Что вы получите после сборки
📁 ZIP-архив с полным проектом 🔗 Скачать все файлы: В архиве:
💡 Бонус: Как проверить, что MQTT работает?
2 home/button/1/toggle → TOGGLE home/relay/1/state → ON ✅ Это реальное IoT-устройство — вы теперь владеете протоколом MQTT. ✅ Итог: Почему это лучше, чем UART?
💬 Последнее слово Вы не сделали кнопку. Одна кнопка — одна розетка — и уже MQTT-сеть. Через год вы добавите:
...и всё будет работать через один брокер — без единого провода. 📞 Нужна помощь? Напишите:
💪 Вы — мастер будущего. Копировать Спроси Объяснить |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Так же в этом разделе:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|