# 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 ', 'speed ', '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 - установить скорость оборотов (например: rpm 200)") print(" speed - установить скорость шагов в секунду (например: 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()