Temperature Displayed on 4 Digit 7 segment (common anode)

  Arduino Uno R3Arduino Uno R3 Microcontroller

  16.00 JD                  Add to cart

Arduino Mega 2560
Arduino Mega 2560 Microcontroller Board

  23.00 JD                  Add to cart

  Arduino Leonardo

Arduino Leonardo

  17.00 JD                  Add to cart

 

In this project you will display the temperature in a 4 digit 7 segment display (common anode).
The sensor is the cheapest you can find, so actually the temperature changes pretty easily which makes the display to show always different temperatures,  This project is great to learn more about:
 
  • Reading sensors (in this case temperature)
  • 4 digit 7 segment displays
  • 8 bit Shift Registers (74HC595)
  • Practice wiring

 

Parts required

  • 1x Arduino
  • 1x Temperature Sensor (LM335Z or LM35)
  • 1x 4 Digit 7 Segment Display (common anode)
  • 1x 74HC595 8 Bit Shift Register
  • 8x 220 Ohm Resistors
  • 1x 4.7 Kohm Resistor
  • 1x Breadboard (or  two)
  • Jumper Cables

 

Schematics

Those two figures below describe the pinout of the shift register and the 7 segment display internal circuit diagram. This might be helpful, since the schematics above are a bit confusing. (You should always search for the datasheet of your components)

 

Basically the pin 11 connects to the QA, the pin 7 to the QB and so on.

 

Upload the code:

this code base on LM335z Sensor, if you want to change the sensor please make sure to change the code variables and pins 

 

 

/*

* Temperature Sensor Displayed on 4 Digit 7 segment common anode

*/

const int digitPins[4] = {

4,5,6,7};                //4 common anode pins of the display

const int clockPin = 11;       //74HC595 Pin 11

const int latchPin = 12;       //74HC595 Pin 12

const const int dataPin = 13;

int tempPin = A0; //74HC595 Pin 14

//temperature sensor pin 

const byte digit[10] = //seven segment digits in bits

{   

B00111111, //0

B00000110, //1

B01011011, //2

B01001111, //3

B01100110, //4

B01101101, //5

B01111101, //6

B00000111, //7

B01111111, //8

B01101111 //9

};

int digitBuffer[4] = {

0};

int digitScan = 0, flag=0, soft_scaler = 0;

;

float tempK, tempC, tempF, temp;

void setup(){

for(int i=0;i<4;i++)

{

pinMode(digitPins[i],OUTPUT);

}

pinMode(tempPin, INPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(tempPin, INPUT);

}

//writes the temperature on display

void updateDisp(){

for(byte j=0; j<4; j++)

digitalWrite(digitPins[j], LOW);

digitalWrite(latchPin, LOW);

shiftOut(dataPin, clockPin, MSBFIRST, B11111111);

digitalWrite(latchPin, HIGH);

delayMicroseconds(100);

digitalWrite(digitPins[digitScan], HIGH);

digitalWrite(latchPin, LOW);

if(digitScan==2)

shiftOut(dataPin, clockPin, MSBFIRST,

~(digit[digitBuffer[digitScan]] | B10000000)); //print the decimal point on the 3rd digit

else

shiftOut(dataPin, clockPin, MSBFIRST,

~digit[digitBuffer[digitScan]]);

digitalWrite(latchPin, HIGH);

digitScan++;

if(digitScan>3) digitScan=0;

}

void loop(){

tempK = (((analogRead(tempPin)/ 1023.0) * 5.0) * 100.0);

//Converts Kelvin to Celsius minus 2.5 degrees error tempC = tempK - 273.0;

tempF = ((tempK - 2.5) * 9 / 5) - 459.67;

//Celsius temperature display

tempC = int(tempC*100);

digitBuffer[3]

digitBuffer[2] =

int(tempC)/1000; (int(tempC)%1000)/100;

digitBuffer[1]

digitBuffer[0] =

= (int(tempC)%100)/10;

(int(tempC)%100)%10;

updateDisp();

delay(2);

/*

//Fahrenheit temperature display tempF = int(tempF*100); digitBuffer[3] = int(tempF)/1000;

digitBuffer[2] = (int(tempF)%1000)/100;

digitBuffer[1] = (int(tempF)%100)/10; digitBuffer[0] = (int(tempF)%100)%10; updateDisp();

delay(2);

*/

}