Buenas noches, he preguntado en el foro general ésto mismo que os voy a comentar a vosotros, pero han sido un poco bordes/no contesta nadie/no ayudan con la solución que quiero.
Así que estoy seguro de que mis paisanos españoles van a entender lo que intento hacer y me van a poder ayudar mejor ^^
Estoy programando la bomba del Counter Strike (Global Offensive) para partidas de Airsoft, así que si alguno ha jugado al CS ya sabe a lo que me refiero.
Activas un interruptor e introduces la clave, si es correcta se pondrá en marcha una cuenta atrás de 45 segundos y en ese tiempo si se introduce la clave correcta, se desactiva y ganan los CT, si es errónea o simplemente no se introduce ninguna clave, la cuenta atrás seguirá marchan hasta llegar a 0, con la victoria de los Terroristas.
El código base que me permite realizar todas estas funciones realizadas anteriormente ya lo tengo y funciona a la perfección, pero me faltan chorradillas que hacen de éste artefacto que sea igual al del juego.
En concreto el parpadeo de un led, que inicia a los 45 segundos con un parpadeo de más o menos 1 segundo entre ON y ON, y va progresivamente más rapido hasta llegar a 0 que esta completamente encendido (como cuando una canica cae al suelo hasta que llega a parar de botar).
Cabe destacar, para que me entendáis, que no es un parpadeo de 1 segundo HIGH, 1 segundo LOW, sino el principio de cada segundo (si imaginamos que es uniformemente cada segundo, pondríamos 150 msec HIGH y 850 msec LOW)
CSGO BOMB SOUND
Básicamente el sonido que se oye va acompañado con un led que parpadea a la misma vez que el sonido
Éste es el código de la parte de la cuenta atrás
case 1: // cuentra atrás con desactivación
Serial.println("Cuenta atras");
anteriorMillis = millis();
for (int j = 15; j >= 8; j--) {
lcd.setCursor(j, 0);
lcd.print(asterisco);
}
while (countdownTime != 0 && estadoBomba == 1) {
timeCalc = millis() - anteriorMillis;
if (timeCalc >= 1000) {
countdownTime--;
anteriorMillis = millis();
Serial.print("Time remaining: ");
Serial.println(countdownTime);
if (countdownTime >= 10) {
lcd.setCursor(14, 1);
lcd.print(countdownTime);
}
else {
lcd.setCursor(14, 1);
lcd.print("0");
lcd.setCursor(15, 1);
lcd.print(countdownTime);
}
}
int progre = map(countdownTime, tiempoEx, 0, 1000, 0);
timeCalcVar = timeCalc % 1000;
if (timeCalc >= progre && timeCalcVar >= progre * 0.05) {
digitalWrite(ledRojo, HIGH);
Serial.println(progre);
Serial.println(timeCalcVar);
}
else if(timeCalcVar >= progre * 0.15)
{
digitalWrite(ledRojo, LOW);
}
tecla = teclado.getKey();
if (tecla != NO_KEY) {
claveintro[indiceTeclado] = tecla;
lcd.setCursor(lcdCursor, 0);
lcd.print(claveintro);
indiceTeclado++;
lcdCursor--;
Serial.print(tecla);
Serial.println(" ");
Serial.print("Clave introducida: ");
Serial.println(claveintro);
Serial.print("Indice teclado: ");
Serial.println(indiceTeclado);
for (int i = 0; i < 7 && indiceTeclado == 7; i++) {
if (claveintro[i] == clavedefecto[i]) {
coincide++;
Serial.print("Coincide ");
Serial.println(coincide);
Serial.println(i);
}
while (i == 6) {
if (coincide == 7) {
coincide = 0;
indiceTeclado = 0;
estadoBomba = 2;
lcdCursor = origiCursor;
break;
}
else {
indiceTeclado = 0;
coincide = 0;
Serial.println("Clave erronea");
lcdCursor = origiCursor;
break;
}
}
}
}
}
if (countdownTime == 0) estadoBomba = 3; //explota
break;
Y ésta la parte en la que "intento" hacer lo que quiero, más o menos lo hace, pero no como yo quiero
int progre = map(countdownTime, 45, 0, 1000, 0);
timeCalcVar = timeCalc % progre;
if (timeCalc >= progre && timeCalcVar >= timeCalcVar * 0.05) {
digitalWrite(ledRojo, HIGH);
Serial.println(progre);
Serial.println(timeCalcVar);
}
else if(timeCalcVar >= timeCalcVar* 0.15)
{
digitalWrite(ledRojo, LOW);
}
He probado varias cosas (ensayo y error) pero no lo consigo.
Y hago lo del map porque quiero que sea exacto el intervalo de 45 a 0 (usando esa conversion puedo utilizar el valor de los segundos restantes para utilizarlos como "delay")
Si queréis el código completo lo podéis encontrar aquí.
Un vez que termine todo el código haré un tutorial para hacerla exactamente igual que en el juego con el código incluido
Espero que me podáis ayudar. Muchas gracias de antemano y feliz año nuevo