[RISOLTO] Lancetta orologio su TFT

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. :smiley:
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 ? :smiley:

Si, ben spaziate senza seghettature asimmetriche.

Le lancette si vedono poco definite perchè ho scattato con il sistema in movimento.