Cuenta atrás con contraseña

Buenos días para todos y todas.

Tengo un trabajo del colegio pero realmente no he podido hacerlo porque mis conocimientos de Arduino son muy bajos, me salvarían la vida si me ayudan con esto.

Debo hacer una especie de BOMBA como la de Counter Strike
donde en un pantalla LCD se muestra el contador de tiempo regresivo y con un teclado 4x3 se introduce la contraseña que detiene el tiempo.

alguien me puede ayudar con esto por favor? le estaría infinitamente agradecido

Como es un contador regresivo?

Hola, buenas tardes.

Es un temporizador de 60 minutos a 0 minutos
Cuando llega a 0 un buzzer emite una alarma.

Bien, dime como lo implementarias? Un temporizador puede hacerse de muchas maneras.
Es un cliclo que comienza en 60 y se decrementa en 1.
Deberías haber visto los ciclos for() entre las funciones posibles no?
Tambien puedes comenzar por un contador que arranque en 60 y que tarde 1 minuto en descender a 59 ahora si haces eso durante ese minuto el programa no podrá hacer mas nada, esto lo digo porque los profesores (la mayoría) suele enseñar el uso de delay().
Imagina que tienes un contador que vale 60
se encuentra con algo que lo retiene x 1 minuto y entonces le dice, ahh ya pasó 1 minuto entonces descuenta 1 al contador y tienes 59. Repites eso hasta llegar a 0.
En principio todo bien.
Ahora suponte que debes enviar ese estado a un diplay entonces ya no puedes quedarte 1 minuto sin hacer nada, debes atender otras cosas.
Bueno para ello existen otros elementos.
Ya me dirás cómo te animas a hacerlo.

1 Like

Hola..tengo una duda con atmel y es que quiero utilizar las librerias del ide arduino en atmel y no se como hacerlo..alguien aqui que me pueda ayudar..gracias

kevinr010 lee las normas del foro y jámas hagas consulta en un hilo por un tema que no tenga que ver con lo que se consulta en dicho hilo.
Asi que crea tu propio hilo y ahi te responderemos.

Hola @serenanderson ,

¿Qué clase de profesor es este que le pide un trabajo a un alumno sin darle los conocimientos adecuados para hacerlo?

RV mineirin

No sabemos que le ha enseñado y que no. Aún no responde.

mis disculpas..no tenia conocimiento de las normas del foro..ya logre resolver mi problema

El mio :sob: ... Estoy muy frustrado, realmente no pude desarrollar el trabajo y debo entregarlo mañana.

sé que puede sonar muy simple para los que saben del tema pero para mi es algo muy muy muy complejo

Si el temporizador debo mostrarse en una pantalla LCD 16x2, según el profe se deben ver los minutos y segundos en la pantalla y que cuando uno digite (en un teclado matricial 4x3) la contraseña se detenga el temporizador.

Creí que iba a ser algo "fácil" ... sonaba muy fácil jaja ahora estoy muy frustrado, mas perdido que cuando inicié y a punto de perder la materia :grinning_face_with_smiling_eyes:

Hola @serenanderson
Publique aquí el código que escribió, incluso si no funciona.
ArduinoForum

Usa etiquetas </> para publicarlo
RV mineirin

Hola a todos y todas, muy buenas tardes.

Estoy armando un proyecto donde debo recrear la bomba de Counter Strike (Solo para el proyecto)
He investigado bastante ya que no tengo muchos conocimientos en Arduino y encontré una programación que me sirve perfecto, pero tengo un pequeño gran problema y es que la pantalla LCD 16x2 I2c no me funciona, no da imagen, no se muestra el mensaje en la pantalla.
Alguien me podría ayudar con esto por favor? le quedaría eternamente agradecido

Adjunto el código que estoy utilizando para esto.
<
</>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); //Change the HEX address

int Hours = 00;
int Minutes = 00;
int Seconds = 00;
int trycount = 0;
int keycount = 0;
int i = 0;

int redled = A2;
int yellowled = A1;
int greenled = A3;

int hourstenscode;
int hoursonescode;
int mintenscode;
int minonescode;
int sectenscode;
int seconescode;

long secMillis = 0;
long interval = 1000;

char password[4];
char entered[4];

const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[ROWS] = {8, 7, 6, 5}; //7,2,3,5 for Black 4x3 keypad
byte colPins[COLS] = {4, 3, 2}; //6,8,4 for Black 4x3 Keypad

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {
pinMode(redled, OUTPUT);
pinMode(yellowled, OUTPUT);
pinMode(greenled, OUTPUT);
digitalWrite(redled,HIGH);
digitalWrite(yellowled,HIGH);
digitalWrite(greenled,HIGH);

lcd.begin(16,2);
lcd.backlight();
Serial.begin(9600);

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("¡ZOMBIELAND!");
lcd.setCursor(0, 1);
lcd.print("Enter Code:");
while (keycount < 4)
{
lcd.setCursor(keycount + 12, 1);
lcd.blink();
char armcode = keypad.getKey();
armcode == NO_KEY;
if (armcode != NO_KEY)
{
if ((armcode != '*') && (armcode != '#'))
{
lcd.print(armcode);
tone(9, 5000, 100);
password[keycount] = armcode;
keycount++;
}
}
}

if (keycount == 4)
{
delay(500);
lcd.noBlink();
lcd.clear();
lcd.home();
lcd.print("Disarm Code is: ");
lcd.setCursor(6, 1);
lcd.print(password[0]);
lcd.print(password[7]);
lcd.print(password[1]);
lcd.print(password[3]);
delay(3000);
lcd.clear();
}
lcd.setCursor(0, 0);
lcd.print("Timer: HH:MM:SS");
lcd.setCursor(0, 1);
lcd.print("SET: : :");
keycount = 5;

while (keycount == 5)
{
char hourstens = keypad.getKey();
lcd.setCursor(5, 1);
lcd.blink();
if (hourstens >= '0' && hourstens <= '9')
{
hourstenscode = hourstens - '0';
tone(9, 5000, 100);
lcd.print(hourstens);
keycount++;
}
}

while (keycount == 6)
{
char hoursones = keypad.getKey();
lcd.setCursor(6, 1);
lcd.blink();
if (hoursones >= '0' && hoursones <= '9')
{
hoursonescode = hoursones - '0';
tone(9, 5000, 100);
lcd.print(hoursones);
keycount++;
}
}

while (keycount == 7)
{
char mintens = keypad.getKey();
lcd.setCursor(8, 1);
lcd.blink();
if (mintens >= '0' && mintens <= '9')
{
mintenscode = mintens - '0';
tone(9, 5000, 100);
lcd.print(mintens);
keycount++;
}
}

while (keycount == 8)
{
char minones = keypad.getKey();
lcd.setCursor(9, 1);
lcd.blink();
if (minones >= '0' && minones <= '9')
{
minonescode = minones - '0';
tone(9, 5000, 100);
lcd.print(minones);
keycount++;
}
}

while (keycount == 9)
{
char sectens = keypad.getKey();
lcd.setCursor(11, 1);
lcd.blink();
if (sectens >= '0' && sectens <= '9')
{
sectenscode = sectens - '0';
tone(9, 5000, 100);
lcd.print(sectens);
keycount = 10;
}
}

while (keycount == 10)
{
char secones = keypad.getKey();
lcd.setCursor(12, 1);
lcd.blink();
if (secones >= '0' && secones <= '9')
{
seconescode = secones - '0';
tone(9, 5000, 100);
lcd.print(secones);
keycount = 11;
}
}

if (keycount == 11);
{
Hours = (hourstenscode * 10) + hoursonescode;
Minutes = (mintenscode * 10) + minonescode;
Seconds = (sectenscode * 10) + seconescode;
delay(100);
lcd.noBlink();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Timer set at:");
if (Hours >= 10)
{
lcd.setCursor (7, 1);
lcd.print (Hours);
}
if (Hours < 10)
{
lcd.setCursor (7, 1);
lcd.write ("0");
lcd.setCursor (8, 1);
lcd.print (Hours);
}
lcd.print (":");

if (Minutes >= 10)
{
  lcd.setCursor (10, 1);
  lcd.print (Minutes);
}
if (Minutes < 10)
{
  lcd.setCursor (10, 1);
  lcd.write ("0");
  lcd.setCursor (11, 1);
  lcd.print (Minutes);
}
lcd.print (":");

if (Seconds >= 10)
{
  lcd.setCursor (13, 1);
  lcd.print (Seconds);
}

if (Seconds < 10)
{
  lcd.setCursor (13, 1);
  lcd.write ("0");
  lcd.setCursor (14, 1);
  lcd.print (Seconds);
}
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Press # to arm");
delay (50);
keycount = 12;

}

while (keycount == 12)
{
char armkey = keypad.getKey();

if (armkey == '#')
{
  tone(9, 5000, 100);
  delay(50);
  tone(9, 0, 100);
  delay(50);
  tone(9, 5000, 100);
  delay(50);
  tone(9, 0, 100);
  delay(50);
  tone(9, 5000, 100);
  delay(50);
  tone(9, 0, 100);
  lcd.clear();
  lcd.print ("Bomb Armed!");
  lcd.setCursor(0, 1);
  lcd.print("Countdown start");
  delay(3000);
  lcd.clear();
  keycount = 0;
}

}
}
void loop()
{
timer();
char disarmcode = keypad.getKey();

if (disarmcode == '*')
{
tone(9, 5000, 100);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Code: ");

while (keycount < 4)
{
  timer();

  char disarmcode = keypad.getKey();
  if (disarmcode == '#')
  {
    tone(9, 5000, 100);
    keycount = 0;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Code: ");
  }
  else if (disarmcode != NO_KEY)
  {
    lcd.setCursor(keycount + 7, 0);
    lcd.blink();
    lcd.print(disarmcode);
    entered[keycount] = disarmcode;
    keycount++;
    tone(9, 5000, 100);
    delay(100);
    lcd.noBlink();
    lcd.setCursor(keycount + 6, 0);
    lcd.print("*");
    lcd.setCursor(keycount + 7, 0);
    lcd.blink();
  }
}

if (keycount == 4)
{
  if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3])
  {
    lcd.noBlink();
    lcd.clear();
    lcd.home();
    lcd.print("Bomb Defused!");
    lcd.setCursor(0, 1);
    lcd.print("Well Done!");
    keycount = 0;
    digitalWrite(greenled, LOW);
    delay(15000);
    lcd.clear();
    lcd.setCursor(0, 1);
    lcd.print("Reset the Bomb");
    delay(1000000);
  }
  else
  {
    lcd.noBlink();
    lcd.clear();
    lcd.home();
    lcd.print("Wrong Password!");
    trycount++;

    if (Hours > 0)
    {
      Hours = Hours / 2;
    }

    if (Minutes > 0)
    {
      Minutes = Minutes / 2;
    }
    if (Seconds > 0)
    {
      Seconds = Seconds / 2;
    }
    if (trycount == 2)
    {
      interval = interval / 10;
    }
    if (trycount == 3)
    {
      Minutes = Minutes - 59;
      Hours = Hours - 59;
      Seconds = Seconds - 59;
    }
    delay(1000);
    keycount = 0;
  }
}

}
}

void timer()
{
Serial.print(Seconds);
Serial.println();

if (Hours <= 0)
{
if ( Minutes < 0 )
{
lcd.noBlink();
lcd.clear();
lcd.home();
lcd.print("The Bomb Has ");
lcd.setCursor (0, 1);
lcd.print("Exploded!");

  while (Minutes < 0)
  {
    digitalWrite(redled, LOW);
    tone(9, 7000, 100);
    delay(100);
    digitalWrite(redled, HIGH);
    tone(9, 7000, 100);
    delay(100);
    digitalWrite(yellowled, LOW);
    tone(9, 7000, 100);
    delay(100);
    digitalWrite(yellowled, HIGH);
    tone(9, 7000, 100);
    delay(100);
    digitalWrite(greenled, LOW);
    tone(9, 7000, 100);
    delay(100);
    digitalWrite(greenled, HIGH);
    tone(9, 7000, 100);
    delay(100);
  }
}

}
lcd.setCursor (0, 1);
lcd.print ("Timer:");

if (Hours >= 10)
{
lcd.setCursor (7, 1);
lcd.print (Hours);
}
if (Hours < 10)
{
lcd.setCursor (7, 1);
lcd.write ("0");
lcd.setCursor (8, 1);
lcd.print (Hours);
}
lcd.print (":");

if (Minutes >= 10)
{
lcd.setCursor (10, 1);
lcd.print (Minutes);
}
if (Minutes < 10)
{
lcd.setCursor (10, 1);
lcd.write ("0");
lcd.setCursor (11, 1);
lcd.print (Minutes);
}
lcd.print (":");

if (Seconds >= 10)
{
lcd.setCursor (13, 1);
lcd.print (Seconds);
}

if (Seconds < 10)
{
lcd.setCursor (13, 1);
lcd.write ("0");
lcd.setCursor (14, 1);
lcd.print (Seconds);
}

if (Hours < 0)
{
Hours = 0;
}

if (Minutes < 0)
{
Hours --;
Minutes = 59;
}

if (Seconds < 1)
{
Minutes --;
Seconds = 59;
}

if (Seconds > 0)
{
unsigned long currentMillis = millis();

if (currentMillis - secMillis > interval)
{
  tone(9, 7000, 50);
  secMillis = currentMillis;
  Seconds --;
  digitalWrite(yellowled, LOW);
  delay(10);
  digitalWrite(yellowled, HIGH);
  delay(10);
}

}
}

Hola @serenanderson ;

Supongo que no lee las publicaciones de respuesta a sus preguntas.

¿De verdad quieres ayuda?

Por lo tanto, lea el tema recomendado para principiantes.
mira lo que te recomendé en:
#12 de Cuenta atrás con contraseña - #12 by ruilviana

RV mineirin

Por favor respetá las Normas del foro, corrige la inserción del código. Ya te lo dijo @ruilviana por segunda vez, la mia es la tercera.

Cambia

lcd.begin(16,2);

por

lcd.init();

que es lo correcto.

Saludos

Moderador:
Doble posteo, la proxima será sanción de 1 dia sin poder ingresar al foro.
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>