arduino POV display CLOCK
Click here to buy the product
👇👇👇
Download text code
/* Electronoobs POV dsiplay (Persistance of vision)
*
* Subscribe: http://www.youtube.com/c/ELECTRONOOBS
* Tutorial: http://www.electronoobs.com/eng_arduino_tut21.php
*/
int text_ok=0;
int a[] = {126, 144, 144, 144, 126};
int b[] = {254, 146, 146, 146, 108};
int c[] = {254, 130, 130, 130, 130};
int d[] = {254, 130, 130, 130, 124};
int e[] = {254, 146, 146, 146, 146};
int f[] = {254, 144, 144, 144, 128};
int g[] = {124, 130, 138, 138, 76};
int h[] = {254, 16, 16, 16, 254};
int i[] = {130, 250, 130};
int j[] = {12, 2, 2, 2, 252};
int k[] = {254, 16, 40, 68, 130};
int l[] = {254, 2, 2, 2, 2};
int m[] = {254, 64, 32, 64, 254};
int n[] = {254, 32, 16, 8, 254};
int o[] = {124, 130, 130, 130, 124};
int p[] = {254, 136, 136, 136, 112};
int q[] = {124, 130, 138, 134, 126};
int r[] = {254, 144, 152, 148, 98};
int s[] = {100, 146, 146, 146, 76};
int t[] = {128, 128, 254, 128, 128};
int u[] = {252, 2, 2, 2, 252};
int v[] = {248, 4, 2, 4, 248};
int w[] = {254, 4, 8, 4, 254};
int x[] = {198, 40, 16, 40, 198};
int y[] = {224, 16, 14, 16, 224};
int z[] = {134, 138, 146, 162, 194};
int eos[] = {0, 3, 2,0};
int excl[] = {0, 250, 0};
int ques[] = {64, 128, 138, 144, 96};
float delayTime=1;
//POV clock cariables
unsigned long currentMillis, elapsed_loop_counter, previousMillis;
unsigned long counter_1, current_count;
//Interruption varaibles to count rotation speed
//We create 4 variables to store the previous value of the input signal (if LOW or HIGH)
byte last_IN_state; //Here we store the previous state on digital pin 13
float one_rot_time=0; //Here we store the full rotation time
float time_per_deg=0; //Here we store the time it takes to make one degree rotation
void setup() {
PCICR |= (1 << PCIE0); //enable PCMSK0 scan
PCMSK0 |= (1 << PCINT5); //Enable pin state interruption on pin D13
//Output pins register configuration
DDRD |= B11111100; //2 to 7 as output
DDRB |= B00011111; //8 to 12 as output
DDRB &= B11011111; //13 input
PORTD &= B00000011; //2 to 7 LOW
PORTB &= B00000000; //8 to 13 LOW
}
void draw_a_line(int this_line){
int now_line;
now_line = this_line;
if (now_line>=128){PORTD |= B00100000; now_line-=128;} else {PORTD &= B11011111;}
if (now_line>=64) {PORTD |= B01000000; now_line-=64;} else {PORTD &= B10111111;}
if (now_line>=32) {PORTD |= B10000000; now_line-=32;} else {PORTD &= B01111111;}
if (now_line>=16) {PORTB |= B00000001; now_line-=16;} else {PORTB &= B11111110;}
if (now_line>=8) {PORTB |= B00000010; now_line-=8;} else {PORTB &= B11111101;}
if (now_line>=4) {PORTB |= B00000100; now_line-=4;} else {PORTB &= B11111011;}
if (now_line>=2) {PORTB |= B00001000; now_line-=2;} else {PORTB &= B11110111;}
if (now_line>=1) {PORTB |= B00010000; now_line-=1;} else {PORTB &= B11101111;}
}
void displayChar(char cr, float line_delay){
if (cr == 'a'){for (int i = 0; i <5; i++){draw_a_line(a[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'b'){for (int i = 0; i <5; i++){draw_a_line(b[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'c'){for (int i = 0; i <5; i++){draw_a_line(c[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'd'){for (int i = 0; i <5; i++){draw_a_line(d[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'e'){for (int i = 0; i <5; i++){draw_a_line(e[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'f'){for (int i = 0; i <5; i++){draw_a_line(f[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'g'){for (int i = 0; i <5; i++){draw_a_line(g[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'h'){for (int i = 0; i <5; i++){draw_a_line(h[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'i'){for (int itr = 0; itr <3; itr++){draw_a_line(i[itr]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'j'){for (int i = 0; i <5; i++){draw_a_line(j[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'k'){for (int i = 0; i <5; i++){draw_a_line(k[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'l'){for (int i = 0; i <5; i++){draw_a_line(l[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'm'){for (int i = 0; i <5; i++){draw_a_line(m[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'n'){for (int i = 0; i <5; i++){draw_a_line(n[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'o'){for (int i = 0; i <5; i++){draw_a_line(o[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'p'){for (int i = 0; i <5; i++){draw_a_line(p[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'q'){for (int i = 0; i <5; i++){draw_a_line(q[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'r'){for (int i = 0; i <5; i++){draw_a_line(r[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 's'){for (int i = 0; i <5; i++){draw_a_line(s[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 't'){for (int i = 0; i <5; i++){draw_a_line(t[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'u'){for (int i = 0; i <5; i++){draw_a_line(u[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'v'){for (int i = 0; i <5; i++){draw_a_line(v[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'w'){for (int i = 0; i <5; i++){draw_a_line(w[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'x'){for (int i = 0; i <5; i++){draw_a_line(x[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'y'){for (int i = 0; i <5; i++){draw_a_line(y[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == 'z'){for (int i = 0; i <5; i++){draw_a_line(z[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == '!'){for (int i = 0; i <3; i++){draw_a_line(excl[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == '?'){for (int i = 0; i <5; i++){draw_a_line(ques[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
if (cr == '.'){for (int i = 0; i <4; i++){draw_a_line(eos[i]);delayMicroseconds(line_delay);}draw_a_line(0);}
delayMicroseconds(line_delay*2);
}
void displayString(char* s, float line_delay){
for (int i = 0; i<=strlen(s); i++){
displayChar(s[i],line_delay);
}
}
void loop() {
currentMillis = micros();
elapsed_loop_counter = currentMillis - previousMillis;
delayTime = time_per_deg*3.5; //we want 2 degrees for each line of the letters
//This if here is to make sure I'll start printing at 216 deg so the text will be centered.
if((elapsed_loop_counter >= time_per_deg*(216)) && (elapsed_loop_counter < time_per_deg*(217)) && text_ok)
{
displayString("electronoobs",delayTime);
//delayMicroseconds(delayTime*10);
text_ok=0;
}
}
ISR(PCINT0_vect){
//First we take the current count value in micro seconds using the micros() function
current_count = micros();
///////////////////////////////////////Channel 1
if(PINB & B00100000){ //We make an AND with the pin state register, We verify if pin 8 is HIGH???
if(last_IN_state == 0){ //If the last state was 0, then we have a state change...
last_IN_state = 1; //Store the current state into the last state for the next loop
counter_1 = current_count; //Set counter_1 to current value.
}
}
else if(last_IN_state == 1){ //If pin 8 is LOW and the last state was HIGH then we have a state change
last_IN_state = 0; //Store the current state into the last state for the next loop
one_rot_time = current_count - counter_1; //We make the time difference. Channel 1 is current_time - timer_1.
time_per_deg = one_rot_time/360.0;
previousMillis = micros();
text_ok=1;
}
}
Analog_POV_clock
/* Electronoobs POV dsiplay (Persistance of vision)
* Subscribe: http://www.youtube.com/c/ELECTRONOOBS
* Tutorial: http://www.electronoobs.com/eng_arduino_tut21.php */
//Variables for real time count
unsigned long Real_time_millis = 0;
unsigned long Previous_real_time_millis = 0;
float SEC;
float MIN= 45;
float HOUR = 2;
float dots_marker = 0; //Variable used for the 4 red dots
//POV clock cariables
unsigned long currentMillis, elapsed_loop_counter, previousMillis;
unsigned long counter_1, current_count;
//Interruption varaibles to count rotation speed
//We create 4 variables to store the previous value of the input signal (if LOW or HIGH)
byte last_IN_state; //Here we store the previous state on digital pin 13
float one_rot_time=0; //Here we store the full rotation time
float time_per_deg=0; //Here we store the time it takes to make one degree rotation
void setup() {
PCICR |= (1 << PCIE0); //enable PCMSK0 scan
PCMSK0 |= (1 << PCINT5); //Enable pin state interruption on pin D13
//Output pins register configuration
/* D2 = Blue LED
* D3 = Red 1 LED
* D4 = Red 2 LED
* D5 = Green 1 LED
* D6 = Green 2 LED
* D7 = Green 3 LED
* D8 = Green 4 LED
* D9 = Green 5 LED
* D10 = Green 6 LED
* D11 = Green 7 LED
* D12 = Green 8 LED
*/
DDRD |= B11111100; //2 to 7 as output
DDRB |= B00011111; //8 to 12 as output
DDRB &= B11011111; //13 input
PORTD &= B00000011; //2 to 7 LOW
PORTB &= B11100000; //8 to 12 LOW
}
void loop() {
//Here we calculate seconds, minutes and hours
Real_time_millis = millis();
if(Real_time_millis - Previous_real_time_millis >= 1000){
Previous_real_time_millis += 1000;
SEC=SEC+1;
if(SEC > 59)
{
SEC=0;
MIN=MIN+1;
}
if(MIN > 59)
{
MIN = 0;
HOUR = HOUR+1;
}
}//End of real time count
//Here is our loop counter. elapsed_loop_counter will reset each loop and count the loop time
//When we reach the amount of time desired we turn ond or off the LEDs
currentMillis = micros();
elapsed_loop_counter = currentMillis - previousMillis;
//Print the 4 red dots
if(elapsed_loop_counter >= time_per_deg*(dots_marker) && elapsed_loop_counter < time_per_deg*(dots_marker+3) )
{
PORTD |= B00011000; //3,4 HIGH
}
if(elapsed_loop_counter >= time_per_deg*(dots_marker+3))
{
PORTD &= B11100111; //3, 4 LOW, the two red LEDs
dots_marker = dots_marker + 90;
if(dots_marker >= 360)
{
dots_marker = 0;
}
}
//Print the second line
if(elapsed_loop_counter >= time_per_deg*(SEC*6) && elapsed_loop_counter < time_per_deg*((SEC*6)+2) )
{
PORTB |= B00011111; //8, 9, 10, 11 and 12 as HIGH
PORTD |= B11100000; //2 (blue), 5, 6 and 7 as HIGH
}
if(elapsed_loop_counter >= time_per_deg*((SEC*6)+2))
{
PORTB &= B11100000;
PORTD &= B00011111;
}
//Print the minute line
if(elapsed_loop_counter >= time_per_deg*(MIN*6) && elapsed_loop_counter < time_per_deg*((MIN*6)+1) )
{
PORTB |= B00011111; //8, 9, 10, 11 and 12 as HIGH
PORTD |= B11000000; //2 (blue), 5, 6 and 7 as HIGH
}
if(elapsed_loop_counter >= time_per_deg*((MIN*6)+1))
{
PORTB &= B11110000;
PORTD &= B00111111;
}
//Print the hour line
if(elapsed_loop_counter >= time_per_deg*(HOUR*30) && elapsed_loop_counter < time_per_deg*( (HOUR*30) +1) )
{
PORTB |= B00011111; //8, 9, 10, 11 and 12 as HIGH
PORTD |= B00000000; //2 (blue), 5, 6 and 7 as HIGH
}
if(elapsed_loop_counter >= time_per_deg*( (HOUR*30) +1))
{
PORTB &= B11100000;
PORTD &= B11111111;
}
}
ISR(PCINT0_vect){
//First we take the current count value in micro seconds using the micros() function
current_count = micros();
///////////////////////////////////////
if(PINB & B00100000){ //We make an AND with the pin state register, We verify if pin 13 is HIGH???
if(last_IN_state == 0){ //If the last state was 0, then we have a state change...
last_IN_state = 1; //Store the current state into the last state for the next loop
counter_1 = current_count; //Set counter_1 to current value.
}
}
else if(last_IN_state == 1){ //If pin 13 is LOW and the last state was HIGH then we have a state change
last_IN_state = 0; //Store the current state into the last state for the next loop
one_rot_time = current_count - counter_1; //We make the time difference. one_rot_time 1 is current_count - counter_1.
time_per_deg = one_rot_time/360.0;
previousMillis = micros();
}
}
Tags
Arduino