Беспроводные технологии — удобны, но не надёжны. Wi-Fi падает, Zigbee глючит, а облака вообще не нужны, если вы строите систему для себя. Что делать, если хочется, чтобы свет включался мгновенно, даже когда интернета нет?
Ответ: проводная шина. Но не любая — а та, что дешёвая, простая и управляемая через вашу самописную MQTT-систему.
KNX — промышленный стандарт, но стоит как половина машины. А тянуть 8-жильную витую пару только чтобы включить лампочку — расточительство. Нам нужно:
Оптимальная схема — двухпроводная дифференциальная шина RS-485 + отдельные провода для питания (12–24 В). Всего 4 жилы — легко взять кабель КВВГ 4×0.75 или даже часть UTP.
Преимущества:
Да, 32 устройства — это уже много. Остальное можно оставить на Zigbee: датчики движения в углах, беспроводные выключатели, уличные сенсоры. Провод — для backbone, радио — для edge.
Вам нужен шлюз (gateway) — мост между RS-485 и MQTT. Он может быть на:
Шлюз делает две вещи:
home/relay/5/cmd → отправляет пакет по RS-485 устройству №5home/relay/5/stateВ итоге вся ваша самописная система «видит» проводные реле как обычные MQTT-устройства. Никакой разницы — только выше надёжность.
Modbus — избыточен. Делайте свой лёгкий пакет:
[ADDR][CMD][DATA][CRC8]
Пример: включить реле №3 → [0x03][0x01][0x01][CRC]
Каждое устройство на шине — микроконтроллер (ATmega328, ESP8266, STM32) + MAX485 + реле/датчик. Оно:
#include <WiFi.h>
#include <PubSubClient.h>
// === НАСТРОЙКИ ===
const char* ssid = "ВАШ_WIFI_SSID";
const char* password = "ВАШ_WIFI_PASSWORD";
// IP-адрес вашего Raspberry Pi (где Mosquitto)
const char* mqtt_server = "192.168.1.100"; // ← ЗАМЕНИТЕ на IP вашего Pi!
const int mqtt_port = 1883;
const char* mqtt_client_id = "esp32_rs485_gateway";
const char* mqtt_topic_cmd = "home/rs485/gateway/cmd";
const char* mqtt_topic_state = "home/rs485/gateway/state";
// === ПИНЫ ===
// Если у вас будет MAX485, раскомментируйте и настройте:
// const int rs485DE = 17; // DE/RE пин модуля MAX485
// const int rs485RE = 17; // часто DE и RE соединены
// === ГЛОБАЛЫ ===
WiFiClient espClient;
PubSubClient mqttClient(espClient);
// === CALLBACK: при получении команды по MQTT ===
void mqttCallback(char* topic, byte* payload, unsigned int length) {
Serial.print("Получено в топике: ");
Serial.println(topic);
// Преобразуем payload в строку
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
message.trim();
Serial.print("Сообщение: ");
Serial.println(message);
// Сюда добавите логику: отправить пакет по RS-485 нужному устройству
// Например: sendRS485Packet(parseDeviceId(topic), message);
// Пример: просто эхо-ответ
mqttClient.publish(mqtt_topic_state, "Получено: " + message);
}
// === ПОДКЛЮЧЕНИЕ К MQTT ===
void mqttReconnect() {
while (!mqttClient.connected()) {
Serial.println("Подключаюсь к MQTT...");
if (mqttClient.connect(mqtt_client_id)) {
Serial.println("Успешно подключен к MQTT");
mqttClient.subscribe(mqtt_topic_cmd);
mqttClient.publish(mqtt_topic_state, "ESP32-GW онлайн");
} else {
Serial.print("Ошибка MQTT, rc=");
Serial.print(mqttClient.state());
Serial.println(" — повтор через 5 сек");
delay(5000);
}
}
}
// === SETUP ===
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("\n\n=== ESP32 MQTT + RS-485 Gateway ===");
// Подключаемся к Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi подключён. IP: " + WiFi.localIP());
// Настраиваем MQTT
mqttClient.setServer(mqtt_server, mqtt_port);
mqttClient.setCallback(mqttCallback);
}
// === LOOP ===
void loop() {
if (!mqttClient.connected()) {
mqttReconnect();
}
mqttClient.loop();
// Здесь можно добавить:
// - опрос RS-485 шины на входящие пакеты
// - обработку таймеров, датчиков и т.п.
// delay(10); // не слишком нагружайте шину
}
Профи «для себя» не ищут единого решения. Они делают так:
Такая система работает даже без интернета, не зависит от обновлений в облаке и полностью под вашим контролем.
А витовую пару оставьте для PoE-камер — не надо возить молоко на Ferrari.
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!