// Pin definitions
#define LED_PIN 2
#define RGB_RED_PIN 3
#define RGB_GREEN_PIN 4
#define RGB_BLUE_PIN 5

#define SR1_DATA_PIN 6
#define SR1_CLOCK_PIN 7
#define SR1_LATCH_PIN 8

#define SR2_DATA_PIN 9
#define SR2_CLOCK_PIN 10
#define SR2_LATCH_PIN 11

// Variables for RGB LED colors
const byte COLORS[][3] = {
  {255, 0, 0},    // Red
  {0, 255, 0},    // Green
  {0, 0, 255},    // Blue
  {255, 255, 0},  // Yellow
  {0, 255, 255},  // Cyan
  {255, 0, 255},  // Magenta
  {255, 255, 255} // White
};
const int NUM_COLORS = 7;
int currentColor = 0;

// Variables for 7-segment display
int counter = 0;
// For common anode 7-segment display (0 = ON, 1 = OFF)
const byte SEGMENT_MAP[] = {
  0b11000000,  // 0
  0b11111001,  // 1
  0b10100100,  // 2
  0b10110000,  // 3
  0b10011001,  // 4
  0b10010010,  // 5
  0b10000010,  // 6
  0b11111000,  // 7
  0b10000000,  // 8
  0b10010000   // 9
};

// Timing variables
unsigned long previousMillis = 0;
const long interval = 2000;  // 2 seconds
bool ledState = LOW;  // LED starts in the OFF state

void setup() {
  // Initialize pins
  pinMode(LED_PIN, OUTPUT);
  pinMode(RGB_RED_PIN, OUTPUT);
  pinMode(RGB_GREEN_PIN, OUTPUT);
  pinMode(RGB_BLUE_PIN, OUTPUT);
  
  pinMode(SR1_DATA_PIN, OUTPUT);
  pinMode(SR1_CLOCK_PIN, OUTPUT);
  pinMode(SR1_LATCH_PIN, OUTPUT);
  
  pinMode(SR2_DATA_PIN, OUTPUT);
  pinMode(SR2_CLOCK_PIN, OUTPUT);
  pinMode(SR2_LATCH_PIN, OUTPUT);
  
  // Initialize LED state (starts OFF)
  digitalWrite(LED_PIN, ledState);
  
  // Initialize RGB LED (starts with Red)
  setRGBColor(COLORS[currentColor]);
  
  // Initialize 7-segment displays (starts at 00)
  updateSevenSegment();
}

void loop() {
  unsigned long currentMillis = millis();
  
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    
    // Toggle LED state (2 seconds on, 2 seconds off)
    ledState = !ledState;
    digitalWrite(LED_PIN, ledState);
    
    // Update RGB LED color
    currentColor = (currentColor + 1) % NUM_COLORS;
    setRGBColor(COLORS[currentColor]);
    
    // Update counter and 7-segment displays
    counter = (counter + 1) % 100;
    updateSevenSegment();
  }
}

void setRGBColor(const byte* color) {
  analogWrite(RGB_RED_PIN, color[0]);
  analogWrite(RGB_GREEN_PIN, color[1]);
  analogWrite(RGB_BLUE_PIN, color[2]);
}

void updateSevenSegment() {
  byte tensDigit = counter / 10;
  byte unitsDigit = counter % 10;
  
  // Update tens digit (sevseg1)
  digitalWrite(SR1_LATCH_PIN, LOW);
  shiftOut(SR1_DATA_PIN, SR1_CLOCK_PIN, MSBFIRST, SEGMENT_MAP[tensDigit]);
  digitalWrite(SR1_LATCH_PIN, HIGH);
  
  // Update units digit (sevseg2)
  digitalWrite(SR2_LATCH_PIN, LOW);
  shiftOut(SR2_DATA_PIN, SR2_CLOCK_PIN, MSBFIRST, SEGMENT_MAP[unitsDigit]);
  digitalWrite(SR2_LATCH_PIN, HIGH);
}
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
rgb1:R
rgb1:COM
rgb1:G
rgb1:B
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