Files
ozone-tech_owl_prime/backend_control/main.py
2026-07-06 23:12:12 +07:00

111 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# mqtt_motor_control.py
import paho.mqtt.client as mqtt
import time
# Настройки MQTT
MQTT_BROKER = "192.168.31.225" # Адрес MQTT брокера
MQTT_PORT = 1883 # Порт MQTT
MQTT_USER = "test" # Имя пользователя
MQTT_PASSWORD = "1234" # Пароль
# Топики
MQTT_CONTROL_TOPIC = "motor/control/command" # Топик для управления двигателем
MQTT_DRIVER_TOPIC = "motor/control/driver" # Топик для управления драйвером
MQTT_SPEED_TOPIC = "motor/control/step_per_sec" # Топик для установки скорости шагов в секунду
MQTT_RPM_TOPIC = "motor/control/rpm" # Топик для установки скорости оборотов в минуту
MQTT_RESET_STEPS_TOPIC = "motor/control/totalsteps/reset" # Топик для сброса шагов
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT broker")
# Подписка на все топики для получения обратной связи
client.subscribe("motor/feedback/#")
else:
print(f"Failed to connect, return code {rc}")
def send_command(topic, command):
"""Отправка команды в MQTT топик"""
client.publish(topic, command)
print(f"Sent command: {command} to topic {topic}")
def handle_command(command):
"""Обработка команд"""
parts = command.split()
if not parts:
return
cmd = parts[0].lower()
# Используем словарь для обработки команд
command_handlers = {
"start": lambda: send_command(MQTT_CONTROL_TOPIC, "start"),
"stop": lambda: send_command(MQTT_CONTROL_TOPIC, "stop"),
"turnon": lambda: send_command(MQTT_DRIVER_TOPIC, "turnon"),
"turnoff": lambda: send_command(MQTT_DRIVER_TOPIC, "turnoff"),
"resetsteps": lambda: send_command(MQTT_RESET_STEPS_TOPIC, "reset"),
}
# Обработка команд с параметрами
if cmd == "rpm" and len(parts) > 1:
try:
rpm = int(parts[1])
send_command(MQTT_RPM_TOPIC, str(rpm))
except ValueError:
print("Invalid RPM value. Please enter a number.")
elif cmd == "speed" and len(parts) > 1:
try:
speed = int(parts[1])
send_command(MQTT_SPEED_TOPIC, str(speed))
except ValueError:
print("Invalid speed value. Please enter a number.")
elif cmd in command_handlers:
command_handlers[cmd]()
else:
print("Unknown command. Use 'start', 'stop', 'rpm <value>', 'speed <value>', 'resetsteps', or 'exit'")
def main():
# Создание клиента MQTT
global client
client = mqtt.Client()
# Установка учетных данных
client.username_pw_set(MQTT_USER, MQTT_PASSWORD)
# Установка функции обратного вызова при подключении
client.on_connect = on_connect
# Подключение к брокеру
try:
client.connect(MQTT_BROKER, MQTT_PORT, 60)
client.loop_start() # Запуск цикла обработки в отдельном потоке
print("MQTT Motor Controller")
print("Commands:")
print(" start - запустить двигатель")
print(" stop - остановить двигатель")
print(" turnon - включить управление двигателем")
print(" turnoff - выключить управление двигателем")
print(" rpm <value> - установить скорость оборотов (например: rpm 200)")
print(" speed <value> - установить скорость шагов в секунду (например: speed 2000)")
print(" resetsteps - сбросить счетчик шагов")
print(" exit - выход")
while True:
command = input("\nEnter command: ").strip()
if command == "exit":
break
handle_command(command)
except KeyboardInterrupt:
print("\nShutting down...")
except Exception as e:
print(f"Error: {e}")
finally:
client.loop_stop()
client.disconnect()
print("Disconnected")
if __name__ == "__main__":
main()