Go Down

Topic: :) my first not-so-good persistence of vision (Read 19506 times) previous topic - next topic


Jun 23, 2010, 07:24 am Last Edit: Jun 23, 2010, 12:44 pm by alansmk Reason: 1
My first Arduino project: a classic persistence of vision display.

Definitely disappointed; it seems a lot worse than other ones i have seen people make. :(
but i think i will try again with another design. a clock perhaps.

any comment on my code? Is there another way to code POV?
it seems so.. laggy?
i read something about using interrupt, but i didn't exactly know how that works. I only have very basic C++/ arduino programming experience.

any advice would be appreciated!  :D

// 7 LED POV

// letter width
#define WIDTH 5

const byte font [][WIDTH] =
 {0x7e, 0x09, 0x09, 0x09, 0x7e}, //A
 {0x7f, 0x49, 0x49, 0x49, 0x36}, //B
 {0x3e, 0x41, 0x41, 0x41, 0x22}, //C
 {0x7f, 0x41, 0x41, 0x22, 0x1c}, //D
 {0x7f, 0x49, 0x49, 0x49, 0x49}, //E
 {0x7f, 0x09, 0x09, 0x09, 0x09}, //F
 {0x7e, 0x41, 0x49, 0x49, 0x38}, //G
 {0x7f, 0x08, 0x08, 0x08, 0x7f}, //H
 {0x00, 0x41, 0x7f, 0x41, 0x00}, //I
 {0x30, 0x40, 0x41, 0x7f, 0x01}, //J
 {0x7f, 0x08, 0x14, 0x22, 0x41}, //K
 {0x7f, 0x40, 0x40, 0x40, 0x40}, //L
 {0x7f, 0x02, 0x04, 0x02, 0x7f}, //M
 {0x7f, 0x02, 0x0c, 0x10, 0x7f}, //N
 {0x3e, 0x41, 0x41, 0x41, 0x3e}, //O
 {0x1e, 0x21, 0x21, 0x21, 0x5e}, //Q
 {0x7f, 0x09, 0x19, 0x29, 0x46}, //R
 {0x26, 0x49, 0x49, 0x49, 0x32}, //S
 {0x01, 0x01, 0x7f, 0x01, 0x01}, //T
 {0x3f, 0x40, 0x40, 0x40, 0x3f}, //U
 {0x07, 0x38, 0x40, 0x38, 0x07}, //V
 {0x3f, 0x40, 0x3f, 0x40, 0x3f}, //W
 {0x63, 0x14, 0x08, 0x14, 0x63}, //X
 {0x07, 0x08, 0x70, 0x08, 0x07}, //Y
 {0x61, 0x51, 0x49, 0x45, 0x43} //Z  
void setup()
 for (int k=0;k<=7;k++)

void display (char POVstring[])
 for (int i=(strlen(POVstring)-1); i>=0; i--)
   {  for (int j=(WIDTH-1); j>=0; j--)
       { PORTD = font[(int)POVstring-65][j]; delay(1); }
       PORTD = B00000000; delay(1);

void loop()
if ( analogRead(5)==0 )
 { display("HELLO"); }


First off, never be disappointed in something you have built or made, especially if you did the best job you could or know how. You should only be disappointed if you know you didn't try your best; and the only person who should worry about that is you. Be proud of your accomplishments, because they are for you and you only. Learn from your mistakes and progress, grow, and become better. What you have managed to do is beyond what 99% of the people on this planet can do, if only because they lack the experience, or more likely, the willingness to try (and potentially fail). You have tried and succeeded - REJOICE!

I will not respond to Arduino help PM's from random forum users; if you have such a question, start a new topic thread.


lol, not the kind of input i was looking for, but.. thanks!


Jun 23, 2010, 01:14 pm Last Edit: Jun 23, 2010, 01:16 pm by drhex Reason: 1
delay() is rather imprecise around 1 millisecond, try using delayMicroseconds() instead.
What makes you think your POV is worse than others?


Great work, and everything that cr0sh said.

My questions are,
1) what have you got on analogue pin 5?
2) what do you mean by "laggy"?
3) what is your rotational rate?

"analogRead" is much slower than "digitalRead"

Funky Diver

That's coool  :D

Might have to have a bash at it myself!


I love it!
I especially like the simplicity of your sketch! Beautifully made, well done!:)

I'm also curious about the answers to AWOL's question.
Btw Is that a hall effect sensor I see bent down towards the center?

cr0sh: Wow. Well put! I might be using that as a quote some time :)


Jun 24, 2010, 06:05 am Last Edit: Jun 24, 2010, 06:06 am by Tchnclfl Reason: 1
Looks like it works fine to me, and the code truly is a beautiful work of art in its simplicity.

I love it.  I can't stop looking at it! :O


I better never hear you say this is bad again! This is way beyond anything I can do! This is genious by standards!  :)


Jun 24, 2010, 06:37 am Last Edit: Jun 24, 2010, 06:39 am by raron Reason: 1
In fact when I think about it, I can probably just about answer AWOL's question 3 from the look(s) of it:

"HELLO" seems to cover about 90 degrees of a circle, 5 letters 5 pixels wide + 4 one-pixel space between letters = 29 pixels, or 29 ms for 1/4 circle. Should be about 8.6 rotations/sec (or 517 RPM).

So display FPS is 8.6-ish Hz? I guess this is what you mean by "laggy"? IE Flicker. Probably, if you switch to micros() as suggested, and also decrease the time between pixel columns (and increase the speed, say at least 4-6 times as fast), you will get a more stable display.
Unless I'm mistaken.


Jun 24, 2010, 02:44 pm Last Edit: Jun 24, 2010, 02:50 pm by alansmk Reason: 1
o, i didn't know there such a thing as Microsecond()
that changes a lot! awesome.

1.) yeah, analog 5 is a hall effect sensor. i didn't know digitalRead is faster.. i suppose i could try that  :D
2.)i guess laggy as in... it doesn't refresh very fast. hardly "persistence" of vision.
3.) i have no idea what the rotational rate is. i just strapped on a motor and let it spin. lol, i guess raron's guess on the speed is probably right on.

so i could get a more stable display (which was my problem) if i use Microsecond and increase the motor speed? okay, sounds like a easy fix!

wow, thanks for all the positivity / input, guys!


i think with some precomputed trigonometry you can also eliminate the letter deformation
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino


i think with some precomputed trigonometry you can also eliminate the letter deformation

Yes in theory but it would be much more difficult as at the moment, the line of LEDs is defined and lit accordingly. If they were all seperate then they would have to be individually controlled with different time scales etc.

The spaces would then be more stretched.

Personally I think it looks fine  ;)

It would look better with a larger disk so the letters are not so curved but it's not a massive issue  :)



It is neat code like this that makes me realise I still have lots to learn.
I've been writing the same thing, from a completely different angle, with the letters defined as individual bits.  This is so much tidier.
I'll revisit my code and rewrite my excel font creation spreadsheet to output hex rather than binary.
Most of my issues with writing at the moment seem to relate back to knowing when you can and can't make use of different data types.

Many thanks for posting.


Jun 28, 2010, 01:59 pm Last Edit: Jun 28, 2010, 02:00 pm by jfkreuter Reason: 1
Hey Alan,
I managed to get a somewhat bigger project done,  and the code for my project is longer...
But: I dont understand a bit of your (appearantly really nice) code! Can you maybe add some comments to the code so that other people can understand what its doing?

Go Up