Arduino Nano ESP32 - 74HC595 4-Digit 7-Segment Display
Welcome to this hands-on workshop where we connect a 74HC595 4-digit 7-segment display module to an Arduino Nano ESP32. The Nano ESP32 is built around the ESP32-S3 chip, giving you Wi-Fi, Bluetooth Low Energy, and dual-core processing power - all packed into the familiar Nano form factor with a USB-C connector.
In this workshop you will:
Wire the 74HC595 display module to the Arduino Nano ESP32.
Show integers, floats, and text on the display.
Display temperature readings with a degree symbol.
Present time in HH.MM format with a blinking separator.
Or you can buy the following kits:
Disclosure: Some of the links provided in this section are Amazon affiliate links. We may receive a commission for any purchases made through these links at no additional cost to you.
Additionally, some of these links are for products from our own brand,
DIYables .
This compact module pairs four 7-segment digits with a 74HC595 shift register. Data is shifted in serially through 3 pins and then latched to the LED segments. The library handles the digit multiplexing automatically - you set a value with print() and the display keeps showing it.
| Function | Pin | Description |
| SCLK (SH_CP) | Serial Clock | Clocks data bits into the register |
| RCLK (ST_CP) | Register Clock | Latches shifted data to outputs |
| DIO (DS) | Data Input | Serial data line |
| VCC | Power | 3.3V or 5V |
| GND | Ground | Common ground |
Note: The Arduino Nano ESP32 operates at 3.3V. The 74HC595 module works at 3.3V without issues.
Connect the display to the Nano ESP32:
SCLK to D7
RCLK to D6
DIO to D5
VCC to 3.3V
GND to GND

This image is created using Fritzing. Click to enlarge image
Plug the Arduino Nano ESP32 into your computer through its USB-C port.
Open Arduino IDE. Pick Arduino Nano ESP32 from the board list and select the right port.
Click the Libraries icon on the left sidebar.
Type "DIYables_4Digit7Segment_74HC595" in the search field. Find the DIYables entry.
Hit Install. Select version 2.0.0 or later.
Self-contained library - nothing else to install.
The minimum code needed to get going:
#include <DIYables_4Digit7Segment_74HC595.h>
#define SCLK_PIN D7
#define RCLK_PIN D6
#define DIO_PIN D5
DIYables_4Digit7Segment_74HC595 display(SCLK_PIN, RCLK_PIN, DIO_PIN);
void setup() {
display.begin();
display.print(1234);
}
void loop() {
display.loop();
}
begin() sets up the pins. loop() handles multiplexing - call it as often as possible. Use display.delay() instead of delay() to keep the display alive during waits.
Shows integers from -999 to 9999, including zero-padded output.
#include <DIYables_4Digit7Segment_74HC595.h>
#define SCLK_PIN D7
#define RCLK_PIN D6
#define DIO_PIN D5
DIYables_4Digit7Segment_74HC595 display(SCLK_PIN, RCLK_PIN, DIO_PIN);
int numbers[] = {0, 42, 1234, -5, -123, 9999};
int numCount = 6;
int currentIndex = 0;
bool showZeroPad = false;
unsigned long lastChange = 0;
void setup() {
Serial.begin(9600);
display.begin();
Serial.println("4-Digit 7-Segment 74HC595 - Integer Example");
}
void loop() {
display.loop();
if (millis() - lastChange >= 2000) {
lastChange = millis();
if (!showZeroPad) {
display.print(numbers[currentIndex]);
Serial.print("Displaying: ");
Serial.println(numbers[currentIndex]);
currentIndex++;
if (currentIndex >= numCount) {
currentIndex = 0;
showZeroPad = true;
}
} else {
display.print(42, true);
Serial.println("Displaying: 0042 (zero-padded)");
showZeroPad = false;
}
}
}
Wire the display to the Nano ESP32 as described above.
Connect the Nano ESP32 to your computer via USB-C.
In Arduino IDE, choose the board and port, paste the code, and click Upload.
Open the Serial Monitor to observe the results.
The display cycles through 0, 42, 1234, -5, -123, 9999, then 0042 (zero-padded).
| Method | Action | Syntax |
| print(int) | Display an integer | display.print(1234) |
| print(int, true) | Integer with zero-padding | display.print(42, true) |
| loop() | Refresh the display | display.loop() |
Floating-point numbers with auto and fixed decimals.
#include <DIYables_4Digit7Segment_74HC595.h>
#define SCLK_PIN D7
#define RCLK_PIN D6
#define DIO_PIN D5
DIYables_4Digit7Segment_74HC595 display(SCLK_PIN, RCLK_PIN, DIO_PIN);
void setup() {
Serial.begin(9600);
display.begin();
Serial.println("4-Digit 7-Segment 74HC595 - Float Example");
}
void loop() {
display.print(1.5);
Serial.println("Auto decimal: 1.5");
display.delay(2000);
display.print(12.34);
Serial.println("Auto decimal: 12.34");
display.delay(2000);
display.print(3.141);
Serial.println("Auto decimal: 3.141");
display.delay(2000);
display.print(-1.2);
Serial.println("Auto decimal: -1.20");
display.delay(2000);
display.print(0.5);
Serial.println("Auto decimal: 0.5");
display.delay(2000);
display.print(23.5, 1);
Serial.println("1 decimal place: 23.5");
display.delay(2000);
display.print(1.5, 2);
Serial.println("2 decimal places: 1.50");
display.delay(2000);
display.print(1.5, 2, true);
Serial.println("2 decimal places, zero-padded: 01.50");
display.delay(2000);
}
Shows auto-decimal floats, then fixed 1 and 2 decimal places, and zero-padded.
Text strings, degree symbol, and temperature display.
#include <DIYables_4Digit7Segment_74HC595.h>
#define SCLK_PIN D7
#define RCLK_PIN D6
#define DIO_PIN D5
DIYables_4Digit7Segment_74HC595 display(SCLK_PIN, RCLK_PIN, DIO_PIN);
const char* texts[] = {"HELP", "Hi", "COOL", "done"};
int textCount = 4;
int currentIndex = 0;
int phase = 0;
unsigned long lastChange = 0;
void setup() {
Serial.begin(9600);
display.begin();
Serial.println("4-Digit 7-Segment 74HC595 - Text and Degree Example");
}
void loop() {
display.loop();
if (millis() - lastChange >= 2000) {
lastChange = millis();
if (phase == 0) {
display.print(texts[currentIndex]);
Serial.print("Text: ");
Serial.println(texts[currentIndex]);
currentIndex++;
if (currentIndex >= textCount) {
currentIndex = 0;
phase = 1;
}
} else if (phase == 1) {
display.printTemperature(25, 'C');
Serial.println("Temperature: 25 C");
phase = 2;
} else if (phase == 2) {
display.printTemperature(72, 'F');
Serial.println("Temperature: 72 F");
phase = 3;
} else if (phase == 3) {
char degStr[5];
degStr[0] = '2';
degStr[1] = '5';
degStr[2] = DEGREE_CHAR;
degStr[3] = 'C';
degStr[4] = '\0';
display.print(degStr);
Serial.println("String with degree: 25 deg C");
phase = 4;
} else {
display.print("1.2.3.4");
Serial.println("Dots: 1.2.3.4");
phase = 0;
}
}
}
Shows "HELP", "Hi", "COOL", "done", temperatures, and inline dots.
Clock-style HH.MM with blinking dot.
#include <DIYables_4Digit7Segment_74HC595.h>
#define SCLK_PIN D7
#define RCLK_PIN D6
#define DIO_PIN D5
DIYables_4Digit7Segment_74HC595 display(SCLK_PIN, RCLK_PIN, DIO_PIN);
int hours = 12;
int minutes = 30;
bool colonOn = true;
unsigned long lastToggle = 0;
void setup() {
Serial.begin(9600);
display.begin();
Serial.println("4-Digit 7-Segment 74HC595 - Time Example");
Serial.println("Displaying 12:30 with blinking dot separator");
}
void loop() {
display.loop();
if (millis() - lastToggle >= 500) {
lastToggle = millis();
display.printTime(hours, minutes, colonOn);
colonOn = !colonOn;
}
}
Displays 12.30 with the dot blinking every 500ms.
Blinks display content on and off.
#include <DIYables_4Digit7Segment_74HC595.h>
#define SCLK_PIN D7
#define RCLK_PIN D6
#define DIO_PIN D5
DIYables_4Digit7Segment_74HC595 display(SCLK_PIN, RCLK_PIN, DIO_PIN);
int phase = 0;
int blinkCount = 0;
bool isOn = true;
unsigned long lastAction = 0;
unsigned long pauseUntil = 0;
void setup() {
Serial.begin(9600);
display.begin();
Serial.println("4-Digit 7-Segment 74HC595 - Blink Example");
display.print(1234);
Serial.println("Blinking: 1234");
}
void loop() {
display.loop();
unsigned long now = millis();
if (now < pauseUntil) return;
if (now - lastAction >= 300) {
lastAction = now;
if (isOn) {
display.off();
isOn = false;
} else {
display.on();
isOn = true;
blinkCount++;
if (blinkCount >= 5) {
blinkCount = 0;
pauseUntil = now + 1000;
phase++;
if (phase > 2) phase = 0;
switch (phase) {
case 0:
display.print(1234);
Serial.println("Blinking: 1234");
break;
case 1:
display.print(12.34);
Serial.println("Blinking: 12.34");
break;
case 2:
display.print("HELP");
Serial.println("Blinking: HELP");
break;
}
}
}
}
}
Blinks 1234, then 12.34, then "HELP" - five times each.
| Issue | Possible Cause | Resolution |
| Display blank | Wiring problem | Check VCC, GND, and data pin connections |
| Wrong characters | Anode/cathode mismatch | Pass false to constructor for common cathode |
| Flickering | delay() blocking loop() | Use display.delay() instead |
| Upload fails | Board in wrong mode | Hold the BOOT button while pressing RESET, then retry upload |
The library is built entirely on Arduino standard APIs and supports all Arduino-compatible platforms (architectures=*).