7-segment display not holding value

Hello!

I have made a 7-segment display from arduino mega that displays a 3 digit integer sent from a different arduino mega. Below is my code. I want the display to simply hold the value that has been sent, until a new valid integer has been sent and then display that. When I have a tester arduino send values from a counting function every half second (using delay(500)) it displays just fine, but with my current code there is a problem where it holds the value for the expected delay time, but then it blinks and resets to displaying 05 or 00, depending on what the ones place of the last sent valid integer was. (the incoming integers will only be multiples of 5 (from 05 up to 190, with the exception of specific integer "45" (explained below))).

Any insight or advice into why this might be happening and how to resolve it would be super appreciated!
Thanks


/*
    The LED strips circuit:
      
           C
          ____
         |    |
      E  |____|  A
         | G  |
      F  |____|  B 
                
           D

*/


//ONES PLACES
int Aa1 = 2;
int Bb1 = 3;
int Cc1 = 4;
int Dd1 = 5;
int Ee1 = 6;
int Ff1 = 7;
int Gg1 = 8;

//TENS PLACES
int Aa2 = 22;
int Bb2 = 23;
int Cc2 = 24;
int Dd2 = 25;
int Ee2 = 26;
int Ff2 = 27;
int Gg2 = 28;

//DUH
int DECIMAL = 29;
int HUNDREDS = 30;

int resetter = 12;


void SHOW(int numero)
{

  int ones = (numero%10);
  int tens = ((numero/10)%10);
  int hundreds = ((numero/100)%10);

  if (ones == 0)
  {
    digitalWrite(Aa1, HIGH);
    digitalWrite(Bb1, HIGH);
    digitalWrite(Cc1, HIGH);
    digitalWrite(Dd1, HIGH);
    digitalWrite(Ee1, HIGH);
    digitalWrite(Ff1, HIGH);
    digitalWrite(Gg1, LOW);
  }
  
  if (ones == 5)
  {
    digitalWrite(Aa1, LOW);
    digitalWrite(Bb1, HIGH);
    digitalWrite(Cc1, HIGH);
    digitalWrite(Dd1, HIGH);
    digitalWrite(Ee1, HIGH);
    digitalWrite(Ff1, LOW);
    digitalWrite(Gg1, HIGH);
  }

  if (tens == 0)
  {
    digitalWrite(Aa2, HIGH);
    digitalWrite(Bb2, HIGH);
    digitalWrite(Cc2, HIGH);
    digitalWrite(Dd2, HIGH);
    digitalWrite(Ee2, HIGH);
    digitalWrite(Ff2, HIGH);
    digitalWrite(Gg2, LOW);
    digitalWrite(DECIMAL, HIGH);
  }

  if (tens == 1)
  {
    digitalWrite(Aa2, HIGH);
    digitalWrite(Bb2, HIGH);
    digitalWrite(Cc2, LOW);
    digitalWrite(Dd2, LOW);
    digitalWrite(Ee2, LOW);
    digitalWrite(Ff2, LOW);
    digitalWrite(Gg2, LOW);
    digitalWrite(DECIMAL, HIGH);
  }
  
  if (tens == 2)
  {
    digitalWrite(Aa2, HIGH);
    digitalWrite(Bb2, LOW);
    digitalWrite(Cc2, HIGH);
    digitalWrite(Dd2, HIGH);
    digitalWrite(Ee2, LOW);
    digitalWrite(Ff2, HIGH);
    digitalWrite(Gg2, HIGH);
    digitalWrite(DECIMAL, HIGH);
  }

  if (tens == 3)
  {
    digitalWrite(Aa2, HIGH);
    digitalWrite(Bb2, HIGH);
    digitalWrite(Cc2, HIGH);
    digitalWrite(Dd2, HIGH);
    digitalWrite(Ee2, LOW);
    digitalWrite(Ff2, LOW);
    digitalWrite(Gg2, HIGH);
    digitalWrite(DECIMAL, HIGH);
  }

  if (tens == 4)
  {
    digitalWrite(Aa2, HIGH);
    digitalWrite(Bb2, HIGH);
    digitalWrite(Cc2, LOW);
    digitalWrite(Dd2, LOW);
    digitalWrite(Ee2, HIGH);
    digitalWrite(Ff2, LOW);
    digitalWrite(Gg2, HIGH);
    digitalWrite(DECIMAL, HIGH);
  }

  if (tens == 5)
  {
    digitalWrite(Aa2, LOW);
    digitalWrite(Bb2, HIGH);
    digitalWrite(Cc2, HIGH);
    digitalWrite(Dd2, HIGH);
    digitalWrite(Ee2, HIGH);
    digitalWrite(Ff2, LOW);
    digitalWrite(Gg2, HIGH);
    digitalWrite(DECIMAL, HIGH);
  }

  if (tens == 6)
  {
    digitalWrite(Aa2, LOW);
    digitalWrite(Bb2, HIGH);
    digitalWrite(Cc2, HIGH);
    digitalWrite(Dd2, HIGH);
    digitalWrite(Ee2, HIGH);
    digitalWrite(Ff2, HIGH);
    digitalWrite(Gg2, HIGH);
    digitalWrite(DECIMAL, HIGH);
  }

  if (tens == 7)
  {
    digitalWrite(Aa2, HIGH);
    digitalWrite(Bb2, HIGH);
    digitalWrite(Cc2, HIGH);
    digitalWrite(Dd2, LOW);
    digitalWrite(Ee2, LOW);
    digitalWrite(Ff2, LOW);
    digitalWrite(Gg2, LOW);
    digitalWrite(DECIMAL, HIGH);
  }

  if (tens == 8)
  {
    digitalWrite(Aa2, HIGH);
    digitalWrite(Bb2, HIGH);
    digitalWrite(Cc2, HIGH);
    digitalWrite(Dd2, HIGH);
    digitalWrite(Ee2, HIGH);
    digitalWrite(Ff2, HIGH);
    digitalWrite(Gg2, HIGH);
    digitalWrite(DECIMAL, HIGH);
  }

  if (tens == 9)
  {
    digitalWrite(Aa2, HIGH);
    digitalWrite(Bb2, HIGH);
    digitalWrite(Cc2, HIGH);
    digitalWrite(Dd2, HIGH);
    digitalWrite(Ee2, HIGH);
    digitalWrite(Ff2, LOW);
    digitalWrite(Gg2, HIGH);
    digitalWrite(DECIMAL, HIGH);
  }

  if (hundreds == 0)
  {
    digitalWrite(HUNDREDS, LOW);
  }

  if (hundreds == 1)
  {
    digitalWrite(HUNDREDS, HIGH);
  }
  
}


void setup() {
  // put your setup code here, to run once:
  pinMode(Aa1, OUTPUT);
  pinMode(Bb1, OUTPUT);
  pinMode(Cc1,OUTPUT);
  pinMode(Dd1, OUTPUT);
  pinMode(Ee1, OUTPUT);
  pinMode(Ff1, OUTPUT);
  pinMode(Gg1, OUTPUT);

  
//TENS PLACES
  pinMode(Aa2, OUTPUT);
  pinMode(Bb2, OUTPUT);
  pinMode(Cc2, OUTPUT);
  pinMode(Dd2, OUTPUT);
  pinMode(Ee2, OUTPUT);
  pinMode(Ff2, OUTPUT);
  pinMode(Gg2, OUTPUT);

//DUH
  pinMode(DECIMAL, OUTPUT);
  pinMode(HUNDREDS, OUTPUT);
  pinMode(resetter, INPUT_PULLUP);
  Serial.begin(4800);

}

void loop() {
  // put your main code here, to run repeatedly:
  if (digitalRead(resetter) == LOW)
  {
    digitalWrite(Aa1, LOW);
    digitalWrite(Bb1, LOW);
    digitalWrite(Cc1, LOW);
    digitalWrite(Dd1, LOW);
    digitalWrite(Ee1, LOW);
    digitalWrite(Ff1, LOW);
    digitalWrite(Gg1, LOW);
    digitalWrite(Aa2, LOW);
    digitalWrite(Bb2, LOW);
    digitalWrite(Cc2, LOW);
    digitalWrite(Dd2, LOW);
    digitalWrite(Ee2, LOW);
    digitalWrite(Ff2, LOW);
    digitalWrite(Gg2, LOW);
    digitalWrite(DECIMAL, LOW);
    digitalWrite(HUNDREDS, LOW);
  }
  
  else if (Serial.available())
  {
    int z = Serial.parseInt();
    if (z > 0)
      {
       SHOW(z);
       delay(3000);
      }
    if (z == 44); //if recieves 44, plus one and display that (because integer 45 is unrecognized by serial.parseint)
      {
       z=z+1;
       SHOW(z);
       delay(3000);
      }    
  }
}

after the number the Serial Monitor send line ending character(s) if you don't turn them off in Serial Monitor Settings.
the line ending character(s) will cause parseInt to return 0

oops

fixed that @paulpaulson :slight_smile:

can you explain this to me a bit more @Juraj ? I thought because I had the iff z>0 condition that would take care of that?

This is not true, and suggests there remain serious problems to solve.

Take a look at the Serial Input Basics tutorial posted on the forum.

1 Like

and, you’re code could be a LOT shorter/easier to maintain if you read up on arrays and functions.

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