#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <EEPROM.h> // Librería para almacenar datos en la EEPROM
#define PIN_NEOPIXEL 6 // Pin donde están conectados los NeoPixels
#define NUM_SEGMENTS 7 // Número de segmentos por dígito (7 segmentos)
#define NUM_DIGITS 8 // 8 dígitos en total, 4 para "compra" y 4 para "venta"
// Cantidad de LEDs por segmento (variable)
int ledsPorSegmento = 4; // Esto puede cambiar según tu necesidad
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_SEGMENTS * ledsPorSegmento * NUM_DIGITS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);
// Configuración del teclado matricial
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {7, 8, 9, 10};
byte colPins[COLS] = {2, 3, 4, 5};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Configuración del LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
int digitosVenta[4] = {0, 0, 0, 0}; // 4 dígitos para "Venta"
int digitosCompra[4] = {0, 0, 0, 0}; // 4 dígitos para "Compra"
bool seleccionVenta = false; // Indica si está seleccionado "venta"
bool seleccionCompra = false; // Indica si está seleccionado "compra"
int currentDigit = 0; // Para controlar el dígito que se está cambiando
// Funciones para inicializar
void setup() {
lcd.init();
lcd.backlight();
strip.begin();
strip.show(); // Inicializa LEDs apagados
// Cargar el estado guardado en EEPROM
cargarEstado();
lcd.setCursor(0, 0);
lcd.print("Seleccione:");
lcd.setCursor(0, 1);
lcd.print("Venta (A) Compra (B) LETREROLED.COM");
}
void loop() {
char key = keypad.getKey();
if (key) {
switch (key) {
case 'A': // Selecciona "Venta"
seleccionVenta = true;
seleccionCompra = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Modo Venta");
mostrarDigitos(digitosVenta, 0); // Muestra dígitos de "Venta"
cambiarValor(digitosVenta); // Cambiar el valor de "Venta"
break;
case 'B': // Selecciona "Compra"
seleccionVenta = false;
seleccionCompra = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Modo Compra");
mostrarDigitos(digitosCompra, 4); // Muestra dígitos de "Compra"
cambiarValor(digitosCompra); // Cambiar el valor de "Compra"
break;
case '*': // Mostrar previsualización
mostrarPrevisualizacion(); // Llamamos a la función para mostrar valores de "Venta" y "Compra"
break;
case '#': // Resetear todos los valores a cero
resetValores();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Valores reseteados");
break;
default:
break;
}
}
}
// Función para cambiar el valor de compra o venta
void cambiarValor(int *digitos) {
currentDigit = 0;
while (currentDigit < 4) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
digitos[currentDigit] = key - '0'; // Convertir el carácter a número
currentDigit++;
mostrarDigitos(digitos, seleccionVenta ? 0 : 4); // Actualizar los LEDs
actualizarLCD(digitos); // Reflejar el estado en el LCD
guardarEstado(); // Guardar el nuevo estado en la EEPROM
} else if (key == '#') { // Confirmar el valor con Enter
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Valor guardado");
guardarEstado(); // Guardar el nuevo estado en la EEPROM
break;
} else if (key == '*') { // Borrar el último dígito con Backspace
if (currentDigit > 0) currentDigit--;
digitos[currentDigit] = 0;
mostrarDigitos(digitos, seleccionVenta ? 0 : 4); // Actualizar los LEDs
actualizarLCD(digitos); // Reflejar el estado en el LCD
}
}
strip.show();
}
// Función para mostrar los dígitos en LEDs
void mostrarDigitos(int *digitos, int inicio) {
for (int i = 0; i < 4; i++) { // 4 dígitos para cada grupo
setDigit(inicio + i, digitos[i]); // Muestra los dígitos ingresados
}
strip.show();
}
// Función para controlar un dígito (enciende/apaga segmentos)
void setDigit(int digitIndex, int number) {
int startLed = digitIndex * NUM_SEGMENTS * ledsPorSegmento; // Calcula el LED inicial del dígito
for (int segment = 0; segment < NUM_SEGMENTS; segment++) {
int segmentOn = getSegmentPattern(number, segment);
for (int led = 0; led < ledsPorSegmento; led++) {
if (segmentOn) {
strip.setPixelColor(startLed + segment * ledsPorSegmento + led, strip.Color(255, 0, 255)); // Enciende el LED
} else {
strip.setPixelColor(startLed + segment * ledsPorSegmento + led, strip.Color(0, 0, 0)); // Apaga el LED
}
}
}
}
// Obtiene el patrón del segmento para cada número
int getSegmentPattern(int number, int segment) {
const int segmentPatterns[10][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1} // 9
};
return segmentPatterns[number][segment];
}
// Actualiza el LCD con los dígitos actuales y muestra puntos entre cada par de dígitos
void actualizarLCD(int *digitos) {
lcd.clear();
if (seleccionVenta) {
lcd.setCursor(0, 0);
lcd.print("Venta: ");
} else if (seleccionCompra) {
lcd.setCursor(0, 0);
lcd.print("Compra: ");
}
for (int i = 0; i < 4; i++) {
lcd.print(digitos[i]);
if (i == 1 || i == 3) { // Mostrar puntos después de cada dos dígitos
lcd.print(".");
}
}
}
// Función para mostrar previsualización de venta y compra
void mostrarPrevisualizacion() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Venta: ");
for (int i = 0; i < 4; i++) {
lcd.print(digitosVenta[i]);
if (i == 1) lcd.print(".");
}
lcd.setCursor(0, 1);
lcd.print("Compra: ");
for (int i = 0; i < 4; i++) {
lcd.print(digitosCompra[i]);
if (i == 1) lcd.print(".");
}
}
// Función para resetear todos los valores a cero
void resetValores() {
for (int i = 0; i < 4; i++) {
digitosVenta[i] = 0;
digitosCompra[i] = 0;
}
mostrarDigitos(digitosVenta, 0);
mostrarDigitos(digitosCompra, 4);
actualizarLCD(digitosVenta); // Actualizar el LCD para "Venta"
actualizarLCD(digitosCompra); // Actualizar el LCD para "Compra"
guardarEstado(); // Guardar los valores reseteados en la EEPROM
}
// Guardar el estado de los dígitos en la EEPROM
void guardarEstado() {
for (int i = 0; i < 4; i++) {
EEPROM.write(i, digitosVenta[i]);
EEPROM.write(i + 4, digitosCompra[i]);
}
}
// Cargar el estado de los dígitos desde la EEPROM
void cargarEstado() {
for (int i = 0; i < 4; i++) {
digitosVenta[i] = EEPROM.read(i);
digitosCompra[i] = EEPROM.read(i + 4);
}
mostrarDigitos(digitosVenta, 0);
mostrarDigitos(digitosCompra, 4);
}