#include <Adafruit_GFX.h>    // Core graphics library
#include "Adafruit_ILI9341.h"
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;

  ////define pines arduino
  #define TFT_CS        10
  #define TFT_RST        8 // Or set to -1 and connect to Arduino RESET pin
  #define TFT_DC         9
 
 ///definir colores 
  #define BLACK   0x0000
  #define BLUE    0x001F
  #define RED     0xF800
  #define GREEN   0x07E0
  #define CYAN    0x07FF
  #define MAGENTA 0xF81F
  #define YELLOW  0xFFE0  
  #define WHITE   0xFFFF
  int mover_facha_y = 157;  // ariba y abajo
  int mover_facha_x = 34; // izquierda y derecha
  int mover_hora_digital_y = 80;  // ariba y abajo
  int hh = 0;
  int mm = 0;
  int ss = 0;
  int dia = 0;
  int mes = 0;
  int an = 0;
  int radio_minutero = 53; //esfera radio minutero
  int radio_esfera = 63;  //radio esfera
  int centrar_y = 63;  //arriba y abajo
  int centrar_x = 63;  //izquierda derecha
  
  const float scosConst = 0.0174532925;
  float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0;
  uint16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0;
  float sdeg=0, mdeg=0, hdeg=0;
  uint16_t osx,osy,omx,omy,ohx,ohy;
   
// For 1.8" TFT with ST7735 use:
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
////////////////////////////////////////////////////////////////

/////////////////

void setup() {
  Serial.begin(9600);
   Wire.begin();//inicializa comunicacion i2c
    if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
   
   //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //codigo para hacer que tome la fecha y hora del pc
   
  // Use this initializer if using a 1.8" TFT screen:
  tft.begin();      // Init ST7735S chip, black tab
  tft.fillScreen(ILI9341_BLACK);//color pantalla YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  tft.setTextColor(ILI9341_YELLOW); //color del texto
  tft.setTextSize(3); //tammaño del texto
  tft.setCursor(0, 30); //posicion del texto arriva
  tft.println(" Reloj          De           Emilio ");// YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  delay(3000);
  tft.fillScreen(BLACK);//color pantalla YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  esfera (); 
} 

void loop() {
 DateTime now = rtc.now();
 imprimir_datos(now);
dibujar_agujas_reloj(hh,mm,ss);
numeros();
}
///////////////////////////////////////////////////////
void dibujar_agujas_reloj(uint8_t h,uint8_t m,uint8_t s){
  // Pre-compute hand degrees, x & y coords for a fast screen update
  sdeg = s * 6;                  // 0-59 -> 0-354
  mdeg = m * 6 + sdeg * 0.01666667;  // 0-59 -> 0-360 - includes seconds
  hdeg = h * 30 + mdeg * 0.0833333;  // 0-11 -> 0-360 - includes minutes and seconds
  hx = cos((hdeg-90)*scosConst);    
  hy = sin((hdeg-90)*scosConst);
  mx = cos((mdeg-90)*scosConst);    
  my = sin((mdeg-90)*scosConst);
  sx = cos((sdeg-90)*scosConst);    
  sy = sin((sdeg-90)*scosConst);

  // Erase just old hand positions
  tft.drawLine(ohx, ohy, centrar_x+1, centrar_y+1, BLACK); //no tocar 
  tft.drawLine(omx, omy, centrar_x+1, centrar_y+1, BLACK); //no tocar  
  tft.drawLine(osx, osy, centrar_x+1, centrar_y+1, BLACK); //no tocar 
  // Draw new hand positions //tamaño y color 
  tft.drawLine(hx*(radio_esfera-32)+centrar_x+1, hy*(radio_esfera-32)+centrar_y+1, centrar_x+1, centrar_y+1, BLUE);
  tft.drawLine(mx*(radio_esfera-17)+centrar_x+1, my*(radio_esfera-17)+centrar_y+1, centrar_x+1, centrar_y+1, GREEN);
  tft.drawLine(sx*(radio_esfera-14)+centrar_x+1, sy*(radio_esfera-14)+centrar_y+1, centrar_x+1, centrar_y+1, RED);
  tft.fillCircle(centrar_x+1, centrar_y+1, 3, RED);
  
  // Update old x&y coords
  osx = sx*(radio_esfera-14)+centrar_x+1;
  osy = sy*(radio_esfera-14)+centrar_y+1;
  omx = mx*(radio_esfera-17)+centrar_x+1;
  omy = my*(radio_esfera-17)+centrar_y+1;
  ohx = hx*(radio_esfera-32)+centrar_x+1;
  ohy = hy*(radio_esfera-32)+centrar_y+1;
  delay(1000);
}
///////////////////////////////////////////////////////
void numeros(){
  tft.setTextColor(ILI9341_YELLOW);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  tft.setCursor(centrar_x-11, centrar_y-49);
  tft.setTextSize(2);
  tft.println("12");
  tft.setCursor(centrar_x-5, centrar_y+35);
  tft.println("6");
  tft.setCursor(centrar_x+39, centrar_y-6);
  tft.println("3");
  tft.setCursor(centrar_x-49, centrar_y-6);
  tft.println("9");
  
}
///////////////////////////////////////////////////////
void esfera (){
   tft.fillCircle(centrar_x, centrar_y, radio_esfera, BLUE); //esfera
  tft.fillCircle(centrar_x, centrar_y, radio_esfera-4, BLACK); //esfera
   
   // Draw 12 lines
  for(int i = 0; i<360; i+= 30) {
    sx = cos((i-90)*scosConst);
    sy = sin((i-90)*scosConst);
    x0 = sx*(radio_esfera-4)+radio_esfera;
    yy0 = sy*(radio_esfera-4)+radio_esfera;
    x1 = sx*(radio_esfera-11)+radio_esfera;
    yy1 = sy*(radio_esfera-11)+radio_esfera;
    tft.drawLine(x0, yy0, x1, yy1, WHITE);// YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  }
  
  // dibuja rayas minutos
  for(int i = 0; i<360; i+= 6) {
    sx = cos((i-90)*scosConst);
    sy = sin((i-90)*scosConst);
    x0 = sx*radio_minutero + centrar_x;   // 64 mover izquierda y darecha
    yy0 = sy*radio_minutero + centrar_y;  //80 mover puntos y rayas 5 minutos arriba y abajo
    tft.drawPixel(x0, yy0, GREEN);
    
    if(i==0 || i==180) tft.fillCircle(x0+1, yy0, 1, RED);// YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
    if(i==0 || i==180) tft.fillCircle(x0, yy0, 1, RED);
    if(i==90 || i==270) tft.fillCircle(x0+1, yy0, 1, RED);
    if(i==90 || i==270) tft.fillCircle(x0, yy0, 1, RED);
  }
}
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////
void imprimir_datos(DateTime dato)//adquiere los datosmediante la variable dato, no,  
{
   mes = dato.month();
   dia = dato.day();
   an = dato.year();
   
   hh = dato.hour();
   mm = dato.minute();
   ss = dato.second();
   tft.drawRoundRect(mover_facha_x-32, mover_facha_y-32, 70, 15, 4, CYAN);
   tft.setTextColor(ILI9341_RED);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
   tft.setTextSize(1);
   tft.setCursor(mover_facha_x+11, mover_facha_y-28);
   tft.print(dato.year(), DEC);
   tft.setCursor(mover_facha_x+4, mover_facha_y-28);
   tft.setTextColor(ILI9341_WHITE);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
   tft.print('/');
   tft.setTextColor(ILI9341_RED);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
   tft.setCursor(mover_facha_x-9, mover_facha_y-28);
   tft.print(Digito_0(mes));
   tft.setCursor(mover_facha_x-16, mover_facha_y-28);
   tft.setTextColor(ILI9341_WHITE);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
   tft.print('/');
   tft.setTextColor(ILI9341_RED);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
   tft.setCursor(mover_facha_x-29, mover_facha_y-28);
   tft.println(Digito_0(dia));
   
   
   if(hh > 24) hh = hh-12; //cambio el formato de 24 a 12 horas
  tft.drawRoundRect(0, mover_hora_digital_y+60, 128, 20, 6, GREEN);//
  tft.fillRoundRect(1, mover_hora_digital_y+61, 126, 18, 6, BLACK);
  
  tft.setTextColor(ILI9341_RED);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  tft.setTextSize(2);
  tft.setCursor(5, mover_hora_digital_y+63);
  tft.println(Digito_vacio(hh));
  tft.setTextColor(ILI9341_WHITE);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  tft.setCursor(26, mover_hora_digital_y+63);
  tft.println(":");
  tft.setTextColor(ILI9341_RED);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  tft.setCursor(34, mover_hora_digital_y+63);
  tft.println(Digito_0(mm));
  tft.setTextColor(ILI9341_WHITE);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  tft.setCursor(54, mover_hora_digital_y+63);
  tft.println(":");
  tft.setTextColor(ILI9341_RED);//YELLOW, WHITE, MAGENTA, CYAN, GREEN, RED, BLUE, BLACK
  tft.setCursor(63, mover_hora_digital_y+63);
  tft.println(Digito_0(ss));
  
  
  
  
}
String Digito_0(int numero) {
  if (numero >= 0 && numero < 10) {
    return "0" + String(numero);
  }
  else
  {
    return String(numero); 
  }
}
String Digito_vacio(int numero) {
  if (numero >= 0 && numero < 10) {
    return " " + String(numero);
  }
  else
  {
    return String(numero); 
  }
}
//////////////////////////////////fin////////////////

//////////////////////////////////fin////////////////

GND5VSDASCLSQWRTCDS1307+