/*
Arduino Mega code to read a slide potentiometer (pot1), map its value to 0-99, display the two-digit
number on two 7-segment displays (sevseg1, sevseg2) driven via two 74HC595 shift registers (sr1, sr2),
and to control three LEDs (led1, led2, led3) so that:
• 0 <= value <= 33 --> only led1 lights up.
• 34 <= value <= 66 --> led1 and led2 light up.
• 67 <= value <= 99 --> led1, led2, led3 light up.
Each state is maintained for 2 seconds.
*/
#include <Arduino.h>
#include <Servo.h> // Included as allowed, though not used here.
// Pin definitions for potentiometer.
const int potPin = A0;
// LED pins.
const int led1Pin = 22;
const int led2Pin = 23;
const int led3Pin = 24;
// 74HC595 pins for sevseg1 (tens digit)
const int sr1DataPin = 2;
const int sr1ClockPin = 3;
const int sr1LatchPin = 4;
// 74HC595 pins for sevseg2 (ones digit)
const int sr2DataPin = 5;
const int sr2ClockPin = 6;
const int sr2LatchPin = 7;
// Seven-segment digit patterns for common anode (active LOW):
// Each pattern is organized as: Bit0=A, Bit1=B, Bit2=C, Bit3=D, Bit4=E, Bit5=F, Bit6=G, Bit7=DP.
const byte sevenSegDigits[10] = {
0xC0, // 0 : 0b11000000, segments A-F on, G off, DP off.
0xF9, // 1 : 0b11111001, only segments B and C on.
0xA4, // 2 : 0b10100100
0xB0, // 3 : 0b10110000
0x99, // 4 : 0b10011001
0x92, // 5 : 0b10010010
0x82, // 6 : 0b10000010
0xF8, // 7 : 0b11111000
0x80, // 8 : 0b10000000
0x90 // 9 : 0b10010000
};
void setup() {
// Initialize serial (optional for debugging)
Serial.begin(9600);
// Set LED pins as OUTPUT.
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
// Turn off LEDs initially.
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
// Set shift register pins as OUTPUT.
pinMode(sr1DataPin, OUTPUT);
pinMode(sr1ClockPin, OUTPUT);
pinMode(sr1LatchPin, OUTPUT);
pinMode(sr2DataPin, OUTPUT);
pinMode(sr2ClockPin, OUTPUT);
pinMode(sr2LatchPin, OUTPUT);
// Initialization: Set both 7-seg displays to "00".
updateSevenSegDisplay(0, 0);
}
void loop() {
// Read the analog value from pot1.
int analogVal = analogRead(potPin);
// Map the potentiometer value (0-1023) to a two-digit value (0-99).
int mappedVal = map(analogVal, 0, 1023, 0, 99);
// Calculate tens and ones.
int tens = mappedVal / 10;
int ones = mappedVal % 10;
// Update seven-segment displays.
updateSevenSegDisplay(tens, ones);
// Update the LED status based on mapped value.
updateLEDs(mappedVal);
// For debugging, print the values.
Serial.print("Analog: ");
Serial.print(analogVal);
Serial.print(" Mapped: ");
Serial.println(mappedVal);
// Maintain the current state for 2 seconds.
delay(2000);
}
// Function that sends the 7-segment code to each display by using the appropriate 74HC595 shift register.
void updateSevenSegDisplay(int tens, int ones) {
// Update sevseg1 (tens digit) via sr1.
byte tensPattern = sevenSegDigits[tens];
digitalWrite(sr1LatchPin, LOW);
// Use shiftOut to send data to the shift register.
shiftOut(sr1DataPin, sr1ClockPin, MSBFIRST, tensPattern);
digitalWrite(sr1LatchPin, HIGH); // Latch the data
// Update sevseg2 (ones digit) via sr2.
byte onesPattern = sevenSegDigits[ones];
digitalWrite(sr2LatchPin, LOW);
shiftOut(sr2DataPin, sr2ClockPin, MSBFIRST, onesPattern);
digitalWrite(sr2LatchPin, HIGH);
}
// Function to update the LED states according to the rules.
void updateLEDs(int value) {
if (value >= 0 && value <= 33) {
digitalWrite(led1Pin, HIGH); // ON
digitalWrite(led2Pin, LOW); // OFF
digitalWrite(led3Pin, LOW); // OFF
}
else if (value >= 34 && value <= 66) {
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
digitalWrite(led3Pin, LOW);
}
else if (value >= 67 && value <= 99) {
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
digitalWrite(led3Pin, HIGH);
}
}