// Definición de pines
const int a = 4;
const int b = 16;
const int c = 17;
const int d = 5;
const int e = 18;
const int f = 19;
const int g = 21;
const int dig1 = 22; // Pin para el primer dígito
const int dig2 = 23; // Pin para el segundo dígito

// Contador
int counter = 0;

// Velocidad de conteo en milisegundos
unsigned long interval = 1000; // Por defecto, 1 segundo
unsigned long lastUpdate = 0; // Marca de tiempo del último conteo
bool autoCounting = false; // Control de conteo automático

// Matriz para representar números en el display de 7 segmentos
const byte numToSegment[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
};

void setup() {
    // Configuración de pines
    pinMode(a, OUTPUT);
    pinMode(b, OUTPUT);
    pinMode(c, OUTPUT);
    pinMode(d, OUTPUT);
    pinMode(e, OUTPUT);
    pinMode(f, OUTPUT);
    pinMode(g, OUTPUT);
    pinMode(dig1, OUTPUT);
    pinMode(dig2, OUTPUT);
    
    Serial.begin(115200);
}

void loop() {
    // Leer comandos del monitor serial
    if (Serial.available()) {
        String command = Serial.readStringUntil('\n');
        command.trim(); // Quitar espacios o saltos de línea

        if (command == "+") {
            counter++;
            if (counter > 99) counter = 0;
        } else if (command == "-") {
            counter--;
            if (counter < 0) counter = 99;
        } else if (command == "start") {
            autoCounting = true;
        } else if (command == "stop") {
            autoCounting = false;
        } else if (command.startsWith("S")) {
            int newInterval = command.substring(1).toInt();
            if (newInterval > 0) {
                interval = newInterval;
                Serial.println("Nuevo intervalo: " + String(interval) + " ms");
            }
        }
    }

    // Conteo automático
    if (autoCounting && millis() - lastUpdate >= interval) {
        lastUpdate = millis();
        counter++;
        if (counter > 99) counter = 0;
    }

    // Actualizar display
    displayCounter(counter);
}

void displayCounter(int value) {
    int tens = value / 10;  // Dígito de las decenas
    int units = value % 10; // Dígito de las unidades

    // Mostrar el primer dígito (decenas)
    setSegment(tens);
    digitalWrite(dig1, LOW); // Activar el dígito 1
    delay(5); // Breve tiempo para visualizar
    digitalWrite(dig1, HIGH); // Desactivar el dígito

    // Mostrar el segundo dígito (unidades)
    setSegment(units);
    digitalWrite(dig2, LOW); // Activar el dígito 2
    delay(5); // Breve tiempo para visualizar
    digitalWrite(dig2, HIGH); // Desactivar el dígito
}

void setSegment(int num) {
    digitalWrite(a, numToSegment[num][0]);
    digitalWrite(b, numToSegment[num][1]);
    digitalWrite(c, numToSegment[num][2]);
    digitalWrite(d, numToSegment[num][3]);
    digitalWrite(e, numToSegment[num][4]);
    digitalWrite(f, numToSegment[num][5]);
    digitalWrite(g, numToSegment[num][6]);
}