#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define BTN_MODE 12
#define BTN_SET 14
int mode = 0;
unsigned long lastDebounce = 0;
// Simulação de tempo (relógio interno)
unsigned long baseMillis = 0;
int simHour = 12;
int simMin = 0;
int simDay = 14;
int simMonth = 5;
// Cronômetro
bool chronoRunning = false;
unsigned long chronoStart = 0;
unsigned long chronoTime = 0;
// Soneca
bool sleeping = false;
unsigned long sleepStart = 0;
void setup() {
pinMode(BTN_MODE, INPUT_PULLUP);
pinMode(BTN_SET, INPUT_PULLUP);
Wire.begin(21, 22);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
baseMillis = millis();
}
void loop() {
unsigned long nowMillis = millis();
// Atualiza hora simulada (1 min a cada 5s)
if (nowMillis - baseMillis >= 5000) {
baseMillis = nowMillis;
simMin++;
if (simMin >= 60) {
simMin = 0;
simHour++;
if (simHour >= 24) {
simHour = 0;
simDay++;
if (simDay > 31) {
simDay = 1;
simMonth++;
if (simMonth > 12) simMonth = 1;
}
}
}
}
display.clearDisplay();
display.setCursor(0, 0);
display.println("== YenWatch Mini ==");
switch (mode) {
case 0: // Hora
display.setCursor(20, 16);
if (simHour < 10) display.print("0");
display.print(simHour);
display.print(":");
if (simMin < 10) display.print("0");
display.print(simMin);
break;
case 1: // Data
display.setCursor(20, 16);
if (simDay < 10) display.print("0");
display.print(simDay);
display.print("/");
if (simMonth < 10) display.print("0");
display.print(simMonth);
break;
case 2: { // Cronômetro
unsigned long elapsed = chronoRunning ? (nowMillis - chronoStart + chronoTime) : chronoTime;
int mins = (elapsed / 60000);
int secs = (elapsed / 1000) % 60;
display.setCursor(20, 16);
if (mins < 10) display.print("0");
display.print(mins);
display.print(":");
if (secs < 10) display.print("0");
display.print(secs);
break;
}
case 3: { // Soneca
if (!sleeping) {
sleeping = true;
sleepStart = nowMillis;
}
display.setCursor(20, 16);
display.println("Dormindo...");
if (nowMillis - sleepStart >= 10000) {
sleeping = false;
mode = 0;
}
break;
}
}
display.display();
// Debounce dos botões
if (nowMillis - lastDebounce > 200) {
if (digitalRead(BTN_MODE) == LOW) {
mode = (mode + 1) % 4;
lastDebounce = nowMillis;
}
if (digitalRead(BTN_SET) == LOW) {
lastDebounce = nowMillis;
if (mode == 1) {
simDay++;
if (simDay > 31) {
simDay = 1;
simMonth++;
if (simMonth > 12) simMonth = 1;
}
}
else if (mode == 2) {
if (!chronoRunning) {
chronoRunning = true;
chronoStart = nowMillis;
} else {
chronoRunning = false;
chronoTime += nowMillis - chronoStart;
}
}
}
}
}