Devo muovere una lancetta grafica su un orologio analogico su TFT.
Alura..
il quadrante tondo è questo:
myGLCD.drawCircle(160,120,100); (origine X,Y del centro su un TFT 320x240, e Raggio = 100)
La lancetta alle ore zero è questa:
myGLCD.drawLine(160,120,160,20); (origine X e Y, e fine della riga X e Y)
Ora io dovrei modificare la fine della riga ogni secondo, ma come faccio a fare una funzione che mi segue l'arco del cerchio del quadrante e non un semplice "scalinare"?? Devo crearmi 60 (60 sec) destinazioni fine-riga "a mano"? (array) :~
Cosa intendi per scalinare ?
Dovrebbe essere fattibile con un pò di trigonometria.
Avevo fatto un orologio in Windows (allego, provare con DevC++ free), e il calcolo era questo:
x1= (radius-20)*cos( secang * dt.wSecond - PI_HALF);
y1= (radius-20)*sin( secang * dt.wSecond - PI_HALF);
SelectObject(hdc,hpenN);
MoveToEx(hdc,p0X ,p0Y ,NULL); // linea start
LineTo (hdc,p0X+x1,p0Y+y1); // linea end
Dove:
secang=PI_2/60.0;
#define PI ((double)3.1415926535)
#define PI_2 ((double)6.283185307)
#define PI_HALF ((double)1.57079632675)
dt.wSecond => i secondi del timer
p0X e p0Y sono il mio centro del cerchio, penso il tuo 160,120
wOrologio.c (4.25 KB)
Grazie Nid.
Ho risolto poco fa estrapolando e adattando una sezione di codice da un esempio per Nokia 5110 di Adafruit.
In realtà non devo fare un orologio, ma a display un visualizzatore per la posizione di un motorino passo-passo (tipo lancetta su cerchio, come i secondi).
Sono 96 posizioni e non 60, e poi non è legato ad una struttura second di time.h, ma, ovviamente, ad un mio contatore a partire dalla pos. zero.
Con un sacco di faticaccia ho convertito la funzione Adafruit orologesca alle mie esigenze:
Ecccola...
void Radianti() {
myGLCD.printNumI(counter, RIGHT,0); //stampo il numeretto della posizione da 0 a 95
angle = ((2 * pi / 96) * counter); // variabile angle, che mi dice l'angolo in radianti / 96, e non 60, posizioni del motorino
myGLCD.setColor(VGA_BLACK); // riga nera per sovrascrivere-cancellare quella disegnata precedentemente
myGLCD.drawLine(160, 120, end_x, end_y); // riga nera ecc.
end_x = (hand_radius * cos (angle)) + 160; // calcolo fine riga x con raggio, coseno di angle, e il punto di origine-centro del cerchio
end_y = (hand_radius * sin (angle)) + 120; //calcolo fine riga y con raggio, coseno di angle, e il punto di origine-centro del cerchio
Serial.println(end_x); // un pò di debug per capire dove vado a parare
Serial.println(end_y);
myGLCD.drawLine(160, 120, end_x, end_y); // finalmente disegno la mia linea-lancetta su 96 posizioni
}
Alla fine niente di trascendentale eh!
BaBBuino:
Grazie Nid.
Ho risolto poco fa estrapolando e adattando una sezione di codice da un esempio per Nokia 5110 di Adafruit.
In realtà non devo fare un orologio, ma a display un visualizzatore per la posizione di un motorino passo-passo (tipo lancetta su cerchio, come i secondi).
Sono 96 posizioni e non 60, e poi non è legato ad una struttura second di time.h, ma, ovviamente, ad un mio contatore a partire dalla pos. zero.
Con un sacco di faticaccia ho convertito la funzione Adafruit orologesca alle mie esigenze:
Ecccola...
void Radianti() {
myGLCD.printNumI(counter, RIGHT,0); //stampo il numeretto della posizione da 0 a 95
angle = ((2 * pi / 96) * counter); // variabile angle, che mi dice l'angolo in radianti / 96, e non 60 (orologio), posizioni del motorino
myGLCD.setColor(VGA_BLACK); // riga nera per sovrascrivere-cancellare quella disegnata precedentemente
myGLCD.drawLine(160, 120, end_x, end_y); // riga nera ecc.
end_x = (hand_radius * cos (angle)) + 160; // calcolo fine riga x con raggio, coseno di angle, e il punto di origine-centro del cerchio
end_y = (hand_radius * sin (angle)) + 120; //calcolo fine riga y con raggio, coseno di angle, e il punto di origine-centro del cerchio
Serial.println(end_x); // un pò di debug per capire dove vado a parare
Serial.println(end_y);
myGLCD.drawLine(160, 120, end_x, end_y); // finalmente disegno la mia linea-lancetta su 96 posizioni
}
Alla fine niente di trascendentale eh!
Prego. 
Se guardi i calcoli sono abbastanza simili. Io parto da PI_2/60.0 e tu da (2 * pi / 96).
Come disegno è abbastanza preciso ? Foto ? 
Si, ben spaziate senza seghettature asimmetriche.
Le lancette si vedono poco definite perchè ho scattato con il sistema in movimento.

