#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Largura do display OLED em pixels
#define SCREEN_HEIGHT 64 // Altura do display OLED em pixels
#define OLED_ADDR 0x3C // Endereço I2C do display OLED
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Variáveis para armazenar horas, minutos e segundos
int horas = 0, minutos = 0, segundos = 0;
// Defina os pinos de entrada
const int entradaPin0 = 0, entradaPin1 = 1;
int estadoAnterior0 = HIGH, estadoAnterior1 = LOW;
// Variáveis para controle de tempo
unsigned long tempoInicio = 0;
bool ajustandoHoras = false;
void atualizarRelogio();
void exibirRelogio();
void exibirAjuste();
void setup() {
Serial.begin(9600);
// Inicializa o display OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("Falha na inicialização do SSD1306"));
for (;;); // Loop infinito para parar a execução
}
Serial.println(F("SSD1306 inicializado com sucesso"));
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Configura os pinos de entrada
pinMode(entradaPin0, INPUT);
pinMode(entradaPin1, INPUT);
// Exibe a tela inicial do relógio
exibirRelogio();
}
void loop() {
// Atualiza o relógio
atualizarRelogio();
// Lê o estado das entradas digitais
int estadoEntrada0 = digitalRead(entradaPin0);
int estadoEntrada1 = digitalRead(entradaPin1);
// Verifica se a tela deve ser alternada
if (estadoEntrada0 != estadoAnterior0) {
display.clearDisplay(); // Limpa a tela quando o estado muda
estadoAnterior0 = estadoEntrada0;
}
if (estadoEntrada0 == LOW) {
exibirRelogio();
} else {
exibirAjuste();
}
// Verifica se a entrada 1 está ligada para iniciar o ajuste automático
if (estadoEntrada1 == HIGH && estadoAnterior1 == LOW) {
tempoInicio = millis();
}
// Inicia o ajuste das horas após 5 segundos
if (estadoEntrada1 == HIGH && (millis() - tempoInicio >= 5000)) {
ajustandoHoras = true;
}
// Ajuste automático das horas
if (ajustandoHoras) {
if (millis() - tempoInicio >= 1000) { // Incrementa a cada segundo
horas++;
if (horas == 24) {
horas = 0;
}
tempoInicio = millis(); // Reinicia o tempo
}
}
// Verifica se a entrada 1 foi desligada para parar o ajuste
if (estadoEntrada1 == LOW && estadoAnterior1 == HIGH) {
ajustandoHoras = false;
}
estadoAnterior1 = estadoEntrada1;
delay(1000); // Espera de 1 segundo
}
void atualizarRelogio() {
// Incrementando os segundos a cada segundo
if (millis() - tempoInicio >= 1000) {
tempoInicio = millis();
segundos++;
if (segundos == 60) {
segundos = 0;
minutos++;
}
if (minutos == 60) {
minutos = 0;
horas++;
}
if (horas == 24) {
horas = 0;
}
}
}
void exibirRelogio() {
// Exibe a tela "Relogio"
display.clearDisplay();
display.setTextSize(1);
display.setCursor((SCREEN_WIDTH - 7 * 6) / 2, 0); // Centraliza a palavra "Relogio"
display.print("Relogio");
// Formatando a hora no formato 24H
String horaAtual = (horas < 10 ? "0" : "") + String(horas) + ":" +
(minutos < 10 ? "0" : "") + String(minutos) + ":" +
(segundos < 10 ? "0" : "") + String(segundos);
display.setTextSize(2.75); // Ajusta o tamanho do texto para 2.75 vezes
int textWidth = horaAtual.length() * 12; // Cada caractere tem aproximadamente 12 pixels de largura no tamanho 2.75
display.setCursor((SCREEN_WIDTH - textWidth) / 2, 20); // Ajusta a posição centralizada
display.print(horaAtual);
display.display();
}
void exibirAjuste() {
// Exibe a tela "Ajuste de Timers"
display.clearDisplay();
display.setTextSize(1);
display.setCursor((SCREEN_WIDTH - 16 * 6) / 2, 0); // Centraliza a palavra "Ajuste de Timers"
display.print("Ajuste de Timers");
// Exibe os campos "Prog1 00:00" e "Prog2 00:00" centralizados
display.setTextSize(1); // Ajusta o tamanho do texto para 1 vez
display.setCursor((SCREEN_WIDTH - 16 * 6) / 2, 20); // Centraliza "Prog1"
display.print("Prog1");
display.setTextSize(2.75); // Ajusta o tamanho do texto para 2.75 vezes
display.setCursor((SCREEN_WIDTH - 5 * 12) / 2, 20); // Centraliza "00:00"
display.print(" 00:00");
display.setTextSize(1); // Ajusta o tamanho do texto para 1 vez
display.setCursor((SCREEN_WIDTH - 16 * 6) / 2, 40); // Centraliza "Prog2"
display.print("Prog2");
display.setTextSize(2.75); // Ajusta o tamanho do texto para 2.75 vezes
display.setCursor((SCREEN_WIDTH - 5 * 12) / 2, 40); // Centraliza "00:00"
display.print(" 00:00");
display.display();
}