Output feet and inches to 4 digit 7 segment display?

Hi!

Essentially, I'm building a device to measure distance and output it in feet and inches, but I can't seem to figure out how to output both at the same time.

Here is the function in question

void dispFeet(int numberF)
{
 
  switch (numberF)
  {
      
    case 0:  // print 0
    Serial.print("Need to print 0!");

      digitalWrite(A0, LOW);
      digitalWrite(A1, HIGH);
    
      digitalWrite(SegA, LOW);
      digitalWrite(SegB, LOW);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, LOW);
      digitalWrite(SegE, LOW);
      digitalWrite(SegF, LOW);
      digitalWrite(SegG, HIGH);
      
      break;
//End of code, there's 13 of these

Is there a specific way I can output (and change) all four digits without any of them interfering?

If you want the full code I can certainly post it, but I don't want to flood this with a bunch of irrelevant and repetitive code.

Thanks!

Please show the whole program.

How are your displays wired?

If you are driving the 4 digits directly from the Arduino you need to "multiplex" them. That means showing the value for digit '1' for a short period of time, then show digit '2' for a short period of time, then '3' and then '4' and then back to '1' again, continually. The phenomena of "persistence of vision" will make it appear that the digits are all on at the same time if you update the displays fast enough. That frequency is typically 30 times a second; the faster you update them the less flicker there will be.

This requires some more advanced programming techniques. You must be constantly updating the displays so no using delay() in the code. 30Hz is a period of ~33mS. Let's make that 32mS for easy math: that means that each display will have an 8mS period in which to show before you move on to the next one. The timing of this requires that the processor not be blocked doing other things (so delay(), while(...) etc) while the display is showing.

Here is the whole program:

I've heard of multiplexing, but don't really understand how to implement it with two integers

the doc.txt (11.6 KB)

What Arduino/processor are you using?

I am using the Arduino UNO R3 by smraza

You only have one set of segment outputs, so to show more than one digit you have to light each one in turn:

const int Brightness = 10;  // Higher number = brighter but more flicker


// segment pin definitions
const int SegA = 7;
const int SegB = 8;
const int SegC = 9;
const int SegD = 10;
const int SegE = 11;
const int SegF = 12;
const int SegG = 13;


// common pins of the four digits definitions
//USING ANALOG A0-3 PINS, IN STARTUP FUNCTION


const int TrigPin = 2;
const int EchoPin = 3;
const int buttonPin = 4;
const int greenLED = 5;
const int redLED = 6;
// variables that will change
double cm, inchDouble, feetDouble;
int inch, feet, number;
byte current_digit;




void displayOff()
{
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  digitalWrite(A2, HIGH);
  digitalWrite(A3, HIGH);
}


void setup()
{
  Serial.begin(9600);
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(redLED, OUTPUT);
  pinMode(SegA, OUTPUT);
  pinMode(SegB, OUTPUT);
  pinMode(SegC, OUTPUT);
  pinMode(SegD, OUTPUT);
  pinMode(SegE, OUTPUT);
  pinMode(SegF, OUTPUT);
  pinMode(SegG, OUTPUT);


  displayOff();
  feet = 12;
  inch = 34;
}


void SetSegments(int digit)
{
  switch (digit)
  {
    case 0:
      digitalWrite(SegA, LOW);
      digitalWrite(SegB, LOW);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, LOW);
      digitalWrite(SegE, LOW);
      digitalWrite(SegF, LOW);
      digitalWrite(SegG, HIGH);
      break;


    case 1:
      digitalWrite(SegA, HIGH);
      digitalWrite(SegB, LOW);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, HIGH);
      digitalWrite(SegE, HIGH);
      digitalWrite(SegF, HIGH);
      digitalWrite(SegG, HIGH);
      break;


    case 2:
      digitalWrite(SegA, LOW);
      digitalWrite(SegB, LOW);
      digitalWrite(SegC, HIGH);
      digitalWrite(SegD, LOW);
      digitalWrite(SegE, LOW);
      digitalWrite(SegF, HIGH);
      digitalWrite(SegG, LOW);
      break;


    case 3:
      digitalWrite(SegA, LOW);
      digitalWrite(SegB, LOW);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, LOW);
      digitalWrite(SegE, HIGH);
      digitalWrite(SegF, HIGH);
      digitalWrite(SegG, LOW);
      break;


    case 4:
      digitalWrite(SegA, HIGH);
      digitalWrite(SegB, LOW);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, HIGH);
      digitalWrite(SegE, HIGH);
      digitalWrite(SegF, LOW);
      digitalWrite(SegG, LOW);
      break;


    case 5:
      digitalWrite(SegA, LOW);
      digitalWrite(SegB, HIGH);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, LOW);
      digitalWrite(SegE, HIGH);
      digitalWrite(SegF, LOW);
      digitalWrite(SegG, LOW);
      break;


    case 6:
      digitalWrite(SegA, LOW);
      digitalWrite(SegB, HIGH);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, LOW);
      digitalWrite(SegE, LOW);
      digitalWrite(SegF, LOW);
      digitalWrite(SegG, LOW);
      break;


    case 7:
      digitalWrite(SegA, LOW);
      digitalWrite(SegB, LOW);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, HIGH);
      digitalWrite(SegE, HIGH);
      digitalWrite(SegF, HIGH);
      digitalWrite(SegG, HIGH);
      break;


    case 8:
      digitalWrite(SegA, LOW);
      digitalWrite(SegB, LOW);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, LOW);
      digitalWrite(SegE, LOW);
      digitalWrite(SegF, LOW);
      digitalWrite(SegG, LOW);
      break;


    case 9:
      digitalWrite(SegA, LOW);
      digitalWrite(SegB, LOW);
      digitalWrite(SegC, LOW);
      digitalWrite(SegD, LOW);
      digitalWrite(SegE, HIGH);
      digitalWrite(SegF, LOW);
      digitalWrite(SegG, LOW);
      break;
  }
}


void loop()
{
  
  SetSegments(feet / 10);
  digitalWrite(A0, LOW);
  delay(Brightness);
  digitalWrite(A0, HIGH);


  SetSegments(feet % 10);  // '%' is 'modulo', remainder after division.  This gets the 1's digit.
  digitalWrite(A1, LOW);
  delay(Brightness);
  digitalWrite(A1, HIGH);
  
  SetSegments(inch / 10);
  digitalWrite(A2, LOW);
  delay(Brightness);
  digitalWrite(A2, HIGH);


  SetSegments(inch % 10);  // '%' is 'modulo', remainder after division.  This gets the 1's digit.
  digitalWrite(A3, LOW);
  delay(Brightness);
  digitalWrite(A3, HIGH);


  // State Change Detection for the button.
  boolean buttonIsPressed = digitalRead(buttonPin) == LOW;
  static boolean buttonWasPressed = false;
  if (buttonIsPressed != buttonWasPressed)
  {
    buttonWasPressed = buttonIsPressed;


    if (buttonIsPressed)
    {
      digitalWrite(TrigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(TrigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(TrigPin, LOW);
      cm = pulseIn(EchoPin, HIGH) / 58.0;
      cm = (int(cm * 100.0)) / 100.0;
      inchDouble = cm * 0.39370079;
      feetDouble = inchDouble / 12.00;
      feet = inchDouble / 12;
      inch = (feetDouble - feet) * 12;
      Serial.print("Distance: ");
      Serial.print(feet);
      Serial.print("' ");
      Serial.print(inch);
      Serial.println("\"");
    }
  }
}