// 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;
int 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") {
Serial.println("Ingrese valor del intervalo de incremento: ");
while(!Serial.available()){};
if(Serial.available()){
String td=Serial.readStringUntil('\n');
interval = td.toInt();
}
running = true;
Serial.print("Counter started, ");
Serial.println(interval);
} 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);
}
}