Как это работает?
- Raspberry Pi (с твоим хомасистентом) знает точное время и рассчитывает восход и закат для Калужской области.
- Каждый вечер Pi отправляет команду:
tracker/mode/set → night - Каждое утро:
tracker/mode/set → morning - ESP32 слушает MQTT-брокер (например, Mosquitto) и реагирует.
Что нужно добавить?
- Mosquitto MQTT-брокер на Raspberry Pi.
- WiFi на ESP32 (у него же есть!)
- Библиотеки:
WiFi,PubSubClientдля Arduino. - Простой скрипт на Python (на Pi), который публикует топики по расписанию.
Код для 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 |
Дополнительно: можно добавить
- Веб-интерфейс — смотри положение панели в браузере.
- Голосовое управление — «Алиса, разбуди солнечную панель».
- Резервный GPS-режим — если интернет пропал, трекер сам знает, где солнце.
Комментарии
Пока нет комментариев. Будьте первым!