Hola, me da un poco de verguenza mostrar el código por lo desastroso que debe ser para alguien que sabe programar jaja pero aqui va. Hago antes algunos agregados al post original si no no se va a entender nada:
El juego es un 2 en 1: simon dice y dale al topo. Tengo una selectora y los pines A0 y A1 asignados a las posiciones de ambos juegos. Y si esta en otra posicion, es una version facilitada de Dale al topo (sin aumento de dificultad).
El problema se manifiesta en ambos juegos, en el mismo par boton/led. Es el asociado al ultimo elemento del vector buttonPins[] y ledPins[].
Insisto, el problema NO se manifiesta si esta la placa alimentada por la PC
Gracias por el tiempo dedicado de antemano,
#include <Config.h>
#define topopin A0
#define simonpin A1
const int buttonPins[] = {2, 3, 4, 5};
const int ledPins[] = {6, 7, 8, 9};
const int buzzerPin = 10; // Pin del buzzer
const int noteDuration = 450; // Duración de cada nota en milisegundos
int currentTopo;
int puntos = 0;
int rondas = 0;
unsigned long tiempoAparicion;
boolean ganador = false;
boolean primerjuego = true;
int tiempoencendido = 6000;
int tiempoespera = 1000;
int t_min_esp = 2000;
int t_max_esp = 5000;
boolean facil = false;
int sequence[100]; // Secuencia de notas generada aleatoriamente
int playerSequence[100]; // Secuencia ingresada por el jugador
int sequenceLength = 1; // Longitud de la secuencia actual
int playerIndex = 0; // Índice del jugador en la secuencia
void setup() {
//Serial.begin(9600);
pinMode(buzzerPin,OUTPUT);
pinMode(topopin,INPUT_PULLUP);
pinMode(simonpin,INPUT_PULLUP);
for (int i = 0; i < 4; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
pinMode(ledPins[i], OUTPUT);
}
randomSeed(analogRead(0));
}
void loop() {
delay(1);
digitalWrite(buzzerPin,HIGH);
if (digitalRead(topopin)==LOW){
topo();
} else if (digitalRead(simonpin)==LOW) {
simon();
} else {
facil = true;
topo();
}
}
void topo(){
if (!ganador) {
if (millis() - tiempoAparicion > tiempoencendido) {
if (!primerjuego) {
perdioRonda();
} else {
primerjuego = false;
reiniciarJuego();
}
}
for (int i = 0; i < 4; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
delay(50);
if (digitalRead(buttonPins[i]) == LOW) {
analogWrite(buzzerPin,0);
while (digitalRead(buttonPins[i]) == LOW) {
// Espera hasta que se libere el botón
}
analogWrite(buzzerPin,255);
if (i == currentTopo) {
ganarRonda();
} else {
perdioRonda();
}
}
}
}
} else {
delay(tiempoespera); // Espera 1 segundo antes de comenzar un nuevo juego
reiniciarJuego();
}
}
void nuevoTopo() {
int topoAleatorio = random(4);
tiempoespera = random(t_min_esp,t_max_esp);
delay(tiempoespera);
digitalWrite(ledPins[currentTopo], LOW);
currentTopo = topoAleatorio;
digitalWrite(ledPins[currentTopo], HIGH);
ruidotopo();
tiempoAparicion = millis();
}
void ganarRonda() {
ruidoacierto();
for (int i=0;i<4;i++) {
digitalWrite(ledPins[i], LOW);
}
puntos += tiempoencendido - (millis() - tiempoAparicion);
rondas++;
//Serial.print("Ganaste la ronda! Puntos acumulados: ");
//Serial.println(puntos);
if (rondas % 10 == 0) {
// Disminuir el tiempo de aparición en un 10%
for (int i=0;i<1+ rondas / 10;i++){
for (int j=0; j<4;j++) {
digitalWrite(ledPins[j],HIGH);
delay(20);
}
for (int j=0; j<4;j++) {
digitalWrite(ledPins[j],LOW);
analogWrite(buzzerPin,8);
delay(20);
analogWrite(buzzerPin,255);
}
}
if (!facil) {
delay(1000);
t_min_esp *= 0.75;
t_max_esp *= 0.75;
tiempoencendido *= 0.9;
}
}
if (rondas >= 100) {
ganador = true;
winner();
} else {
nuevoTopo();
}
}
void winner(){
int hora = millis();
while (millis()-hora<10000){
int i = random(0,4);
digitalWrite(ledPins[i],HIGH);
delay(25);
digitalWrite(ledPins[i],LOW);
delay(20);
}
}
void perdioRonda() {
ruidoperdio();
t_min_esp = 2000;
t_max_esp = 5000;
tiempoencendido = 6000;
reiniciarJuego();
}
void reiniciarJuego() {
countdown();
for (int i = 0; i < 4; i++) {
digitalWrite(ledPins[i], LOW);
}
currentTopo = -1;
puntos = 0;
rondas = 0;
ganador = false;
nuevoTopo();
}
void countdown() {
for (int j = 0; j < 4; j++) {
digitalWrite(ledPins[j], HIGH);
}
for (int i = 4; i > 0; i--) {
digitalWrite(buzzerPin,LOW);
delay(5);
digitalWrite(buzzerPin,HIGH);
delay(995);
digitalWrite(ledPins[4-i], LOW);
}
delay(1000);
}
void ruidotopo() {
for (int i=0; i<3;i++){
digitalWrite(buzzerPin,LOW);
delay(20);
digitalWrite(buzzerPin,HIGH);
delay(20); // Espera 100 ms entre beeps
}
}
void ruidoacierto() {
analogWrite(buzzerPin,4);;
delay(200);
analogWrite(buzzerPin,255);;
}
void ruidoperdio() {
for (int i = 0; i<4; i++){
digitalWrite(ledPins[0],HIGH);
digitalWrite(ledPins[1],HIGH);
digitalWrite(ledPins[2],HIGH);
digitalWrite(ledPins[3],HIGH);
analogWrite(buzzerPin,16);
delay(250);
digitalWrite(ledPins[0],LOW);
digitalWrite(ledPins[1],LOW);
digitalWrite(ledPins[2],LOW);
digitalWrite(ledPins[3],LOW);
analogWrite(buzzerPin,255);
delay(250);
}
}
void simon() {
if (sequenceLength == 1) {
countdown();
generarSecuencia();
}
reproducirSecuencia();
while (playerIndex < sequenceLength) {
int buttonPressed = esperarBoton();
if (buttonPressed == sequence[playerIndex]) {
playerSequence[playerIndex] = buttonPressed;
playerIndex++;
} else {
perderJuego();
}
}
if (playerIndex == sequenceLength) {
ruidoacierto();
delay(1000); // Espera 1 segundo antes de la siguiente ronda
sequenceLength++;
playerIndex = 0;
}
}
void generarSecuencia() {
for (int i = 0; i < 100; i++) {
sequence[i] = random(4); // Genera una secuencia aleatoria de 0 a 3
}
}
void reproducirSecuencia() {
for (int i = 0; i < sequenceLength; i++) {
int note = sequence[i];
digitalWrite(ledPins[note], HIGH);
for (int i=0; i<note+1;i++){
digitalWrite(buzzerPin,LOW);
delay(50);
digitalWrite(buzzerPin,HIGH);
delay(50);
}
delay(noteDuration);
digitalWrite(ledPins[note], LOW);
delay(50); // Espera 100 ms entre notas
}
}
int esperarBoton() {
while (true) {
for (int i = 0; i < 4; i++) {
delay(10);
if (digitalRead(buttonPins[i]) == LOW) {
delay(50);
if (digitalRead(buttonPins[i]) == LOW) {
digitalWrite(buzzerPin,LOW);
digitalWrite(ledPins[i],HIGH);
while (digitalRead(buttonPins[i]) == LOW) {
// Espera hasta que se libere el botón
}
digitalWrite(buzzerPin,HIGH);
digitalWrite(ledPins[i],LOW);
return i;
}
}
}
}
}
void perderJuego() {
ruidoperdio();
sequenceLength = 0;
playerIndex = 0;
for (int i = 0; i < 4; i++) {
digitalWrite(ledPins[i], LOW);
}
}