How to Make a POV Display Using LEDs and Arduino

By Muhammed Azhar

Arduino POV display


Here is a simple project using an Arduino and some LEDs. What we are going to learn here today is how to make a POV display or Persistence-Of-Vision display. It is made out of just 6$ worth of components. This tutorial gives will teach you how to make a simple and a cheap Arduino POV display. We can use this display as a pocket-sized portable message showing device and tabletop clock.

How Does it Work?

What is POV(Persistence of Vision)? It can be defined in simple words. When a person sees an object, its image remains in the retina of the eye for a time interval of 1/16th of a second. This phenomenon is known as persistence of vision. This phenomenon is used in the POV Display to form images. We turn the LEDs on and off in such a way that the different images overlap each other forming letters. For example:


Arduino POV display

Formation of letter “E” with 5 LEDs

1 2 3 <– Time

1 1 1 <– Bulb 1

1 0 0 <– Bulb 2

1 1 1 <– Bulb 3

1 0 0 <– Bulb 4

1 1 1 <– Bulb 5


Each row represents the 5 LEDs we use to make the Arduino POV display and each column is a time interval. Each element in the row represents the state of the LED at that given time.


At t = 1 Bulbs 1,2,3,4,5 are ON

At t = 2 Bulbs 1,3,5 are ON


This way we can visually see the letter E formed by the LEDs but the time interval would be very small in milliseconds. Due to the short time intervals and the ability of the LEDs to turn ON and OFF very quickly we can see the letter E as all the 3 images merge. As the motor is spinning and time passes, each LED moves from one position to the next, so all these images merge together.

Required Materials

ToolsArduino POV Display Tools

  1. Soldering iron
  2. Player tool
  3. Wire cutter
  4. Glue gun (Not required for the portable device makeover. It is used only for the table top version.)



ElectronicsArduino POV Display Electronic Materials

  1. Arduino Pro Mini
  2. Female pin socket for Arduino
  3. Perfboard
  4. 3V Regulator IC
  5. 220Ohm Resistors – 5 No.s
  6. LED – 5 No.s (Although I have shown Green LEDs here, Red is better)
  7. Old Mobile Battery


Mechanical PartsArduino POV Display Mechanical Materials

  1. A wooden block / A plastic tin that has little weight
  2. BO motor 3volt / 12 volt, 500rpm motor
  3. A wheel of BO motor
  4. Nut and bolt – 3 pairs
  5. A scale


Making the Circuit for the Portable Arduino POV Display


Arduino POV Display Circuit Diagram

Arduino POV Display Circuit Diagram

Arduino POV Display Circuit Board


Cut the perf board to the appropriate size that you want. Then connect the LEDs and solder it as shown in the figure below. Then connect the Arduino case (where Arduino is to be placed). Connect the resistors to the positive pins of the LEDs and connect the negative pins together. Then connect the LEDs to the Arduino. The first LED(on the upper side) connects to the Arduino pin 2. Connect the second LED to the Arduino 3rd pin. Connect all LEDs as shown in the circuit diagram. At last, connect a pin for mobile battery. For plug and play use, connect a switch. If you don’t have a mobile battery, you can also use a 9-volt battery. In this circuit, I have connected a 9-volt battery to the Arduino with a 3V regulator.


Arduino POV Display Soldering

Assembling the Rotary Mechanism for the Arduino POV Display


Arduino POV Display Mechanical Assembly

Drill and make holes on the wooden block to attach the motor and connect the motor as shown in the figure. Connect the wheel and screw the two bolts on the holes of the wheel. Then cut a half of the scale and drill two holes and attach the scale and screw it (the electronics part is going to be attached here).


Arduino POV Display Mechanical Assembly


Take a small plastic piece (as shown in the figure above) and connect the plastic piece perpendicular to the scale using the glue gun. Then take another piece of plastic and screw it on the other side of the wheel. Then make the mobile battery pack by soldering extension wires to the terminals. Connect the electronic part (the display board with LEDs) to the perpendicular part and connect the battery to the other side. Balance and fix the wheel on the center (make the center of gravity the center of the wheel). This is for minimizing vibration when it rotates.

For my Arduino POV, I changed the Green LED to a Red LED because when I capture the video using a camera, the green color is not seen clearly. Green color scatters more than Red (red color has the highest wave length) and can only be captured using a camera with better Frames Per Second.

Programming the Arduino POV Display


Arduino POV display


I programmed the Arduino Pro Mini using ‘FTDI USB to serial converter’. You can also program the Arduino Pro Mini using Arduino Uno board. Buy an FTDI USB to serial converter.

Finally, upload the program for Arduino POV display given below:

int delayTime = 1;
int charBreak = 2.1;
int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;

void setup(){
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);

int a[] = {1, 6, 26, 6, 1};
int b[] = {31, 21, 21, 10, 0};
int c2[] = {14, 17, 17, 10, 0};
int d[] = {31, 17, 17, 14, 0};
int e[] = {31, 21, 21, 17, 0};
int f[] = {31, 20, 20, 16, 0};
int g[] = {14, 17, 19, 10, 0};
int h[] = {31, 4, 4, 4, 31};
int i[] = {0, 17, 31, 17, 0};
int j[] = {0, 17, 30, 16, 0};
int k[] = {31, 4, 10, 17, 0};
int l[] = {31, 1, 1, 1, 0};
int m[] = {31, 12, 3, 12, 31};
int n[] = {31, 12, 3, 31, 0};
int o[] = {14, 17, 17, 14, 0};
int p[] = {31, 20, 20, 8, 0};
int q[] = {14, 17, 19, 14, 2};
int r[] = {31, 20, 22, 9, 0};
int s[] = {8, 21, 21, 2, 0};
int t[] = {16, 16, 31, 16, 16};
int u[] = {30, 1, 1, 30, 0};
int v[] = {24, 6, 1, 6, 24};
int w[] = {28, 3, 12, 3, 28};
int x[] = {17, 10, 4, 10, 17};
int y[] = {17, 10, 4, 8, 16};
int z[] = {19, 21, 21, 25, 0};

int eos[] = {0, 1, 0, 0, 0};
int excl[] = {0, 29, 0, 0, 0};
int ques[] = {8, 19, 20, 8, 0};

void displayLine(int line){
int myline;
myline = line;
if (myline>=16) {digitalWrite(LED1, HIGH); myline-=16;} else {digitalWrite(LED1, LOW);}
if (myline>=8)  {digitalWrite(LED2, HIGH); myline-=8;}  else {digitalWrite(LED2, LOW);}
if (myline>=4)  {digitalWrite(LED3, HIGH); myline-=4;}  else {digitalWrite(LED3, LOW);}
if (myline>=2)  {digitalWrite(LED4, HIGH); myline-=2;}  else {digitalWrite(LED4, LOW);}
if (myline>=1)  {digitalWrite(LED5, HIGH); myline-=1;}  else {digitalWrite(LED5, LOW);}

void displayChar(char c){
if (c == 'a'){for (int i = 0; i <5; i++){displayLine(a[i]);delay(delayTime);}displayLine(0);}
if (c == 'b'){for (int i = 0; i <5; i++){displayLine(b[i]);delay(delayTime);}displayLine(0);}
if (c == 'c2'){for (int i = 0; i <5; i++){displayLine(c2[i]);delay(delayTime);}displayLine(0);}
if (c == 'd'){for (int i = 0; i <5; i++){displayLine(d[i]);delay(delayTime);}displayLine(0);}
if (c == 'e'){for (int i = 0; i <5; i++){displayLine(e[i]);delay(delayTime);}displayLine(0);}
if (c == 'f'){for (int i = 0; i <5; i++){displayLine(f[i]);delay(delayTime);}displayLine(0);}
if (c == 'g'){for (int i = 0; i <5; i++){displayLine(g[i]);delay(delayTime);}displayLine(0);}
if (c == 'h'){for (int i = 0; i <5; i++){displayLine(h[i]);delay(delayTime);}displayLine(0);}
if (c == 'i'){for (int it = 0; it <5; it++){displayLine(i[it]);delay(delayTime);}displayLine(0);}
if (c == 'j'){for (int i = 0; i <5; i++){displayLine(j[i]);delay(delayTime);}displayLine(0);}
if (c == 'k'){for (int i = 0; i <5; i++){displayLine(k[i]);delay(delayTime);}displayLine(0);}
if (c == 'l'){for (int i = 0; i <5; i++){displayLine(l[i]);delay(delayTime);}displayLine(0);}
if (c == 'm'){for (int i = 0; i <5; i++){displayLine(m[i]);delay(delayTime);}displayLine(0);}
if (c == 'n'){for (int i = 0; i <5; i++){displayLine(n[i]);delay(delayTime);}displayLine(0);}
if (c == 'o'){for (int i = 0; i <5; i++){displayLine(o[i]);delay(delayTime);}displayLine(0);}
if (c == 'p'){for (int i = 0; i <5; i++){displayLine(p[i]);delay(delayTime);}displayLine(0);}
if (c == 'q'){for (int i = 0; i <5; i++){displayLine(q[i]);delay(delayTime);}displayLine(0);}
if (c == 'r'){for (int i = 0; i <5; i++){displayLine(r[i]);delay(delayTime);}displayLine(0);}
if (c == 's'){for (int i = 0; i <5; i++){displayLine(s[i]);delay(delayTime);}displayLine(0);}
if (c == 't'){for (int i = 0; i <5; i++){displayLine(t[i]);delay(delayTime);}displayLine(0);}
if (c == 'u'){for (int i = 0; i <5; i++){displayLine(u[i]);delay(delayTime);}displayLine(0);}
if (c == 'v'){for (int i = 0; i <5; i++){displayLine(v[i]);delay(delayTime);}displayLine(0);}
if (c == 'w'){for (int i = 0; i <5; i++){displayLine(w[i]);delay(delayTime);}displayLine(0);}
if (c == 'x'){for (int i = 0; i <5; i++){displayLine(x[i]);delay(delayTime);}displayLine(0);}
if (c == 'y'){for (int i = 0; i <5; i++){displayLine(y[i]);delay(delayTime);}displayLine(0);}
if (c == 'z'){for (int i = 0; i <5; i++){displayLine(z[i]);delay(delayTime);}displayLine(0);}
if (c == '!'){for (int i = 0; i <5; i++){displayLine(excl[i]);delay(delayTime);}displayLine(0);}
if (c == '?'){for (int i = 0; i <5; i++){displayLine(ques[i]);delay(delayTime);}displayLine(0);}
if (c == '.'){for (int i = 0; i <5; i++){displayLine(eos[i]);delay(delayTime);}displayLine(0);}

void displayString(char* s){
for (int i = 0; i<=strlen(s); i++){

void loop(){
displayString("hello world")


Now all you need to do is power up the module and the motor used to turn the whole system. And then you would be able to see “Hello World” lighting up when the motor reaches the correct rpm as shown below:

Arduino POV Display


You can also check out a video of an Arduino POV project done by Amir Ali here:




This is how easy it is to make an Arduino POV display at home. You can make it in an hour or two (depending on your soldering skills). Make your own Arduino POV and show it off like a boss.

Recommended Posts
Showing 32 comments
  • Vishal t katariya

    I need to do that
    But can u provide some dye kit
    Plese tell me with prise

  • Hemanand

    Need a POV Project for MNC. Reach me @ 9597837221 or [email protected]


    sir can you please explain me about
    int a[] = {1, 6, 26, 6, 1};
    int b[] = {31, 21, 21, 10, 0};
    int c2[] = {14, 17, 17, 10, 0};
    int d[] = {31, 17, 17, 14, 0};
    int e[] = {31, 21, 21, 17, 0}; these calculations……..

    • Aslesh Shetty

      To display H

      int h[] ={31,4,4,4,31};

      16 O O
      8 O O
      4 OOOOO
      2 O O
      1 O O
      31 is 16 + 8 + 4 + 2 + 1 (all leds on the first column are lit)
      4 is 0 + 0 + 4 + 0 + 0 (only the middle led is lit)

      and so on.

  • wasim

    hello sir, what is the use of the variable eos[], exc1[], ques[] ?

  • Damian

    Hello, we use this web to do this project with an arduino 328, and we are having problems with the code specifically with c2 and (hello world) and we need help to complete it since it is a class project.

    • Hamilton

      It’s nice to leave specific error messages when asking for programming help.
      Copy and paste.

  • samwit

    can we use arduino nano instead of arduino pro mini??

  • Nivya

    can i get code using 8 led and also a hall effect sensor

  • burhan

    plz code for clock … ?

  • Juan

    URGENT: What would be the corrections to the circuit if I can only use the Arduino UNO?

  • sidra tul muntaha

    i want to make this project and having problem in coding can somebody please be kind enough to give a guidlen if i want to show a clock

  • Nabeel Rasheed

    I am an Engineering Student and working on PoV with RGB 10 Leds.
    Mohammed Azhar will you please help to generate code for 10 leds using Demux IC for RGB leds.
    I have searched and worked on your code but unfortunately didn’t find any output through that code if Azhar or anyone who can help me out please send me code on my gmail: [email protected]

  • Tulga

    pls help me i need show time code

  • Ninad

    Any changes for arduino uno? Circuit doesnt work after uploading the code

  • Niraj

    Hey, I am confused about the negative parts of LEDs. You’ve said to connect the negative parts of the LEDs together, after that we have to connect them with negative of the battery? Also to which pin of the audrino do I connect the positive and negative of the battery to?

  • phaneendra

    hey can i do this with aurodino nano?

    i want to do it as oscillating LED display

    • Muhammed Azhar

      Yes sure!

      • prabhakar

        i m not getting code sir…. pls send me code send to my mail sir [email protected]




      Only need to edit last line. Add ‘ ; ‘ this sigh after the bracket. Like shown below-

      void loop(){
      displayString(“hello world”);

  • Snake47


    I am particularly interested by your project.
    But i have few questions before to work.

    what is the length between motor shaft and arduino assembly ?
    The speed rotation are variable or we need fixed to 500 rpm ?

    Thanks for your work


  • shivam

    hey suggest me some alternative for the regulator IC. its not available in india

  • Harsh

    Please tell me the logic behind those elements of alphabet array in short…
    how come 31 is max?

    • Kevin

      The arrays for each letter define the LEDs to turn on or off to display each vertical line of the letter — it is very clever to use decimal numbers which are then converted on the fly in displayLine() to a binary representation of the LEDs which are on or off. 31 is the same as 0b11111 (all LEDs on which is the maximum number). For example, L (31, 1, 1, 1, 0):


  • anurag k

    what is the length between motor shaft and arduino assembly

  • anurag k


  • Aswin Mohan

    theres a mistake in your programming.There is a ‘;’ after the sentence displayString(“hello world”).It should be like
    displayString(“hello world”);.Otherwise there will be error while compiling


      can please give me your codes for this pov display

  • Amal Shajan

    If you are inly using 5 led’s, ATiny85/45 is more logical choice. It is small and cheaper.

Leave a Comment

8 + 1 =

Start typing and press Enter to search