/*
Arduino | coding help
Johnos — 6/30/24 at 11:33 PM
im trying to make eyeballs that move randomly but also 
together does anyone happen to know a good code for that?
or i could post the one i have here and someone could see 
why the eyes arent in sync?
*/

#include <Servo.h>

// Define servo objects for two servos
Servo servoX; // Horizontal servo
Servo servoY; // Vertical servo

// Pins for the servos
const int servoPinX = 10; // Connect horizontal servo to pin 9
const int servoPinY =  9; // Connect vertical servo to pin 10

// Variables to store current position of the servos
int posServoX = 90; // Starting position for horizontal servo (centered)
int posServoY = 90; // Starting position for vertical servo (centered)

// Constants for servo movement limits
const int minX = 60; // Minimum position for horizontal movement
const int maxX = 120; // Maximum position for horizontal movement
const int minY = 60; // Minimum position for vertical movement
const int maxY = 120; // Maximum position for vertical movement

void setup() {
  // Attach servos to their respective pins
  servoX.attach(servoPinX);
  servoY.attach(servoPinY);

  // Initialize servos to starting position
  servoX.write(posServoX);
  servoY.write(posServoY);

  // Optional: Initialize random seed
  randomSeed(analogRead(0));

  // Optional: Serial communication for debugging
  Serial.begin(9600);
}

void loop() {
  // Generate random positions for both servos
  int newX = random(minX, maxX + 1);
  int newY = random(minY, maxY + 1);

  // Move servos simultaneously
  moveServos(newX, newY);

  // Optional: Print positions to serial monitor for debugging
  Serial.print("X: ");
  Serial.print(newX);
  Serial.print(", Y: ");
  Serial.println(newY);

  // Delay before generating new random positions
  delay(random(1000, 3000));
}

// Function to move servos to specified positions
void moveServos(int newX, int newY) {
  // Move horizontally
  if (newX != posServoX) {
    if (newX > posServoX) {
      for (int i = posServoX; i <= newX; i++) {
        servoX.write(i);
        servoY.write(map(i, posServoX, newX, posServoY, newY));
        delay(10); // Adjust speed of movement
      }
    } else {
      for (int i = posServoX; i >= newX; i--) {
        servoX.write(i);
        servoY.write(map(i, posServoX, newX, posServoY, newY));
        delay(10); // Adjust speed of movement
      }
    }
    posServoX = newX;
  }

  // Move vertically (if necessary)
  if (newY != posServoY) {
    if (newY > posServoY) {
      for (int i = posServoY; i <= newY; i++) {
        servoY.write(i);
        servoX.write(map(i, posServoY, newY, posServoX, newX));
        delay(10); // Adjust speed of movement
      }
    } else {
      for (int i = posServoY; i >= newY; i--) {
        servoY.write(i);
        servoX.write(map(i, posServoY, newY, posServoX, newX));
        delay(10); // Adjust speed of movement
      }
    }
    posServoY = newY;
  }
}