I want to send a number to arduino via serial communication and display it on 3 7segment display

Hello everybody,

i am quite stuck and i don't understand what is the issue.
I tried for so long, but I can't find the issue. Here is my code:

//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;
  } 
}

Explaining this a bit, I tried to send a 3 digit number to the arduino via serial communication. Then I want it to keep displaying the number I send via serial com, but here is the issue, i can't seem to find a way to make the arduino keep displaying the numbers it always make it flicker once then shows "000"

my code in the beginning looked like this

//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 = -1; // 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) { // Check if new data is available
    num = Serial.parseInt(); // Read the new number from serial
  }
  previousNum = num;
  number(previousNum);
}

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 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;
  }
  delay(1);  
}

Welcome to the forum.

I made your project in Wokwi simulation:

Is my wiring the same as yours ?

When you type something in the Serial Monitor, then that text is send, together with CarriageReturn and LineFeed (or just one, or none, or in reverse order).
The Serial.parseInt() sees the number, and then it sees the CarriageReturn and/or LineFeed, which it will return as zero.

    int incomingNum = Serial.parseInt(); // Read the new number from serial
    // Get rid of all that CarriageReturn and/or LineFeed rubbish
    while(Serial.available() > 0)
      Serial.read();

Make use of the Serial Monitor. Use Serial.println() to show the number that you have received.

There are modules with four 7-segment displays, and many other modules that take care of displaying a number.

wiring seems the same
I think i understand what's wring but i am not sure how to fix

number send: 0
number send: 0
number send 2: 123
number send: 123
number send 2: 0
number send: 0
number send: 0

this is the output (i added println for num and previousnum).
i should add this is just a snippet of the output because it goes and goes forever and blazing fast

If you have the Line Ending of the serial monitor set to anything other than No Line Ending then your sketch will not work. As has been pointed out the Line Ending characters(s) will be left in the Serial buffer after the parseInt() and will be interpreted as zero

Set the Line Ending to No Line Ending and try your existing sketch

thank you it works, may i ask you how, because i am really confused i thought these options didn't really matter

Serial.parseInt() stops when it comes across a character that is not a digit. This leaves the Line Ending character available in the Serial buffer so that next time Serial.parseInt() is called it reads the Line Ending character, which is not a digit, and it returns zero

2 Likes

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.