//             BASIC CODE     ..............................................
FIRST
TRY THIS ONE AT 1
#define IR_SENSOR_RIGHT 11
#define IR_SENSOR_LEFT 12
#define MOTOR_SPEED 180
int enableRightMotor = 6;
int rightMotorPin1 = 7;
int rightMotorPin2 = 8;
int enableLeftMotor = 5;
int leftMotorPin1 = 9;
int leftMotorPin2 = 10;
// Define states for the robot
enum RobotState {
   STRAIGHT,
   TURN_LEFT,
   TURN_RIGHT,
   REVERSE
};
RobotState robotState = STRAIGHT;
unsigned long lastStateChangeTime = 0;
unsigned long turnDuration = 1000; // Adjust as needed for your robot
void setup() {
  // Change the PWM frequency
  TCCR0B = TCCR0B & B11111000 | B00000010;
    // Set up pins
    pinMode(enableRightMotor, OUTPUT);
    pinMode(rightMotorPin1, OUTPUT);
    pinMode(rightMotorPin2, OUTPUT);
    pinMode(enableLeftMotor, OUTPUT);
    pinMode(leftMotorPin1, OUTPUT);
    pinMode(leftMotorPin2, OUTPUT);
    pinMode(IR_SENSOR_RIGHT, INPUT);
    pinMode(IR_SENSOR_LEFT, INPUT);
    rotateMotor(0, 0);
}
void loop() {
  int rightIRSensorValue = digitalRead(IR_SENSOR_RIGHT);
  int leftIRSensorValue = digitalRead(IR_SENSOR_LEFT);
  unsigned long currentTime = millis();
    // Implement the state machine
    switch (robotState) {
      case STRAIGHT:
        if (rightIRSensorValue == HIGH && leftIRSensorValue == HIGH) {
          rotateMotor(MOTOR_SPEED, MOTOR_SPEED);
        } else if (rightIRSensorValue == LOW && leftIRSensorValue == HIGH) {
          robotState = TURN_RIGHT;
          lastStateChangeTime = currentTime;
        } else if (rightIRSensorValue == HIGH && leftIRSensorValue == LOW) {
          robotState = TURN_LEFT;
            lastStateChangeTime = currentTime;
          } else {
            robotState = REVERSE;
            lastStateChangeTime = currentTime;
          }
          break;
        case TURN_RIGHT:
          rotateMotor(MOTOR_SPEED, -MOTOR_SPEED);
          // Check if it's time to transition back to STRAIGHT
          if (currentTime - lastStateChangeTime >= turnDuration) {
            robotState = STRAIGHT;
          }
          break;
        case TURN_LEFT:
          rotateMotor(-MOTOR_SPEED, MOTOR_SPEED);
          // Check if it's time to transition back to STRAIGHT
          if (currentTime - lastStateChangeTime >= turnDuration) {
            robotState = STRAIGHT;
          }
          break;
        case REVERSE:
          rotateMotor(-MOTOR_SPEED, -MOTOR_SPEED);
          // Check if it's time to transition back to STRAIGHT
          if (currentTime - lastStateChangeTime >= turnDuration) {
            robotState = STRAIGHT;
          }
          break;
    }
}
void rotateMotor(int rightMotorSpeed, int leftMotorSpeed) {
  // Motor control logic
  if (rightMotorSpeed < 0) {
    digitalWrite(rightMotorPin1, LOW);
    digitalWrite(rightMotorPin2, HIGH);
  } else if (rightMotorSpeed > 0) {
    digitalWrite(rightMotorPin1, HIGH);
    digitalWrite(rightMotorPin2, LOW);
  } else {
    digitalWrite(rightMotorPin1, LOW);
    digitalWrite(rightMotorPin2, LOW);
  }
    if (leftMotorSpeed < 0) {
      digitalWrite(leftMotorPin1, LOW);
      digitalWrite(leftMotorPin2, HIGH);
    } else if (leftMotorSpeed > 0) {
      digitalWrite(leftMotorPin1, HIGH);
      digitalWrite(leftMotorPin2, LOW);
    } else {
      digitalWrite(leftMotorPin1, LOW);
      digitalWrite(leftMotorPin2, LOW);
    }
    analogWrite(enableRightMotor, abs(rightMotorSpeed));
    analogWrite(enableLeftMotor, abs(leftMotorSpeed));
}
//         TO RECORD PATH FOLLOW
LINE      ...................................................... TRY IF ABOVE WORKS 2
#define   IR_SENSOR_LEFT 11
#define   IR_SENSOR_RIGHT 12
#define   MOTOR_SPEED 180
int   irSensorLeftState = LOW;
int   irSensorRightState = LOW;
int   recordedPath[100]; // Array to store the recorded path
int   pathIndex = 0;
int enableRightMotor = 6;
int rightMotorPin1 = 7;
int rightMotorPin2 = 8;
int enableLeftMotor = 5;
int leftMotorPin1 = 9;
int leftMotorPin2 = 10;
void setup() {
  pinMode(IR_SENSOR_LEFT, INPUT);
  pinMode(IR_SENSOR_RIGHT, INPUT);
  pinMode(enableRightMotor, OUTPUT);
  pinMode(rightMotorPin1, OUTPUT);
  pinMode(rightMotorPin2, OUTPUT);
  pinMode(enableLeftMotor, OUTPUT);
  pinMode(leftMotorPin1, OUTPUT);
  pinMode(leftMotorPin2, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  irSensorLeftState = digitalRead(IR_SENSOR_LEFT);
  irSensorRightState = digitalRead(IR_SENSOR_RIGHT);
    // Detect a transition in either sensor
    if (irSensorLeftState != irSensorRightState) {
      // Record the transition (1 for left sensor, 2 for right sensor)
      recordedPath[pathIndex] = irSensorLeftState == LOW ? 1 : 2;
      pathIndex++;
    }
    // Line following based on sensor readings
    if (irSensorLeftState == HIGH && irSensorRightState == HIGH) {
      // Both sensors detect the white path, go straight
      rotateMotor(MOTOR_SPEED, MOTOR_SPEED);
    } else if (irSensorLeftState == LOW && irSensorRightState == HIGH) {
      // Right sensor detects the white path, turn right
      rotateMotor(-MOTOR_SPEED, MOTOR_SPEED);
    } else if (irSensorLeftState == HIGH && irSensorRightState == LOW) {
      // Left sensor detects the white path, turn left
      rotateMotor(MOTOR_SPEED, -MOTOR_SPEED);
    } else {
      // Both sensors detect the black background, stop
      rotateMotor(0, 0);
    }
    // Print the recorded path for debugging
    Serial.print("Recorded Path: ");
    for (int i = 0; i < pathIndex; i++) {
      Serial.print(recordedPath[i]);
    }
    Serial.println();
    // You may want to add some delay here to control the recording rate
    delay(100);
}
void rotateMotor(int rightMotorSpeed, int leftMotorSpeed) {
  // Motor control logic
  if (rightMotorSpeed < 0) {
    digitalWrite(rightMotorPin1, LOW);
    digitalWrite(rightMotorPin2, HIGH);
  } else if (rightMotorSpeed > 0) {
    digitalWrite(rightMotorPin1, HIGH);
    digitalWrite(rightMotorPin2, LOW);
  } else {
    digitalWrite(rightMotorPin1, LOW);
    digitalWrite(rightMotorPin2, LOW);
  }
    if (leftMotorSpeed < 0) {
      digitalWrite(leftMotorPin1, LOW);
      digitalWrite(leftMotorPin2, HIGH);
    } else if (leftMotorSpeed > 0) {
      digitalWrite(leftMotorPin1, HIGH);
      digitalWrite(leftMotorPin2, LOW);
    } else {
      digitalWrite(leftMotorPin1, LOW);
      digitalWrite(leftMotorPin2, LOW);
    }
    analogWrite(enableRightMotor, abs(rightMotorSpeed));
    analogWrite(enableLeftMotor, abs(leftMotorSpeed));
}