// Forum: https://forum.arduino.cc/t/i-want-to-send-a-number-to-arduino-via-serial-communication-and-display-it-on-3-7segment-display/1247266
// This Wokwi project: https://wokwi.com/projects/395063604040274945
//
// Warning, a real project requires resistors.
//

//leds 7 segment display 
#define A 7
#define B 6
#define C 4
#define D 3
#define E 2
#define F 8
#define G 9
#define Dp 5

#define display1 10
#define display2 11
#define display3 13

int num; // Variable to store the number to be displayed
int previousNum; // Variable to store the previous number for comparison

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.setTimeout(80); //this will stop everything in serial to give you, and check, the infromation
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(Dp, OUTPUT);

  pinMode(display1, OUTPUT);
  pinMode(display2, OUTPUT);
  pinMode(display3, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    int incomingNum = Serial.parseInt(); // Read the new number from serial
    if (incomingNum != num) { // Only update if the number has changed
      num = incomingNum;
    }
  }

  if (num != previousNum) { // Check if the number has changed since last display update
    number(num); // Update the display with the new number
    previousNum = num; // Update previousNum to the current num
  }

  delay(5); // Short delay to help with display stability
}

void number(int n){
  int hecto = n / 100; // Calculate hundreds place
  int deca = (n % 100) / 10; // Calculate tens place
  int integer = n % 10; // Calculate ones place

  // Display each digit
  digitalWrite(display1, HIGH);
  segments(hecto);
  delay(5); // Short delay to ensure the digit is visible
  digitalWrite(display1, LOW);

  digitalWrite(display2, HIGH);
  segments(deca);
  delay(5);
  digitalWrite(display2, LOW);

  digitalWrite(display3, HIGH);
  segments(integer);
  delay(5);
  digitalWrite(display3, LOW);
}


void displays(){
  digitalWrite(display1, LOW);
  digitalWrite(display2, LOW);
  digitalWrite(display3, LOW);
}

void ghost() {
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);  
}

void segments(int num){
  ghost();
  switch(num){
    case 0:
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
    break;

    case 1:
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
    break;

    case 2:
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
    break;

    case 3:
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
    break;

    case 4:
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
    break;

    case 5:
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
    break;

    case 6:
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
    break;

    case 7:
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
    break;

    case 8:
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
    break;

    case 9:
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
    break;
  } 
}