// Definición de pines para los segmentos y dígitos del display
const int segmentPins[] = {4, 16, 17, 5, 18, 19, 21}; // Pines A, B, C, D, E, F, G
const int digitPins[] = {22, 23};                     // Pines DIG1, DIG2

// Mapeo de los segmentos para cada número (0-9)
const byte digits[10] = {
  B0111111, // 0
  B0000110, // 1
  B1011011, // 2 
  B1001111, // 3 
  B1100110, // 4 
  B1101101, // 5 
  B1111101, // 6 
  B0000111, // 7 
  B1111111, // 8
  B1101111  // 9
};

// Variables para el control del contador
unsigned long previousMillis = 0;
const long interval = 1000; // Intervalo de 1 segundo
int counter = 0;
bool running = false;

void setup() {
  // Configurar pines de los segmentos como salida
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPins[i], OUTPUT);
    digitalWrite(segmentPins[i], LOW);
  }
  
  // Configurar pines de los dígitos como salida
  for (int i = 0; i < 2; i++) {
    pinMode(digitPins[i], OUTPUT);
    digitalWrite(digitPins[i], HIGH); // Desactivar dígito (cátodo común)
  }
  
  // Configurar el puerto serie
  Serial.begin(115200);
  Serial.println("Ready");
}

void loop() {
  // Comprobar comandos recibidos por el puerto serie
  if (Serial.available()) {
    String command = Serial.readStringUntil('\n');
    command.trim(); // Eliminar espacios y saltos de línea
    if (command == "start") {
      running = true;
      Serial.println("Counter started");
    } else if (command == "stop") {
      running = false;
      Serial.println("Counter stopped");
    }
  }
  
  // Incrementar el contador si está en ejecución
  if (running) {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      counter = (counter + 1) % 100; // Limitar el contador a dos dígitos (0-99)
    }
  }
  
  // Mostrar el valor del contador en el display
  displayNumber(counter);
}

// Función para mostrar un número en el display de 7 segmentos
void displayNumber(int number) {
  int tens = number / 10; // Dígito de las decenas
  int ones = number % 10; // Dígito de las unidades
  
  // Mostrar el dígito de las decenas
  digitalWrite(digitPins[1], HIGH); // Apagar el dígito de las unidades
  setSegments(digits[tens]);
  digitalWrite(digitPins[0], LOW); // Encender el dígito de las decenas
  delay(5);
  
  // Mostrar el dígito de las unidades
  digitalWrite(digitPins[0], HIGH); // Apagar el dígito de las decenas
  setSegments(digits[ones]);
  digitalWrite(digitPins[1], LOW); // Encender el dígito de las unidades
  delay(5);
}

// Función para activar los segmentos de un dígito
void setSegments(byte segments) {
  for (int i = 0; i < 7; i++) {
    digitalWrite(segmentPins[i], (segments & (1 << i)) ? HIGH : LOW);
  }
}