#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Preferences.h>
#include <OneButton.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Preferences preferences;
struct MyStruct {
long OP_M1;
long OP_M2;
long OP_M3;
long OP_M4;
};
MyStruct data; // Estructura para almacenar datos
OneButton incrementButton(18, true); // Botón para incrementar
OneButton selectButton(19, true); // Botón para seleccionar
OneButton modeButton(5, true); // Botón para cambiar el modo de incremento
int selectedField = 0; // Campo inicialmente seleccionado (OP_M1)
bool dataChanged = false; // Bandera para verificar si se han realizado cambios
bool incrementMode = true; // Modo de incremento predeterminado
void setup() {
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Inicializa la estructura desde la memoria Preferences
preferences.begin("DATOS_OPS", false);
data.OP_M1 = preferences.getLong("OP_M1", 0);
data.OP_M2 = preferences.getLong("OP_M2", 0);
data.OP_M3 = preferences.getLong("OP_M3", 0);
data.OP_M4 = preferences.getLong("OP_M4", 0);
// Inicializa la pantalla OLED
display.display();
delay(2000); // Espera 2 segundos antes de borrar la pantalla
display.clearDisplay();
display.display();
// Configura los botones
incrementButton.attachClick(onIncrementButtonClick);
selectButton.attachClick(onSelectButtonClick);
modeButton.attachClick(onModeButtonClick);
incrementButton.attachDuringLongPress(onIncrementButtonLongPress);
selectButton.attachDuringLongPress(onSelectButtonLongPress);
}
void loop() {
incrementButton.tick(); // Monitorea el botón "Increment"
selectButton.tick(); // Monitorea el botón "Select"
modeButton.tick(); // Monitorea el botón "Mode"
}
void onIncrementButtonClick() {
// Incrementa o decrementa el valor del campo seleccionado según el modo
int incrementAmount = incrementMode ? 1 : -1;
switch (selectedField) {
case 1:
data.OP_M1 += incrementAmount;
if (data.OP_M1 > 999999) {
data.OP_M1 = 999999; // Limita el valor máximo
} else if (data.OP_M1 < 0) {
data.OP_M1 = 0; // Limita el valor mínimo
}
break;
case 2:
data.OP_M2 += incrementAmount;
if (data.OP_M2 > 999999) {
data.OP_M2 = 999999;
} else if (data.OP_M2 < 0) {
data.OP_M2 = 0;
}
break;
case 3:
data.OP_M3 += incrementAmount;
if (data.OP_M3 > 999999) {
data.OP_M3 = 999999;
} else if (data.OP_M3 < 0) {
data.OP_M3 = 0;
}
break;
case 4:
data.OP_M4 += incrementAmount;
if (data.OP_M4 > 999999) {
data.OP_M4 = 999999;
} else if (data.OP_M4 < 0) {
data.OP_M4 = 0;
}
break;
}
dataChanged = true;
displayData();
}
void onSelectButtonClick() {
// Cambia el campo seleccionado al siguiente
selectedField++;
if (selectedField > 4) {
selectedField = 1; // Vuelve a seleccionar el primer campo
}
displayData();
}
void onModeButtonClick() {
// Cambia el modo de incremento (normal o inverso)
incrementMode = !incrementMode;
displayData();
}
void onIncrementButtonLongPress() {
// Incrementa el valor del campo seleccionado de 1000 en 1000 al mantener presionado
int incrementAmount = incrementMode ? 1000 : -1000;
switch (selectedField) {
case 1:
data.OP_M1 += incrementAmount;
if (data.OP_M1 > 999999) {
data.OP_M1 = 999999;
} else if (data.OP_M1 < 0) {
data.OP_M1 = 0;
}
break;
case 2:
data.OP_M2 += incrementAmount;
if (data.OP_M2 > 999999) {
data.OP_M2 = 999999;
} else if (data.OP_M2 < 0) {
data.OP_M2 = 0;
}
break;
case 3:
data.OP_M3 += incrementAmount;
if (data.OP_M3 > 999999) {
data.OP_M3 = 999999;
} else if (data.OP_M3 < 0) {
data.OP_M3 = 0;
}
break;
case 4:
data.OP_M4 += incrementAmount;
if (data.OP_M4 > 999999) {
data.OP_M4 = 999999;
} else if (data.OP_M4 < 0) {
data.OP_M4 = 0;
}
break;
}
dataChanged = true;
displayData();
}
void onSelectButtonLongPress() {
// Guarda los datos en la memoria Preferences si se mantiene presionado el botón "Select" y se han realizado cambios
if (dataChanged) {
preferences.putLong("OP_M1", data.OP_M1);
preferences.putLong("OP_M2", data.OP_M2);
preferences.putLong("OP_M3", data.OP_M3);
preferences.putLong("OP_M4", data.OP_M4);
preferences.end();
dataChanged = false;
// Mostrar "Datos OK" durante 2 segundos
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Datos OK");
display.display();
unsigned long startTime = millis();
while (millis() - startTime < 2000) {
// Espera durante 2 segundos
}
// Volver a mostrar los datos
displayData();
display.clearDisplay();
ESP.restart();
}
}
void displayData() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Field: ");
display.println(selectedField);
display.print("Mode: ");
display.println(incrementMode ? "Normal" : "Inverso");
display.print("OP_M1: ");
display.println(data.OP_M1);
display.print("OP_M2: ");
display.println(data.OP_M2);
display.print("OP_M3: ");
display.println(data.OP_M3);
display.print("OP_M4: ");
display.println(data.OP_M4);
display.display();
}