#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////////////////