#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
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
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