#include <Wire.h>
#include <Adafruit_SSD1306.h>
// Configuração de tamanho, em pixel, do LCD
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Declaração do módulo SSD1306 I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (-1 para compartilhar o pino de reset do Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Variáveis dos botões
const int btn_inc = 27;
const int btn_set = 26;
const int btn_dec = 25;
int incState, setState, decState;
// Used for displaying Letter board
char upperCase[3][10] = {"ABCDEFGHI", "JKLMNOPQR", "STUVWXYZ "};
char lowerCase[3][10] = {"abcdefghi", "jklmnopqr", "stuvwxyz "};
char specialCase[3][10] = {"!@#$%&*()", "-+/|_;:;,", ".<>[]?{} "};
// Variáveis para controle de navegação
int selectedRow = 0;
int selectedCol = 0;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Inicializa o display SSD1306
pinMode(btn_inc, INPUT_PULLUP); // Define o pino do botão "inc" como entrada com pull-up interno
pinMode(btn_set, INPUT_PULLUP); // Define o pino do botão "set" como entrada com pull-up interno
pinMode(btn_dec, INPUT_PULLUP); // Define o pino do botão "dec" como entrada com pull-up interno
display.clearDisplay(); // Limpa o buffer do display
}
void loop() {
keypad();
sType();
}
//Reformulação para o novo modelo
String typingEntry;
String itemsNav[] = {"Shift", "Delete", "Cancel", "Enter"}; //Menu lateral
int NUM_ITEMS;
int NUM_SEL;
int currentEditing;
int currentSelection;
bool charPick;
void sType() {
display.clearDisplay();
display.setCursor(1, 1);
display.print(typingEntry);
display.fillRect(0, 0, 128, 10, INVERSE); // define cor de fundo da faixa superior
display.setTextColor(WHITE);
display.drawRect(0, 12, 128, 12, WHITE); // Campo onde a senha será exibida
display.drawLine(73, 27, 73, 64, WHITE); // Traça linha para dividir campo visual da tela
// Exibe as letras em cada linha
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 9; col++) {
int xPos = col * 8 + 1; // Posição X da letra no display
int yPos = row * 9 + 32; // Posição Y da letra no display
display.setCursor(xPos, yPos); // Define a posição do cursor para cada letra
display.print(specialCase[row][col]); // Exibe a letra
}
}
// Exibe o menu lateral na tela
for (int i = 0; i <= 4; i++) {
display.setCursor(90, 29 + 9 * i);
display.println(itemsNav[i]);
}
if (charPick == false) {
if (incState == LOW) {
selectedCol++;
if (selectedCol > 8) {
selectedCol = 0;
selectedRow++;
if (selectedRow > 2) {
selectedRow = 0;
currentSelection = 0;
charPick = true;
}
}
}
// Verifica se o botão "dec" foi pressionado e atualiza a letra selecionada
if (decState == LOW) {
selectedCol--;
if (selectedCol < 0) {
selectedCol = 8;
selectedRow--;
if (selectedRow < 0) {
selectedRow = 2;
currentSelection = 4;
charPick = true;
}
}
}
//Destaca o caractere selecionado
int cursorX = selectedCol * 8; // Posição X do cursor
int cursorY = selectedRow * 9 + 31; // Posição Y do cursor
display.fillRect(cursorX, cursorY, 7, 9, SSD1306_INVERSE); // Desenha um retângulo ao redor da letra selecionada
} else {
NUM_ITEMS = 4;
display.setCursor(80, 29 + currentSelection * 9);
display.print("> "); // imprime marcador
if (currentSelection < 0 || currentSelection > NUM_ITEMS) {
charPick = false;
currentSelection = 0;
}
}
display.display();
}
//Função de controle dos botões
void keypad() {
incState = digitalRead(btn_inc);
setState = digitalRead(btn_set);
decState = digitalRead(btn_dec);
//Loop para o botão select
if (setState == LOW && NUM_SEL != 0) {
currentEditing++;
if (currentEditing > NUM_SEL) {
currentEditing = 0;
}
delay(150);
}
//Loop para o botão de incremento
if (incState == LOW && currentEditing == 0) {
currentSelection++;
if (currentSelection >= NUM_ITEMS) {
currentSelection = 0;
}
delay(150);
}
//Loop para o botão de decremento
if (decState == LOW && currentEditing == 0) {
currentSelection--;
if (currentSelection < 0) {
currentSelection = NUM_ITEMS - 1;
}
delay(150);
}
}