Go Down

Topic: Error en codigo y con Tone (Read 363 times) previous topic - next topic

Hola a todos.
En mi proyecto,tengo un lcd con un teclado,en el cual hay un cuenta regresiva,si se introduce el codigo correcto,la cuenta atras se para y se tendria que reiniciar,osea,volver al estado principal,y no lo hace,reconoce el codigo pero sigue la cuenta atras. me podeis ayudar??
Tambien en cada segundo va sonando un pip y al llegar el contador a cero hace otro sonido,pero si en mi codigo,quito el comentario a los tone,en el display me salen caracteres raros...a ver que se puede hacer.

dejo el codigo:
Code: [Select]

#include <Keypad.h>
#include <LiquidCrystal.h>
#define pound 14
#define LED_RED 0
#define LED_GREEN 1
#define KP_ROWS 4
#define KP_COLS 3

unsigned int timerSeconds = 300; // start with 5 minutes on the clock
byte password[4];
byte entered[4];
int currentLength = 0;
byte i = 0;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

//Keypad
char keys[KP_ROWS][KP_COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'},
};
byte rowPins[KP_ROWS] = { 15, 2, 19, 17 }; //connect to the row pinouts of the keypad {18, 2, 14, 16}
byte colPins[KP_COLS] = { 16, 14, 18 }; //connect to the column pinouts of the keypad {17, 19, 15}
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KP_ROWS, KP_COLS);

char key;

//LCD setup
void setup() {
pinMode(LED_RED, OUTPUT); // sets the digital pin as output
pinMode(LED_GREEN, OUTPUT); // sets the digital pin as output
lcd.begin(16, 2);
lcd.print("Entre codigo: ");
lcd.cursor();
lcd.setCursor(6, 1);
while (currentLength < 4) {
key = keypad.getKey();
if (key != NO_KEY) {
lcd.print(key);
password[currentLength] = key;
currentLength++;
lcd.setCursor(currentLength + 6, 1);
} else delay(100); // only sample it every 1/10 sec, no need to go apesh!t
}
lcd.noCursor();
lcd.clear();
lcd.print("A introducido: ");
lcd.setCursor(6, 1);
lcd.print(password[0],DEC);
lcd.print(password[1],DEC);
lcd.print(password[2],DEC);
lcd.print(password[3],DEC);
delay(2500);
lcd.clear();
currentLength = 0;
}

void loop() {
lcd.clear();
lcd.print("Entre codigo: ");
lcd.cursor();
key = keypad.getKey(); // get the key once per this loop
if (key != NO_KEY) {
lcd.setCursor(0, 1);
lcd.print("               ");
lcd.setCursor(6, 1);
while (currentLength < 4) {
// here, we take the key that broke us into this "if" statement, instead of discarding it. this also pauses the timer, effectively.
if (key != NO_KEY) { // redundant for the first loop, but necessary for every next character
lcd.setCursor(currentLength + 5, 1);
lcd.print("*");
lcd.setCursor(currentLength + 6, 1);
lcd.print(key);
entered[currentLength] = key;
currentLength++;
} else delay(100); // only sample it every 1/10 sec
key = keypad.getKey(); // get the key every time "while" loops
}
if (memcmp(entered,password,4) == 0) { // shortcut to compare an array of bytes, use memcmp(A, B, length), will return 0 if match.
lcd.noCursor();
lcd.clear();
lcd.print(" Desarmada ");
lcd.setCursor(0, 1);
lcd.print("Reseteando Bomba");
delay(2500); // hold that on screen for 2.5 seconds
currentLength = 0;
} else {
lcd.noCursor();
lcd.clear();
lcd.print(" Incorrecto ");
lcd.setCursor(0, 1);
lcd.print(" Tiempo -0:60"); // Display time penalty
if (timerSeconds > 60) timerSeconds -= 0;
else timerSeconds = 1; // will trigger BOOM next cycle
currentLength = 0;
delay(2500); // hold that on screen for 2.5 seconds
}
}
timer(); // prints current time on screen, checks for "go off" time, holds loop for 1 second
}

void timer() {
lcd.setCursor(0, 1); // sets cursor to 2nd line
lcd.print("Tiempo: ");
lcd.print(timerSeconds / 60); // integer number of minutes on clock
lcd.print(":");
lcd.print(timerSeconds % 60); // mod 60; gives us number of seconds outside of 60sec/min
delay(950); // hold us here for 0.950 seconds
digitalWrite(LED_GREEN,!digitalRead(LED_GREEN)); // toggle the green LED once a second
//tone(9,784, 200); // play bleep for 50ms
delay(50); // and there's the rest of that 1 second (not counting LCD delay)

timerSeconds--;
if (timerSeconds == 0) bombomb();
}
void bombomb() {
// routine for making ze BOMB GOEZ OFF!!!1 :D
lcd.noCursor();
lcd.clear();
lcd.print(" !BoOo0o0o0om! ");
//tone(9,110, 200);
digitalWrite(LED_RED, HIGH); // sets the red LED on
delay(500); // waits half a second
//tone(9,110, 200);
delay(500); // waits half a second
digitalWrite(LED_RED, LOW); // sets the red LED off
digitalWrite(LED_GREEN, HIGH); // sets the green LED on
//tone(9,110, 200);
delay(500); // waits half a second
digitalWrite(LED_RED, HIGH); // sets the red LED on
digitalWrite(LED_GREEN, LOW); // sets the green LED off
//tone(9,110, 200);
delay(500); // waits half a second
digitalWrite(LED_RED, LOW); // sets the red LED off
digitalWrite(LED_GREEN, HIGH); // sets the green LED on
//tone(9,110, 200);
delay(500); // waits half a second
digitalWrite(LED_GREEN, LOW); // sets the green LED off
key = NO_KEY; // enter the while() loop, otherwise it'll skip. i could use do { } while();, but I'm lazy.
while (key == NO_KEY) {
key = keypad.getKey();
if (key == '#') {
lcd.clear();
lcd.print("Reseteando Bomba");
delay(2500); // good ole' 2.5 sec delay
timerSeconds = 300; // put 5 minutes on the clock
// and we break the loop and go back to timer.
} else key = NO_KEY; // continue looking for pound key
}
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy