Arduino Seven Segment and LCD Shield

Nowadays, Makers, Developers are preferring Arduino for the rapid development of the prototyping of projects.

Arduino is an open-source electronics platform based on easy-to-use hardware and software. Arduino has a very good user community. Arduino board design uses variety of controllers which include (AVR Family, nRF5x Family, and fewer STM32 controllers and ESP8266/ESP32). Board has multiple Analog and Digital Input/Output pins. The board contains USB to Serial Converter as well which helps to program the controller.

It is very useful and time saving when there is availability of shields we need. In this post we will see about Seven segment and LCD shield. Seven Segment and LCD shield is very useful at many places. Most of the project and products requires display it can be Seven segment or 16×2 lcd and again require switches. So this shield is very much useful to them.

Shield Specification

  1. Four Seven Segment Display
  2. 16×2 LCD
  3. 6 Switches
  4. 1 User led
  5. 1 Power Led
  6. Easily Compatible with Arduino UNO and others

Schematic:

Schematic

​This is a schematic of the shield. Schematic and board layout is done in the Kicad tool. 

I am very much impressed with the Kicad tool for PCB designing. The community keeps on growing and enhancing the tool day by day.

Board Pictures:

LCD attached to Shield with UNO

Code:

ADC on Seven Segment :

#include "SevSeg.h"
SevSeg sevseg; 
int adcVal;

void setup(){
  byte numDigits = 4;
  byte digitPins[] = {13, 12, 11, 10};
  byte segmentPins[] = {7, 6, 5, 4, 3, 2, 9, 8};
  
  bool resistorsOnSegments = true; 
  bool updateWithDelaysIn = true;
  byte hardwareConfig = N_TRANSISTORS; 
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
  sevseg.setNumber(0000, 4);
}

void loop(){
    adcVal = analogRead(A1);
    sevseg.setNumber(adcVal, 4);
    sevseg.refreshDisplay(); 
}

Keypad Example :

#include "SevSeg.h"
SevSeg sevseg; 
int adcVal;

void setup(){
  byte numDigits = 4;
  byte digitPins[] = {13, 12, 11, 10};
  byte segmentPins[] = {7, 6, 5, 4, 3, 2, 9, 8};

  bool resistorsOnSegments = true; 
  bool updateWithDelaysIn = true;
  byte hardwareConfig = N_TRANSISTORS; 
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
  sevseg.setNumber(0000, 4);
}

void loop(){
    adcVal = analogRead(A0);
    if(adcVal>=150&&adcVal<=190)
    {
      sevseg.setNumber(0001, 4);
    }
    else if(adcVal>=350&&adcVal<=380)
    {
      sevseg.setNumber(0002, 4);      
    }
    else if(adcVal>=540&&adcVal<=560)
    {
      sevseg.setNumber(0003, 4);      
    }
    else if(adcVal>=750&&adcVal<=760)
    {
      sevseg.setNumber(0004, 4);     
    }
    else if(adcVal>=900)
    {
      sevseg.setNumber(0005, 4);      
    }
    sevseg.refreshDisplay(); 
}

LCD on shield:

#include <LiquidCrystal.h>

const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int adcVal;

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("STechiezDIY Sol.");
}

void loop() {
    adcVal = analogRead(A0);
    
    if(adcVal>=150&&adcVal<=190)
    {
      lcd.setCursor(0, 1);  
      lcd.print("UP key is Pressed");
    }
    else if(adcVal>=350&&adcVal<=380)
    {
      lcd.setCursor(0, 1);  
      lcd.print("Down key is Pressed");
    }
    else if(adcVal>=540&&adcVal<=560)
    {
      lcd.setCursor(0, 1);  
      lcd.print("LEFT key is Pressed");
    }
    else if(adcVal>=750&&adcVal<=760)
    {
      lcd.setCursor(0, 1);  
      lcd.print("RIGHT key is Pressed");
    }
    else if(adcVal>=900)
    {
      lcd.setCursor(0, 1);  
      lcd.print("OK key is Pressed");
    }
}

Counter Example :

#define SEGMENT_A  7
#define SEGMENT_B 6
#define SEGMENT_C 5
#define SEGMENT_D 4
#define SEGMENT_E 3
#define SEGMENT_F 2
#define SEGMENT_G 9

#define SEG_SELECT_1  13
#define SEG_SELECT_2  12
#define SEG_SELECT_3  11
#define SEG_SELECT_4  10

#define SEGMENT_SWITCH_DELAY  5
int CounterPeriod = 1000;
unsigned long time_now = 0;
/*
    a
   --
  |  |
 f|g |b
   --
  |  |
 e|  |c
   --
   d
   
Byte = hgfedcba
*/
uint8_t segmentdecode[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0X7D,0X07,0X7f,0X6f,0X77,0x7C,0x39,0x5E,0x79,0x71};

void DisplayNum(uint8_t num)
{
    digitalWrite(SEGMENT_A, (num & 0x01)?HIGH:LOW);
    digitalWrite(SEGMENT_B, (num & 0x02)?HIGH:LOW);
    digitalWrite(SEGMENT_C, (num & 0x04)?HIGH:LOW);
    digitalWrite(SEGMENT_D, (num & 0x08)?HIGH:LOW);
    digitalWrite(SEGMENT_E, (num & 0x10)?HIGH:LOW);
    digitalWrite(SEGMENT_F, (num & 0x20)?HIGH:LOW);
    digitalWrite(SEGMENT_G, (num & 0x40)?HIGH:LOW);
}

void setup() {
  // put your setup code here, to run once:
    pinMode(LED_BUILTIN, OUTPUT);
    pinMode(SEGMENT_A, OUTPUT);

    pinMode(SEGMENT_A, OUTPUT);
    pinMode(SEGMENT_B, OUTPUT);
    pinMode(SEGMENT_C, OUTPUT);
    pinMode(SEGMENT_D, OUTPUT);
    pinMode(SEGMENT_E, OUTPUT);
    pinMode(SEGMENT_F, OUTPUT);
    pinMode(SEGMENT_G, OUTPUT);
//    pinMode(SEGMENT_dp,OUTPUT);

    pinMode(SEG_SELECT_1, OUTPUT);
    pinMode(SEG_SELECT_2, OUTPUT);
    pinMode(SEG_SELECT_3, OUTPUT);
    pinMode(SEG_SELECT_4, OUTPUT);
}

int i;
int Counter=0;
int convertedInUnit[4];
//1234
void DisplayOnSegment(int d)
{
  convertedInUnit[0] = d/1000;
  digitalWrite(SEG_SELECT_1, HIGH);
  digitalWrite(SEG_SELECT_2, LOW);
  digitalWrite(SEG_SELECT_3, LOW);
  digitalWrite(SEG_SELECT_4, LOW);
  DisplayNum(segmentdecode[convertedInUnit[0]]);
  delay(SEGMENT_SWITCH_DELAY);
  DisplayNum(0x00);//1

  convertedInUnit[1] = (d%1000)/100;
  digitalWrite(SEG_SELECT_1, LOW);
  digitalWrite(SEG_SELECT_2, HIGH);
  digitalWrite(SEG_SELECT_3, LOW);
  digitalWrite(SEG_SELECT_4, LOW);
  DisplayNum(segmentdecode[convertedInUnit[1]]);
  delay(SEGMENT_SWITCH_DELAY);
  DisplayNum(0x00);//2

  convertedInUnit[2] = ((d%1000)%100)/10;
  digitalWrite(SEG_SELECT_1, LOW);
  digitalWrite(SEG_SELECT_2, LOW);
  digitalWrite(SEG_SELECT_3, HIGH);
  digitalWrite(SEG_SELECT_4, LOW);
  DisplayNum(segmentdecode[convertedInUnit[2]]);
  delay(SEGMENT_SWITCH_DELAY);
  DisplayNum(0x00);//3

  convertedInUnit[3] = ((d%1000)%100)%10;
  digitalWrite(SEG_SELECT_1, LOW);
  digitalWrite(SEG_SELECT_2, LOW);
  digitalWrite(SEG_SELECT_3, LOW);
  digitalWrite(SEG_SELECT_4, HIGH);
  DisplayNum(segmentdecode[convertedInUnit[3]]);
  delay(SEGMENT_SWITCH_DELAY);
  DisplayNum(0x00);//4
}

void loop() {
  if(millis() > time_now + CounterPeriod)
  {
    time_now = millis();
    Counter++;
    if(Counter > 9999)
    {
      Counter = 0;
    }
  }
 DisplayOnSegment(Counter); 
}

Tutorial :

You can see the video to get the idea more clear.

Happy Learning… 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *