Категории

Система для слежения за солнцем для батарей на ESP32 + Raspberry Pi + Хомасистент

15.08.2025 13:32 | коды из категории: 2040

Не просто трекер для батарей, это умный узел в гараже будущего
ESP32 слушает время от Raspberry Pi с самописным хомасистентом, и сам встаёт по утрам, как будто на работу, а ночью — ложится спать (и не даёт снегу налипать).

про Система для слежения за солнцем для батарей на ESP32 + Raspberry Pi + Хомасистент

Как это работает?

  1. Raspberry Pi (с твоим хомасистентом) знает точное время и рассчитывает восход и закат для Калужской области.
  2. Каждый вечер Pi отправляет команду: tracker/mode/set → night
  3. Каждое утро: tracker/mode/set → morning
  4. ESP32 слушает MQTT-брокер (например, Mosquitto) и реагирует.

Что нужно добавить?

Код для ESP32 (дополнение к предыдущему)

#include <WiFi.h>
#include <PubSubClient.h>

// WiFi
const char* WIFI_SSID = "твой_вайфай";
const char* WIFI_PASS = "пароль";

// MQTT
const char* MQTT_SERVER = "192.168.1.100"; // IP твоего Raspberry Pi
const char* MQTT_CLIENT_NAME = "solar_tracker";
const char* TOPIC_SET_MODE = "tracker/mode/set";
const char* TOPIC_STATUS = "tracker/status";

WiFiClient wifiClient;
PubSubClient client(wifiClient);

void setup_wifi() {
  delay(10);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}

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) == TOPIC_SET_MODE) {
    if (message == "night") {
      move_to_night_position(); // Горизонтально
    } else if (message == "morning") {
      move_to_start_position(); // Под углом 30–40°
    }
  }
}

void reconnect_mqtt() {
  while (!client.connected()) {
    if (client.connect(MQTT_CLIENT_NAME)) {
      client.subscribe(TOPIC_SET_MODE);
      client.publish(TOPIC_STATUS, "online");
    } else {
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect_mqtt();
  }
  client.loop();

  // Остальной код трекера (с датчиками) — остаётся
  // Но можно отключать днём, если используешь GPS-режим
}

Функции для позиций

void move_to_night_position() {
  // Двигаем вертикальный механизм, чтобы панель стала горизонтально
  // Это помогает снегу не задерживаться
  digitalWrite(MOTOR_V_IN1, LOW);
  digitalWrite(MOTOR_V_IN2, HIGH);
  delay(300); // Пример — подбери под свою систему
  stopMotor(MOTOR_V_IN1, MOTOR_V_IN2);
}

void move_to_start_position() {
  // Возвращаем в стартовый угол (например, 35°)
  digitalWrite(MOTOR_V_IN1, HIGH);
  digitalWrite(MOTOR_V_IN2, LOW);
  delay(250);
  stopMotor(MOTOR_V_IN1, MOTOR_V_IN2);
}

Скрипт на Raspberry Pi (Python)

Создай файл solar_scheduler.py:

import paho.mqtt.client as mqtt
import ephem
import time
from datetime import datetime, timedelta

# Настройки
observer = ephem.Observer()
observer.lat = '54.5'   # Калужская область
observer.lon = '36.5'
observer.date = datetime.utcnow()

client = mqtt.Client()
client.connect("localhost", 1883, 60)

def get_sunrise_sunset():
    sun = ephem.Sun()
    sun.compute(observer)
    rise = observer.next_rising(sun)
    set_time = observer.next_setting(sun)
    return rise.datetime(), set_time.datetime()

while True:
    try:
        sunrise, sunset = get_sunrise_sunset()
        now = datetime.now()

        # За 10 минут до восхода — режим "утро"
        if sunrise - timedelta(minutes=10) <= now < sunrise + timedelta(minutes=5):
            client.publish("tracker/mode/set", "morning")
            time.sleep(600)  # Не спамим

        # После заката — режим "ночь"
        if now >= sunset:
            client.publish("tracker/mode/set", "night")
            time.sleep(600)

    except Exception as e:
        print("Ошибка:", e)

    time.sleep(300)  # Проверять каждые 5 минут

Запуск на старте (через cron)

Добавь в crontab -e:

@reboot sleep 20 && python3 /home/pi/solar_scheduler.py &

Режимы работы

ВремяРежимДействие
НочьГоризонтальноСнег не ложится, ветер скользит
УтроСтартовый уголГотов к приёму солнца
ДеньАвтослежениеМаксимум энергии
РучнойMQTT-командаНапример: tracker/mode/set → manual

Дополнительно: можно добавить

Теги: #хомасистент #esp32 #raspberry pi #слежение_за_солнцем #ардуино #arduino #солнечные_панели

Комментарии

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

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

← Назад к списку

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

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

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


кто я | книга | контакты без контактов

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