Introduction: Arduino Distance and Temperature Sensor + 7 Segment Display

This project was something that I had thought about doing for a long time to make something that is relatively simple into something that is complicated just by adding a few extra parts. About a year ago I originally made a distance sensor with a single 7 segment display that would display the distance in inches. This is a better version of that which is more accurate and is in centimetres. I chose a max distance it could show of 99 cm because that's about as far as I've seen the distance sensor be accurate to in my experience.

Supplies

- An Arduino

- 2x 7 Segment Displays (The ones I used are common Anode)

- 2x 1K Ohm Resistor

- A TMP36 Temperature Sensor

- An Ultrasonic Distance Sensor

Step 1: Assembling the Circuit

I'll explain the way that the 2 7 Seg displays work when I go over the code. The general idea is that the same terminals a-f are connected between the two displays and the Arduino, the exception are the common pins which are also attached to the Arduino.

The temperature sensor is much simpler as you just need to attach one end into power, the other into ground and the center one into an Analog In (I used A0).

The distance sensor just needs power, ground, a digital in and digital out.

Step 2: The Code

The code for this is complex but not difficult to understand if you know the basics of how a 7 Seg display works.

The basic idea of using the 2 displays is that they cannot be on for at the same moment or else the same value would be displayed on both. However, if we have it constantly changing from off to on so fast that we can't see, it would seem to the human eye to be on.

This is the code that I used:

int aPin = 2; //Variables
int bPin = 3;
int cPin = 4;
int dPin = 5;
int ePin = 6;
int fPin = 7;
int gPin = 8;
int firstPin = 9;
int secondPin = 10;
int trigPin = 11;
int echoPin = 12;

long duration, cm;
int reading;
float voltage = 0, temperature = 0, change, secondVal;

void setup()
{
  pinMode(aPin, OUTPUT);
  pinMode(bPin, OUTPUT);
  pinMode(cPin, OUTPUT);
  pinMode(dPin, OUTPUT);
  pinMode(ePin, OUTPUT);
  pinMode(fPin, OUTPUT);
  pinMode(gPin, OUTPUT);
  pinMode(firstPin, OUTPUT);
  pinMode(secondPin, OUTPUT);
  
  // Ultrasonic Setup
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  
  // Temperature Sensor
  pinMode(A0, INPUT);
  
}


void loop()
{
  
  // Temperature Sensor
  temperature = map(((analogRead(A0) - 20) * 3.04), 0, 1023, -40, 125);
  
  // Distance Sensor
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  
  cm = microsecondsToCentimeters(duration, temperature); //Uses the function to determine the distance
  
  if (cm>=0&&cm<=9){
   	digitalWrite(firstPin, HIGH); // Turns on the Display
  	zero(); // Sets the value to display
  	delay(5); // Leaves it on for 5 miliseconds
  	digitalWrite(firstPin, LOW); // Turns the display off
  	reset(); // Resets the Display
    change = 0; // Helps calculate the next digit
  }
  else if (cm>=10&&cm<=19){
    digitalWrite(firstPin, HIGH);
  	one();
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 10;
  }
  else if (cm>=20&&cm<=29){
    digitalWrite(firstPin, HIGH);
  	two();
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 20;
  }
  else if (cm>=30&&cm<=39){
    digitalWrite(firstPin, HIGH);
  	three();
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 30;
  }
  else if (cm>=40&&cm<=49){
    digitalWrite(firstPin, HIGH);
  	four();
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 40;
  }
  else if (cm>=50&&cm<=59){
    digitalWrite(firstPin, HIGH);
  	five();
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 50;
  }
  else if (cm>=60&&cm<=69){
    digitalWrite(firstPin, HIGH);
  	six();
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 60;
  }
  else if (cm>=70&&cm<=79){
    digitalWrite(firstPin, HIGH);
  	seven();
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 70;
  }
  else if (cm>=80&&cm<=89){
    digitalWrite(firstPin, HIGH);
  	eight();
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 80;
  }
  else if (cm>=90&&cm<=99){
    digitalWrite(firstPin, HIGH);
  	nine();
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 90;
  }
  else{
    digitalWrite(firstPin, HIGH);
  	digitalWrite (gPin, LOW);
  	delay(5);
  	digitalWrite(firstPin, LOW);
  	reset();
    change = 200;
  }
  
  secondVal = cm - change;
  
  if (secondVal==0){
    digitalWrite(secondPin, HIGH);
  	zero();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else if (secondVal==1){
    digitalWrite(secondPin, HIGH);
  	one();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else if (secondVal==2){
    digitalWrite(secondPin, HIGH);
  	two();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else if (secondVal==3){
    digitalWrite(secondPin, HIGH);
  	three();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else if (secondVal==4){
    digitalWrite(secondPin, HIGH);
  	four();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else if (secondVal==5){
    digitalWrite(secondPin, HIGH);
  	five();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else if (secondVal==6){
    digitalWrite(secondPin, HIGH);
  	six();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else if (secondVal==7){
    digitalWrite(secondPin, HIGH);
  	seven();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else if (secondVal==8){
    digitalWrite(secondPin, HIGH);
  	eight();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else if (secondVal==9){
    digitalWrite(secondPin, HIGH);
  	nine();
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  else{
    digitalWrite(secondPin, HIGH);
  	digitalWrite (gPin, LOW);
  	delay(5);
  	digitalWrite(secondPin, LOW);
  	reset();
  }
  
}

long microsecondsToCentimeters(long microseconds, float temp){
  // The speed of sound is 331.4 0.6*Temperature (in m/s).
  // The value 0.0001 is used to go from m/s to cm/microsecond.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return (microseconds*0.0001*(331.4+0.6*temp))/2;
}

void reset (){
  digitalWrite (aPin, HIGH);
  digitalWrite (bPin, HIGH);
  digitalWrite (cPin, HIGH);
  digitalWrite (dPin, HIGH);
  digitalWrite (ePin, HIGH);
  digitalWrite (fPin, HIGH);
  digitalWrite (gPin, HIGH);
  
}

void nine (){
  digitalWrite (aPin, LOW);
  digitalWrite (bPin, LOW);
  digitalWrite (cPin, LOW);
  digitalWrite (fPin, LOW);
  digitalWrite (gPin, LOW);
}

void eight (){
  digitalWrite (aPin, LOW);
  digitalWrite (bPin, LOW);
  digitalWrite (cPin, LOW);
  digitalWrite (dPin, LOW);
  digitalWrite (ePin, LOW);
  digitalWrite (fPin, LOW);
  digitalWrite (gPin, LOW);
}

void seven(){
  digitalWrite (aPin, LOW);
  digitalWrite (bPin, LOW);
  digitalWrite (cPin, LOW);
}

void six(){
  digitalWrite (aPin, LOW);
  digitalWrite (cPin, LOW);
  digitalWrite (dPin, LOW);
  digitalWrite (ePin, LOW);
  digitalWrite (fPin, LOW);
  digitalWrite (gPin, LOW);
}

void five(){
  digitalWrite (aPin, LOW);
  digitalWrite (cPin, LOW);
  digitalWrite (dPin, LOW);
  digitalWrite (fPin, LOW);
  digitalWrite (gPin, LOW);
}

void four(){
  digitalWrite (bPin, LOW);
  digitalWrite (cPin, LOW);
  digitalWrite (fPin, LOW);
  digitalWrite (gPin, LOW);
}

void three(){
  digitalWrite (aPin, LOW);
  digitalWrite (bPin, LOW);
  digitalWrite (cPin, LOW);
  digitalWrite (dPin, LOW);
  digitalWrite (gPin, LOW);
}

void two(){
  digitalWrite (aPin, LOW);
  digitalWrite (bPin, LOW);
  digitalWrite (dPin, LOW);
  digitalWrite (ePin, LOW);
  digitalWrite (gPin, LOW);
}

void one(){
  digitalWrite (bPin, LOW);
  digitalWrite (cPin, LOW);
}

void zero(){
  digitalWrite (aPin, LOW);
  digitalWrite (bPin, LOW);
  digitalWrite (cPin, LOW);
  digitalWrite (dPin, LOW);
  digitalWrite (ePin, LOW);
  digitalWrite (fPin, LOW);
}