#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Encoder.h>
#include <EEPROM.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // Reset não é usado no OLED I2C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define ENCODER_PIN_A 2
#define ENCODER_PIN_B 3
#define BUTTON_PIN 4
Encoder encoder(ENCODER_PIN_A, ENCODER_PIN_B);
int lastEncoded = 0;
int menuIndex = 0;
int selection = 0;
bool isAnimating = false;
unsigned long animationStartTime = 0;
int animationDuration = 500; // Duração de cada "piscada"
int animationFrame = 0;
bool isSaved = false;
const unsigned char PROGMEM discIcon[] = {
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111,
B11000000, B00000000, B00000000, B00000000, B00000000, B00000011,
B11000000, B00000000, B00000000, B00000000, B00000000, B00000011,
B11001111, B11111111, B11111111, B11111111, B11110000, B00000011,
B11001111, B11111111, B11111111, B11111111, B11111000, B00000011,
B11001100, B00000000, B00000000, B00000000, B00001100, B00000011,
B11001100, B00000000, B00000000, B00000000, B00000110, B00000011,
B11001100, B00000000, B00000000, B00000000, B00000011, B00000011,
B11001100, B00000000, B00000000, B00000000, B00000001, B10000011,
B11001100, B00000000, B00000000, B00000000, B00000000, B11000011,
B11001100, B00000000, B00000000, B00000000, B00000000, B01100011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001100, B00000000, B00000000, B00000000, B00000000, B00110011,
B11001111, B11111111, B11111111, B11111111, B11111111, B11110011,
B11001111, B11111111, B11111111, B11111111, B11111111, B11110011,
B11000000, B00000000, B00000000, B00000000, B00000000, B00000011,
B11000000, B00000000, B00000000, B00000000, B00000000, B00000011,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111,
};
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Endereço I2C do display OLED
display.display();
delay(2000);
display.clearDisplay();
pinMode(BUTTON_PIN, INPUT_PULLUP);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
}
void loop() {
int value = encoder.read() / 4; // Divida por 2 para reduzir a sensibilidade
if (value != lastEncoded) {
if (value > lastEncoded) {
menuIndex = (menuIndex + 1) % 4; // Número de menus
} else {
menuIndex = (menuIndex - 1 + 4) % 4;
}
lastEncoded = value;
displayMenu(menuIndex);
}
if (digitalRead(BUTTON_PIN) == LOW) {
if (!isAnimating) {
isAnimating = true;
animationStartTime = millis();
animationFrame = 0;
isSaved = true; // Marcar que a animação representa "salvo"
}
}
if (isAnimating) {
unsigned long currentTime = millis();
if (currentTime - animationStartTime < animationDuration * 3) {
if ((currentTime - animationStartTime) % animationDuration < animationDuration / 2) {
display.clearDisplay();
display.display();
} else {
if (isSaved) {
display.drawBitmap(40, 10, discIcon, 48, 48, SSD1306_WHITE); // valores de tamanho 48 e 14
display.display();
} else {
displayMenu(menuIndex);
}
}
} else {
isAnimating = false;
if (isSaved) {
isSaved = false;
saveSelection(menuIndex, selection);
}
displayMenu(menuIndex);
}
}
}
void displayMenu(int index) {
display.clearDisplay();
display.setCursor(0, 0);
switch (index) {
case 0:
display.println("Menu 1");
break;
case 1:
display.println("Menu 2");
break;
case 2:
display.println("Menu 3");
break;
case 3:
display.println("Menu 4");
break;
}
display.display();
}
void saveSelection(int menu, int value) {
int address = menu * sizeof(int);
EEPROM.put(address, value);
}