#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Declaración del objeto para el display OLED
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Pines de los botones
#define BUTTON_UP 14
#define BUTTON_DOWN 27
#define BUTTON_LEFT 26
#define BUTTON_RIGHT 25
#define BUTTON_SELECT 33
#define BUTTON_BACK 32
// Variables para manejar los estados de los botones
bool buttonUpPressed = false;
bool buttonDownPressed = false;
bool buttonLeftPressed = false;
bool buttonRightPressed = false;
bool buttonSelectPressed = false;
bool buttonBackPressed = false;
// Variables para el menú
int currentMenu = 0;
int subMenu = 0;
bool editing = false;
bool savePrompt = false;
// Datos de Persona
char nombre[20] = "";
int edad = 0;
int altura = 0;
int peso = 0;
// Datos de Red
char ip[16] = "";
char subnet[16] = "";
char gateway[16] = "";
// Función para inicializar el display OLED
void setupDisplay() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
}
// Función para mostrar el menú principal
void showMenu() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(F("Menu:"));
display.setCursor(0, 16);
display.print(F("1. Datos Persona"));
if (currentMenu == 0) display.print(F(" <"));
display.setCursor(0, 32);
display.print(F("2. Parametros Persona"));
if (currentMenu == 1) display.print(F(" <"));
display.setCursor(0, 48);
display.print(F("3. Datos de Red"));
if (currentMenu == 2) display.print(F(" <"));
display.display();
}
// Función para mostrar los datos de la persona
void showDatosPersona() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(F("Datos Persona:"));
display.setCursor(0, 16);
display.print(F("Nombre: "));
display.print(nombre);
display.setCursor(0, 32);
display.print(F("Edad: "));
display.print(edad);
display.setCursor(0, 48);
display.print(F("Altura: "));
display.print(altura);
display.setCursor(0, 64);
display.print(F("Peso: "));
display.print(peso);
display.display();
}
// Función para mostrar la interfaz de entrada de parámetros de la persona
void showParametrosPersona() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(F("Parametros Persona:"));
display.setCursor(0, 16);
if (subMenu == 0) display.print(F("Nombre: <"));
else display.print(F("Nombre: "));
display.print(nombre);
display.setCursor(0, 32);
if (subMenu == 1) display.print(F("Edad: <"));
else display.print(F("Edad: "));
display.print(edad);
display.setCursor(0, 48);
if (subMenu == 2) display.print(F("Altura: <"));
else display.print(F("Altura: "));
display.print(altura);
display.setCursor(0, 64);
if (subMenu == 3) display.print(F("Peso: <"));
else display.print(F("Peso: "));
display.print(peso);
display.display();
}
// Función para mostrar la interfaz de entrada de parámetros de red
void showDatosRed() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(F("Datos de Red:"));
display.setCursor(0, 16);
if (subMenu == 0) display.print(F("IP: <"));
else display.print(F("IP: "));
display.print(ip);
display.setCursor(0, 32);
if (subMenu == 1) display.print(F("Subnet: <"));
else display.print(F("Subnet: "));
display.print(subnet);
display.setCursor(0, 48);
if (subMenu == 2) display.print(F("Gateway: <"));
else display.print(F("Gateway: "));
display.print(gateway);
display.display();
}
void setup() {
Serial.begin(115200);
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
pinMode(BUTTON_LEFT, INPUT_PULLUP);
pinMode(BUTTON_RIGHT, INPUT_PULLUP);
pinMode(BUTTON_SELECT, INPUT_PULLUP);
pinMode(BUTTON_BACK, INPUT_PULLUP);
setupDisplay();
showMenu();
}
void loop() {
buttonUpPressed = !digitalRead(BUTTON_UP);
buttonDownPressed = !digitalRead(BUTTON_DOWN);
buttonLeftPressed = !digitalRead(BUTTON_LEFT);
buttonRightPressed = !digitalRead(BUTTON_RIGHT);
buttonSelectPressed = !digitalRead(BUTTON_SELECT);
buttonBackPressed = !digitalRead(BUTTON_BACK);
if (!editing) {
if (buttonUpPressed) {
if (currentMenu > 0) currentMenu--;
showMenu();
delay(200); // Debounce
}
if (buttonDownPressed) {
if (currentMenu < 2) currentMenu++;
showMenu();
delay(200); // Debounce
}
if (buttonSelectPressed) {
if (currentMenu == 0) showDatosPersona();
else if (currentMenu == 1) {
subMenu = 0;
editing = true;
showParametrosPersona();
}
else if (currentMenu == 2) {
subMenu = 0;
editing = true;
showDatosRed();
}
delay(200); // Debounce
}
} else {
if (buttonLeftPressed) {
if (subMenu > 0) subMenu--;
if (currentMenu == 1) showParametrosPersona();
else if (currentMenu == 2) showDatosRed();
delay(200); // Debounce
}
if (buttonRightPressed) {
if (subMenu < 3 && currentMenu == 1) subMenu++;
if (subMenu < 2 && currentMenu == 2) subMenu++;
if (currentMenu == 1) showParametrosPersona();
else if (currentMenu == 2) showDatosRed();
delay(200); // Debounce
}
if (buttonUpPressed || buttonDownPressed) {
if (currentMenu == 1) {
if (subMenu == 0) {
int len = strlen(nombre);
if (buttonUpPressed && len < 19) {
nombre[len] = 'A';
nombre[len + 1] = '\0';
} else if (buttonDownPressed && len > 0) {
nombre[len - 1] = '\0';
}
} else if (subMenu == 1) {
if (buttonUpPressed) edad++;
else if (buttonDownPressed && edad > 0) edad--;
} else if (subMenu == 2) {
if (buttonUpPressed) altura += 0.1;
else if (buttonDownPressed && altura > 0) altura -= 0.1;
} else if (subMenu == 3) {
if (buttonUpPressed) peso += 0.1;
else if (buttonDownPressed && peso > 0) peso -= 0.1;
}
showParametrosPersona();
} else if (currentMenu == 2) {
if (subMenu == 0) {
int len = strlen(ip);
if (buttonUpPressed && len < 15) {
ip[len] = '0';
ip[len + 1] = '\0';
} else if (buttonDownPressed && len > 0) {
ip[len - 1] = '\0';
}
} else if (subMenu == 1) {
int len = strlen(subnet);
if (buttonUpPressed && len < 15) {
subnet[len] = '0';
subnet[len + 1] = '\0';
} else if (buttonDownPressed && len > 0) {
subnet[len - 1] = '\0';
}
} else if (subMenu == 2) {
int len = strlen(gateway);
if (buttonUpPressed && len < 15) {
gateway[len] = '0';
gateway[len + 1] = '\0';
} else if (buttonDownPressed && len > 0) {
gateway[len - 1] = '\0';
}
}
showDatosRed();
}
delay(200); // Debounce
}
if (buttonBackPressed) {
editing = false;
savePrompt = true;
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(F("Guardar cambios?"));
display.setCursor(0, 16);
display.print(F("SI <"));
display.setCursor(0, 32);
display.print(F("NO"));
display.display();
delay(200); // Debounce
}
}
if (savePrompt) {
if (buttonUpPressed || buttonDownPressed) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(F("Guardar cambios?"));
display.setCursor(0, 16);
if (buttonUpPressed) {
display.print(F("SI <"));
display.setCursor(0, 32);
display.print(F("NO"));
} else {
display.print(F("SI"));
display.setCursor(0, 32);
display.print(F("NO <"));
}
display.display();
delay(200); // Debounce
}
if (buttonSelectPressed) {
savePrompt = false;
showMenu();
delay(200); // Debounce
}
}
}