#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
// Dirección I2C del DS1307
#define DS1307_ADDRESS 0x68
#define i2c_Address 0x3c //Definir la direccion I2C 0x3C
#define SCREEN_WIDTH 128 // Ancho de la pantalla OLED, en píxeles
#define SCREEN_HEIGHT 64 // Alto de la pantalla OLED, en píxeles
#define OLED_RESET -1
#define B_set 5
#define B_up 3
#define B_down 4
#define LED_Alarm 6
//Crea el objeto diaplay asignando los pines
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int Up_Button=0,Down_Button=0,Set_Button=0, hour_A=0, minute_A=0;
// Control Botones
bool last_state = 1, last_state2 = 1, last_state3 = 1;
bool current_state = 0, current_state2 = 0, current_state3 = 0;
void setup() {
Wire.begin(); // Inicializa la comunicación I2C
Serial.begin(9600);
// Establecer hora: segundos, minutos, horas
setDateTime(0, 31, 9,0); // Ejemplo: 10:48:00
// Establecer fecha: dia, mes, año
setDateTime(30, 10, 24,4); // Ejemplo: 23:10:24
//printDate();
//Inicializar configuraciones del display
display.begin(i2c_Address, true);
pinMode(B_set, INPUT);
pinMode(B_up, INPUT);
pinMode(B_down, INPUT);
pinMode(LED_Alarm, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
display.clearDisplay();
printTime();
printDate();
printAlarm(5,30);
current_state = digitalRead(B_set);
if (last_state == LOW && current_state == HIGH) Set_Button++;
last_state = current_state;
//Serial.print("Set_Button: ");
//Serial.println(Set_Button);
if (current_state) setting();
//digitalWrite(LED_Alarm);
display.display();
}
void weekDay(int N){
switch (N){
case 1: display.print("Domingo");break;
case 2: display.print("Lunes");break;
case 3: display.print("Martes");break;
case 4: display.print("Miercoles");break;
case 5: display.print("Jueves");break;
case 6: display.print("Viernes");break;
case 7: display.print("Sabado");break;
}
}
void setDateTime(int8_t A, int8_t B, int8_t C, int PD) {
// Escribir los valores en formato BCD
A = ((A / 10) << 4) + (A % 10);
B = ((B / 10) << 4) + (B % 10);
C = ((C / 10) << 4) + (C % 10);
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(PD); // Establecer el puntero de dirección en PD (0 para segundos)
Wire.write(A);
Wire.write(B);
Wire.write(C); // Formato de 24 horas
Wire.endTransmission();
}
void printTime() {
// Solicitar datos desde el DS1307
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0); // Establecer el puntero de dirección en 0 (segundos)
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 3); // Leer 3 bytes (segundos, minutos, horas)
int8_t second = (Wire.read() & 0x7F); // Leer segundos y eliminar el bit de habilitación del reloj
int8_t minute = Wire.read();
int8_t hour = Wire.read();
second = ((second >> 4) * 10) + (second & 0x0F);
minute = ((minute >> 4) * 10) + (minute & 0x0F);
hour = ((hour >> 4) * 10) + (hour & 0x0F);
// Imprimir la hora y fecha en la pantalla OLED
//display.clearDisplay(); //Limpia la pantalla
display.setTextColor(SH110X_WHITE); //Configurar el color del texto
display.setCursor(1, 1); // Posición de inicio de escritura
display.setTextSize(2); // Tamaño de la letra
if (hour<10)display.print("0");
display.print(hour);
display.print(":");
if (minute<10)display.print("0");
display.print(minute);
display.print(":");
if (second<10)display.print("0");
display.print(second);
}
void printDate() {
// Solicitar datos desde el DS1307
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(3); // Establecer el puntero de dirección en 0 (segundos)
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 4); // Leer 4 bytes (segundos, minutos, horas)
int8_t Day_week = (Wire.read() );
int8_t Day = (Wire.read() );
int8_t month = Wire.read();
int8_t year = Wire.read();
Day= ((Day>> 4) * 10) + (Day & 0x0F);
month = (( month >> 4) * 10) + ( month & 0x0F);
year = (( year >> 4) * 10) + ( year & 0x0F);
// Imprimir la fecha en la pantalla OLED
display.setCursor(2, 17); // Posición de inicio de escritura
display.setTextSize(1.7); // Tamaño de la letra
weekDay(Day_week);
display.print(" ");
if (Day<10)display.print("0");
display.print(Day);
display.print("/");
if (month<10)display.print("0");
display.print( month );
display.print("/");
if (year<10)display.print("0");
display.print(year);
display.print(" ");
}
void printAlarm (int hour_A, int minute_A) {
display.setCursor(2, 27); // Posición de inicio de escritura
display.setTextSize(2); // Tamaño de la letra
display.print("Alarma");
display.setCursor(2, 43); // Posición de inicio de escritura
display.setTextSize(2);
if (hour_A<10)display.print("0");
display.print(hour_A);
display.print(":");
if (minute_A<10)display.print("0");
display.print(minute_A);
}
void setting (){
display.setCursor(110, 50); // Posición de inicio de escritura
display.setTextSize(1.7);
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0); // Establecer el puntero de dirección en 0 (segundos)
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 6); // Leer 3 bytes (segundos, minutos, horas)
int8_t second = (Wire.read() & 0x7F); // Leer segundos y eliminar el bit de habilitación del reloj
int8_t minute = Wire.read();
int8_t hour = Wire.read();
int8_t Day = (Wire.read() );
int8_t month = Wire.read();
int8_t year = Wire.read();
current_state2 = digitalRead(B_up);
current_state3 = digitalRead(B_down);
switch (Set_Button){
case 1:
hour = ((hour >> 4) * 10) + (hour & 0x0F);
if (last_state2 == LOW && current_state2 == HIGH) hour++;
if (last_state3 == LOW && current_state3 == HIGH) hour--;
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(3);
Wire.write(hour);
Wire.endTransmission();
Serial.print("hour: ");
Serial.println(hour);
display.print("h");
break;
case 2:
minute = ((minute >> 4) * 10) + (minute & 0x0F);
display.print("m");
break;
case 3:
second = ((second >> 4) * 10) + (second & 0x0F);
display.print("s");
break;
case 4:
Day= ((Day>> 4) * 10) + (Day & 0x0F);
display.print("D");
break;
case 5:
month = (( month >> 4) * 10) + ( month & 0x0F);
display.print("M");
break;
case 6:
year = (( year >> 4) * 10) + ( year & 0x0F);
display.print("A");
break;
case 7:
display.print("ha");
break;
case 8:
display.print("ma");
break;
case 9:
Set_Button=0;
current_state = LOW;
break;
}
/*/ Establecer hora editada: segundos, minutos, horas
setDateTime(second, minute, hour,0); // Ejemplo: 10:48:00
// Establecer fecha editada: dia, mes, año
setDateTime(Day, month, year,4); // Ejemplo: 23:10:24
//Wire.endTransmission();*/
last_state2 = current_state2;
last_state3= current_state3;
delay(50);
}