#include <Servo.h>

// Define pins for LEDs
const int led1Pin = 8;
const int led2Pin = 9;
const int led3Pin = 10;

// Define pins for servos
const int servo1Pin = 2;
const int servo2Pin = 3;
const int servo3Pin = 4;

// Define pins for shift register 1 (tens digit)
const int sr1DataPin = 11;
const int sr1ClockPin = 12;
const int sr1LatchPin = 13;

// Define pins for shift register 2 (units digit)
const int sr2DataPin = 5;
const int sr2ClockPin = 6;
const int sr2LatchPin = 7;

// Create servo objects
Servo servo1;
Servo servo2;
Servo servo3;

// Variables to keep track of time and display count
unsigned long previousMillis = 0;
const long interval = 2000;  // 2 seconds
int displayCount = 0;

// 7-segment display patterns for digits 0-9 (common anode: 0 = ON, 1 = OFF)
// Bit order: A B C D E F G DP (from LSB to MSB)
const byte digitPatterns[10] = {
  B00000011,  // 0: All segments except G and DP are ON
  B10011111,  // 1: Only B and C are ON
  B00100101,  // 2: A, B, D, E, G are ON
  B00001101,  // 3: A, B, C, D, G are ON
  B10011001,  // 4: B, C, F, G are ON
  B01001001,  // 5: A, C, D, F, G are ON
  B01000001,  // 6: A, C, D, E, F, G are ON
  B00011111,  // 7: A, B, C are ON
  B00000001,  // 8: All segments except DP are ON
  B00001001   // 9: A, B, C, D, F, G are ON
};

void setup() {
  // Initialize LED pins as outputs
  pinMode(led1Pin, OUTPUT);
  pinMode(led2Pin, OUTPUT);
  pinMode(led3Pin, OUTPUT);
  
  // Initialize shift register pins as outputs
  pinMode(sr1DataPin, OUTPUT);
  pinMode(sr1ClockPin, OUTPUT);
  pinMode(sr1LatchPin, OUTPUT);
  pinMode(sr2DataPin, OUTPUT);
  pinMode(sr2ClockPin, OUTPUT);
  pinMode(sr2LatchPin, OUTPUT);
  
  // Attach servos to pins
  servo1.attach(servo1Pin);
  servo2.attach(servo2Pin);
  servo3.attach(servo3Pin);
  
  // Initialize system state
  resetSystem();
}

void loop() {
  unsigned long currentMillis = millis();
  
  // Check if 2 seconds have passed
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    
    // Increment counter
    displayCount++;
    if (displayCount > 99) {
      displayCount = 0;
    }
    
    // Update system state
    updateDisplay();
    updateLEDs();
    updateServos();
  }
}

void resetSystem() {
  // Initialize counter to 0
  displayCount = 0;
  
  // Turn all LEDs off
  digitalWrite(led1Pin, LOW);
  digitalWrite(led2Pin, LOW);
  digitalWrite(led3Pin, LOW);
  
  // Set all servos to 0 degrees
  servo1.write(0);
  servo2.write(0);
  servo3.write(0);
  
  // Display "00" on 7-segment displays
  updateDisplay();
  updateLEDs();
}

void updateDisplay() {
  int tens = displayCount / 10;
  int units = displayCount % 10;
  
  // Update tens digit display
  digitalWrite(sr1LatchPin, LOW);
  shiftOut(sr1DataPin, sr1ClockPin, MSBFIRST, digitPatterns[tens]);
  digitalWrite(sr1LatchPin, HIGH);
  
  // Update units digit display
  digitalWrite(sr2LatchPin, LOW);
  shiftOut(sr2DataPin, sr2ClockPin, MSBFIRST, digitPatterns[units]);
  digitalWrite(sr2LatchPin, HIGH);
}

void updateLEDs() {
  int units = displayCount % 10;
  
  // Turn off all LEDs first
  digitalWrite(led1Pin, LOW);
  digitalWrite(led2Pin, LOW);
  digitalWrite(led3Pin, LOW);
  
  // Turn on appropriate LED based on units digit
  if (units >= 0 && units <= 2) {
    digitalWrite(led1Pin, HIGH);
  } else if (units >= 3 && units <= 5) {
    digitalWrite(led2Pin, HIGH);
  } else { // units >= 6 && units <= 9
    digitalWrite(led3Pin, HIGH);
  }
}

void updateServos() {
  int tens = displayCount / 10;
  
  // Set servo angles based on tens digit
  if (tens >= 0 && tens <= 2) {
    servo1.write(30);
    servo2.write(60);
    servo3.write(90);
  } else if (tens >= 3 && tens <= 5) {
    servo1.write(60);
    servo2.write(90);
    servo3.write(120);
  } else { // tens >= 6 && tens <= 9
    servo1.write(90);
    servo2.write(120);
    servo3.write(150);
  }
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
sevseg1:COM.1
sevseg1:COM.2
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
74HC595
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC
sevseg2:COM.1
sevseg2:COM.2
sevseg2:A
sevseg2:B
sevseg2:C
sevseg2:D
sevseg2:E
sevseg2:F
sevseg2:G
sevseg2:DP
74HC595
sr2:Q1
sr2:Q2
sr2:Q3
sr2:Q4
sr2:Q5
sr2:Q6
sr2:Q7
sr2:GND
sr2:Q7S
sr2:MR
sr2:SHCP
sr2:STCP
sr2:OE
sr2:DS
sr2:Q0
sr2:VCC
servo1:GND
servo1:V+
servo1:PWM
servo2:GND
servo2:V+
servo2:PWM
servo3:GND
servo3:V+
servo3:PWM