#include <TFT_eSPI.h>
#include <SPI.h> // this is needed for display
#include <ArduinoTrace.h>
//This display 320 x 240 pixels;
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library with default width and height
#define MAX_GRADS 360
#define NUM_LINES 8
#define PI_DIV_180 0.0174532925 // Macro para eliminar magic number en conversion de grad -> rad
int rm=115; //radio circulo magenta
int ry=40; //radio circulo amarillo
int cx=120; //x_center of the circles
int cy=160; //y_center of the circles
//------ TODO: additional global variables declaration ----------//
float sx = 0, sy = 1;
uint16_t x0=0, x1=0, yy0=0, yy1=0;
uint32_t targetTime = millis() - 1000;
uint8_t line = 0, prevline = 12;
boolean initial = true;
//---------------------------------------------------------------//
void setup(void) {
Serial.begin(115200);
Serial.println("INICIO:");
tft.init();
tft.setRotation(0);
// Draw circles:
tft.drawCircle(cx,cy,rm, TFT_MAGENTA);
tft.drawCircle(cx,cy,ry, TFT_YELLOW);
}
void loop() {
// Draw circles:
tft.drawCircle(cx,cy,rm, TFT_MAGENTA);
tft.drawCircle(cx,cy,ry, TFT_YELLOW);
//----- TODO: WRITE REQUIRED CODE ------------ ---------//
if (targetTime < millis() || initial) { // Comprueba si ha pasado 1 segundo
targetTime += 500; // Actualiza el tiempo objetivo para el próximo segundo
prevline = line;
line++;
if (line > 12)
line = 0;
if (prevline > 12)
prevline = 0;
}
initial = false; // Una vez el sistema se ha inicializado, se comporta de manera normal
// Dibujar la linea que corresponda
for (int i = 0, j = 0; i < 360; i += (360 / 12), j++) {
sx = cos((i - 90) * PI_DIV_180);
sy = sin((i - 90) * PI_DIV_180);
x0 = sx * ry + cx;
yy0 = sy * ry + cy;
x1 = sx * rm + cx;
yy1 = sy * rm + cy;
// Si la linea evaluada corresponde a la que estaba encendida antes, apagala
if ((j % 12) == prevline) {
tft.drawLine(x0, yy0, x1, yy1, TFT_BLACK);
continue;
}
// Enciende la linea que corresponde
if ((j % 12) == line) {
tft.drawLine(x0, yy0, x1, yy1, TFT_GREEN);
}
}
//------------------------------------------------------//
}