Не просто трекер для батарей, это умный узел в гараже будущего
ESP32 слушает время от Raspberry Pi с самописным хомасистентом, и сам встаёт по утрам, как будто на работу, а ночью — ложится спать (и не даёт снегу налипать).
tracker/mode/set → nighttracker/mode/set → morningWiFi, PubSubClient для Arduino.#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);
}
Создай файл 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 минут
Добавь в crontab -e:
@reboot sleep 20 && python3 /home/pi/solar_scheduler.py &
| Время | Режим | Действие |
|---|---|---|
| Ночь | Горизонтально | Снег не ложится, ветер скользит |
| Утро | Стартовый угол | Готов к приёму солнца |
| День | Автослежение | Максимум энергии |
| Ручной | MQTT-команда | Например: tracker/mode/set → manual |
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!