Категории

DIY Zigbee Кран — Умный шаровый кран своими руками

2025-09-08 22:50:36 | IOT умный дом
Zigbee-совместимый IOT шаровый кран на ESP32

Спойлер - готовые краны с зигби есть в продаже. Статья обзорная, как сделать зигби устройство. Хочешь автоматизировать воду в доме? Управлять краном из Home Assistant? Не покупать дорогие Zigbee-устройства, а сделать своё? Тогда эта статья — для тебя.

Я собрал Zigbee-совместимый шаровый кран на базе ESP32, управляю им через MQTT, а в будущем легко перейду на настоящий Zigbee. Всё — своими руками, с Arduino IDE, с экраном для отладки и питанием от батареек.

📌 Важно: Сейчас устройство использует Wi-Fi + MQTT для совместимости и простоты. Полноценный Zigbee (через CC2652 модуль) будет во второй версии — его легко добавить позже!

📦 Что внутри: компоненты

  • M5Stack Core Basic — ESP32 в корпусе с экраном, кнопками и аккумулятором (~$25)
  • Драйвер мотора L298N или TB6612 — управление в 2 направления (~$3)
  • Мотор с редуктором 12V — поворачивает шаровый кран за 10 сек (~$10)
  • Внешний аккумулятор 12V — для питания мотора
  • Провода, разъёмы, корпус — по вкусу (~$5)
  • MQTT-брокер — Mosquitto на Raspberry Pi или в Docker

Итого: ~$50 — дешевле любого готового Zigbee-крана.

🔌 Схема подключения

M5Stack GPIO 26 → IN1 драйвера (открыть)
M5Stack GPIO 27 → IN2 драйвера (закрыть)
Драйвер → мотор
Питание драйвера и мотора → отдельный 12V аккумулятор
Zigbee Module (пока не используется) → Grove-порт B
    
⚠️ Безопасность: Мотор и драйвер питаются ОТДЕЛЬНО от M5Stack. Не подключай 12V к ESP32 — сожжёшь плату!

💻 Код: Arduino IDE

Установи в Arduino IDE:

#include 
#include 
#include 

// === НАСТРОЙКИ ===
const char* ssid = "ТВОЯ_WIFI";
const char* password = "ТВОЙ_ПАРОЛЬ";
const char* mqtt_server = "192.168.1.100"; // IP твоего MQTT-брокера

#define MOTOR_OPEN_PIN  26
#define MOTOR_CLOSE_PIN 27

#define CMD_TOPIC "zigbee/valve/command"
#define STATE_TOPIC "zigbee/valve/state"

#define MOTOR_RUN_TIME 10000 // 10 сек

WiFiClient espClient;
PubSubClient client(espClient);

bool valveState = false; // false = закрыт, true = открыт
unsigned long lastCheck = 0;
const long checkInterval = 3600000; // 1 час

void runMotor(int direction) {
  digitalWrite(MOTOR_OPEN_PIN,  direction == 1 ? HIGH : LOW);
  digitalWrite(MOTOR_CLOSE_PIN, direction == -1 ? HIGH : LOW);
  if (direction != 0) delay(MOTOR_RUN_TIME);
  digitalWrite(MOTOR_OPEN_PIN, LOW);
  digitalWrite(MOTOR_CLOSE_PIN, LOW);
}

void callback(char* topic, byte* payload, unsigned int length) {
  String msg = "";
  for (int i = 0; i < length; i++) msg += (char)payload[i];

  if (String(topic) == CMD_TOPIC) {
    if (msg == "OPEN") {
      M5.Lcd.println("→ OPEN");
      runMotor(1);
      valveState = true;
      client.publish(STATE_TOPIC, "OPENED");
    } else if (msg == "CLOSE") {
      M5.Lcd.println("→ CLOSE");
      runMotor(-1);
      valveState = false;
      client.publish(STATE_TOPIC, "CLOSED");
    }
  }
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ZigbeeValve")) {
      client.subscribe(CMD_TOPIC);
    } else delay(5000);
  }
}

void setup() {
  M5.begin();
  M5.Lcd.println("Zigbee Valve v1.0");

  pinMode(MOTOR_OPEN_PIN, OUTPUT);
  pinMode(MOTOR_CLOSE_PIN, OUTPUT);
  digitalWrite(MOTOR_OPEN_PIN, LOW);
  digitalWrite(MOTOR_CLOSE_PIN, LOW);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);

  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {
  M5.update();

  if (!client.connected()) reconnect();
  client.loop();

  unsigned long now = millis();
  if (now - lastCheck > checkInterval) {
    lastCheck = now;
    client.publish(STATE_TOPIC, valveState ? "OPENED" : "CLOSED");
  }

  delay(100);
}
    

🏠 Интеграция с Home Assistant

Добавь в configuration.yaml:

switch:
  - platform: mqtt
    name: "Zigbee Valve"
    command_topic: "zigbee/valve/command"
    state_topic: "zigbee/valve/state"
    payload_on: "OPEN"
    payload_off: "CLOSE"
    state_on: "OPENED"
    state_off: "CLOSED"
    

Перезагрузи HA — получишь красивый переключатель в интерфейсе.

💡 Совет: Добавь автоматизацию: «Если протечка — закрыть кран». Или «Открыть кран на 5 мин каждое утро для промывки».

🔋 Энергопотребление и автономность

🚀 Что дальше?

Готовый проект на GitHub: Позже выложу репозиторий с кодом, схемами и 3D-моделью корпуса.

💬 Заключение

Ты не просто купил «умную» игрушку — ты сделал устройство, которое реально решает задачу. Ты понимаешь, как оно работает. Ты можешь его улучшать. Это — настоящий DIY.

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Важно: Блог-эксперимент

Внимание: Cтатьи здесь сгенерированны через нейросеть, не правил ошибки, да и не до этого пока. Блог только запустил. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
НО!
Каждый кейс я делал минимум один раз. Сервера стоят, клиенты довольны, дата-центры не горят.

Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.

Посетителей сегодня: 0


© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA
Кто я | HSH | Контакты и регион