Scopul proiectului este de a crea un ceas cu afisaj de tip analog folosind fenomenul de POV (Persistence of Vision).
Am ales ca modul de afisare sa fie in stil analog (cu limbi si nu cifre) pentru ca mi s-a parut mai atractiv ca efect vizual.
#include <avr/io.h> #define F_CPU 16000000 #include <util/delay.h> #define period 95 #define onTime 2 #define drawLine(t) PORTD = PORTD ^ 63; _delay_ms(t); PORTD = PORTD ^ 63; #define waitTime(t) _delay_ms(t); #define H 1 #define M 25 #define S 40 void swap(double *a, double *b) { double aux; aux = *a; *a = *b; *b = aux; } int alphaToMs(double alpha) { return (int)(period * alpha/360); } int main() { double h = H,m = M,s = S, ms = 0; double alpha_h, alpha_m, alpha_s; int cur_time, aux; DDRD = 0xFF; //setez pinii pe iesire PORTD = 63; while(1) { alpha_h = (double)360/12 * h + (double)360/(12*60) * m + (double)360/(12*60*60) * s; alpha_m = (double)360/60 * m + (double)360/(60*60) * s; alpha_s = (double)360/60 * s; if(alpha_m > alpha_s) { swap(&alpha_m, &alpha_s); } if(alpha_h > alpha_m) { swap(&alpha_h, &alpha_m); } if(alpha_m > alpha_s) { swap(&alpha_m, &alpha_s); } cur_time = 0; //cur_time = period - onTime; //drawLine(onTime); //waitTime(cur_time); aux = alphaToMs(alpha_h); waitTime(aux); drawLine(onTime); cur_time += (aux + onTime); aux = alphaToMs(alpha_m) - cur_time; if(aux > 0) { waitTime(aux); drawLine(onTime); cur_time += (aux + onTime); } aux = alphaToMs(alpha_s) - cur_time; if(aux > 0) { waitTime(aux); drawLine(onTime); cur_time += (aux + onTime); } aux = period - cur_time; if(aux > 0) { waitTime(aux); } ms += period; if(ms >= 1000) { s ++; ms = ms - 1000; } if(s == 60) { m ++; s = 0; } if(m == 60) { h ++; m = 0; } if(h == 12) { h = 0; } } return 0; }
Folosirea unui DC motor a implicat foarte mult trial-and-error pentru determinarea turatiei acestuia. De asemenea probleme apar si datorita faptului ca , neffind suficient de puternic, motorul nu isi mentine constanta turatia. O solutie ar fi fost utilizarea unui motor pas-cu-pas, astfel controland precis turatia ansamblului.