Hola chicos, estoy intentando hacer un proyecto con un display, 7 leds y un boton. Lo que tiene que hacer el juego es los leds tienen que parpadear continuamente y el led del medio tiene que ser verde. y los demás rojos. por ejemplo si estan desde el pin 7-13 el 10 es el led verde. Entonces cuando tu presiones el boton y la luz que este encendida sea la verde en tu display suma un numero, y siguen parpadeando. Si por otro lado pulsas el boton cuando hay uno rojo se reinicia el contador. solo necesito los contadores d1 y d2. A ver si alguien me puede ayudar. Muchas gracias!! He conseguido implementar el tema de las luces, pero el display no me funciona.
/ Librería Timer
#include "Timer.h"
// Pines
const int BUTTON_PIN = 2;
const int NUM_LEDS = 5;
const int LED_PINS[] = {12, 11, 10, 9, 8};
const int SEGMENT_PINS[] = {A5, A3, 4, 5, 6, A4, 3};
const int DIGIT_PINS[] = {A1, A2};
// Variables globales
int ledState = 0;
int direction = 1;
bool buttonPressed = false;
bool buttonLastState = HIGH;
bool gameActive = true;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int score = 0;
// Configuración
void setup()
{
// Configura botón y LEDs
pinMode(BUTTON_PIN, INPUT_PULLUP);
for (int i = 0; i < NUM_LEDS; i++)
{
pinMode(LED_PINS[i], OUTPUT);
}
// Configura display 7 segmentos
for (int i = 0; i < 7; i++)
{
pinMode(SEGMENT_PINS[i], OUTPUT);
}
for (int i = 0; i < 2; i++)
{
pinMode(DIGIT_PINS[i], OUTPUT);
}
// Inicializa Timer
TimerSet(100); // Ajusta el valor del temporizador a 100ms
TimerOn();
Serial.begin(9600); // Inicia la comunicación serie para mensajes de depuración
}
// Loop principal
void loop()
{
// Lee botón con debounce
int reading = digitalRead(BUTTON_PIN);
Serial.print("Button reading: ");
Serial.println(reading);
if (reading != buttonLastState)
{
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay)
{
if (reading != buttonPressed)
{
buttonPressed = reading;
if (buttonPressed)
{
// Botón presionado, aumenta el puntaje si la LED verde está encendida
if (ledState == 2 && gameActive)
{
score++;
// Si el puntaje alcanza cierto valor, cambia a estado de juego inactivo
if (score >= 10)
{
gameActive = false;
// Enciende el LED rojo
digitalWrite(LED_PINS[ledState], HIGH);
}
}
}
}
}
buttonLastState = reading;
if (TimerFlag)
{
TimerFlag = 0;
// Imprime mensajes de depuración para verificar el estado de los LEDs y el temporizador
Serial.print("LED state: ");
Serial.println(ledState);
Serial.print("Game active: ");
Serial.println(gameActive);
Serial.print("Timer flag: ");
Serial.println(TimerFlag);
// Ejecuta máquinas de estado si el juego está activo
if (gameActive)
{
ledSM();
displaySM();
}
}
}
// Función máquina de estados para LEDs
void ledSM()
{
// Lógica de shifteo de LEDs
ledState += direction;
if (ledState == 0)
{
direction = 1;
}
else if (ledState == NUM_LEDS - 1)
{
direction = -1;
}
// Enciende LED
for (int i = 0; i < NUM_LEDS; i++)
{
digitalWrite(LED_PINS[i], i == ledState);
}
}
// Función máquina de estados para display
void displaySM()
{
static int refreshCounter = 0;
// Multiplexación de dígitos
int digit = refreshCounter % 2;
digitalWrite(DIGIT_PINS[0], digit == 0);
digitalWrite(DIGIT_PINS[1], digit == 1);
// Muestra puntaje en dígito
if (digit == 0)
{
displayNumber(score / 10, 0);
}
else
{
displayNumber(score % 10, 1);
}
refreshCounter++;
}
// Función para mostrar número en dígito
void displayNumber(int number, int digit)
{
const byte SEGMENT_MAP[] = {B11000000, B11111001, B10100100, B10110000, B10011001, B10010010, B10000010, B11111000, B10000000, B10010000};
byte displayValue = SEGMENT_MAP[number];
for (int i = 0; i < 7; i++)
{
digitalWrite(SEGMENT_PINS[i], displayValue & (1 << i));
}
digitalWrite(DIGIT_PINS[digit], LOW); // Habilita dígito
}