Загрузка данных


#include <Servo.h>

Servo servo;

const int motorPin = 8;

const int trigPin = 6;
const int echoPin = 7;

bool autoMode = false;

void setup() {
  Serial.begin(9600);

  pinMode(motorPin, OUTPUT);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  servo.attach(9);
  servo.write(90); // центр
}

long getDistance() {

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long duration = pulseIn(echoPin, HIGH);

  long distance = duration * 0.034 / 2;

  return distance;
}

void loop() {

  if (Serial.available()) {

    String cmd = Serial.readStringUntil('\n');
    cmd.trim();

    if (cmd == "FORWARD")
      digitalWrite(motorPin, HIGH);

    if (cmd == "STOP")
      digitalWrite(motorPin, LOW);

    if (cmd == "LEFT")
      servo.write(45);

    if (cmd == "RIGHT")
      servo.write(135);

    if (cmd == "CENTER")
      servo.write(90);

    if (cmd == "AUTO")
      autoMode = true;

    if (cmd == "MANUAL")
      autoMode = false;
  }

  if (autoMode) {

    long distance = getDistance();

    Serial.print("DIST:");
    Serial.println(distance);

    if (distance < 15) {
      digitalWrite(motorPin, LOW);
    }

    delay(300);
  }
}


import tkinter as tk
import serial

arduino = serial.Serial("COM3", 9600)

root = tk.Tk()
root.title("Управление машиной")
root.geometry("350x300")

distance_label = tk.Label(
    root,
    text="Расстояние: --- см",
    font=("Arial", 12)
)
distance_label.pack(pady=10)

mode_label = tk.Label(
    root,
    text="Режим: Ручной",
    font=("Arial", 12)
)
mode_label.pack()

def send(cmd):
    arduino.write((cmd + "\n").encode())

def auto_mode():
    send("AUTO")

    mode_label.config(text="Режим: Автоматический")

    forward_btn.config(state="disabled")
    stop_btn.config(state="disabled")
    left_btn.config(state="disabled")
    right_btn.config(state="disabled")

def manual_mode():
    send("MANUAL")

    mode_label.config(text="Режим: Ручной")

    forward_btn.config(state="normal")
    stop_btn.config(state="normal")
    left_btn.config(state="normal")
    right_btn.config(state="normal")

def read_distance():
    if arduino.in_waiting:

        data = arduino.readline().decode().strip()

        if data.startswith("DIST:"):
            distance = data.split(":")[1]
            distance_label.config(
                text=f"Расстояние: {distance} см"
            )

    root.after(100, read_distance)

forward_btn = tk.Button(
    root,
    text="ВПЕРЕД",
    width=20,
    command=lambda: send("FORWARD")
)
forward_btn.pack(pady=5)

stop_btn = tk.Button(
    root,
    text="СТОП",
    width=20,
    command=lambda: send("STOP")
)
stop_btn.pack(pady=5)

left_btn = tk.Button(
    root,
    text="ВЛЕВО",
    width=20,
    command=lambda: send("LEFT")
)
left_btn.pack(pady=5)

right_btn = tk.Button(
    root,
    text="ВПРАВО",
    width=20,
    command=lambda: send("RIGHT")
)
right_btn.pack(pady=5)

tk.Button(
    root,
    text="АВТО РЕЖИМ",
    width=20,
    command=auto_mode
).pack(pady=10)

tk.Button(
    root,
    text="РУЧНОЙ РЕЖИМ",
    width=20,
    command=manual_mode
).pack()

read_distance()

root.mainloop()