About keypad

Hello, I want to ask why the second switch() doesn’t working. First one with the case ‘#’ is working fine but next one isn’t.

void loop()
{
  char key = keypad.getKey();
  
  if (key != NO_KEY){
    switch(key) {
      case '#':
    lcd.clear();
    lcd.print("Setting Mode");
    lcd.setCursor(0,1);
    lcd.print("   Hour:");
     delay(500);
     key = NO_KEY;
           int first_hour;  
           int second_hour;    
           unsigned long _start_time = millis();
           while(((key = keypad.getKey()) == NO_KEY) && ((millis()-_start_time) < 10000))
                     { // Do nothing 
                     }
             if (key != NO_KEY) {
                      key = keypad.getKey();
                 /*     switch (key){
                        
                      case '0':
                      first_hour = 0;
                      lcd.print (first_hour);
                      delay (300); 
                      break;
                      
                      case '1':
                      first_hour = 1;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '2':
                      first_hour = 2;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '3':
                      first_hour = 3;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '4':
                      first_hour = 4;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '5':
                      first_hour = 5;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '6':
                      first_hour = 6;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '7':
                      first_hour = 7;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '8':
                      first_hour = 8;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '9':
                      first_hour = 9;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      } 
                      */

             }
             while(((key = keypad.getKey()) == NO_KEY) && ((millis()-_start_time) < 10000))
                     { // Do nothing 
                     }
               if (key != NO_KEY) {
                      key = keypad.getKey();

You mean, your commented out switch() structure isn’t working?

Funny that. :wink:

Yes i commented the don't working switch();

Ah kk. So it wasn't working before you commented it. Important info. :)

Can you just post the whole loop() code? It's not all there at the minute.

And I assume it compiles fine but doesn't work as intended?

You’re right, there aren’t any error in the code but doesn’t working as I want. Here is the all of the code -

#include <Keypad.h>
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson
#include <LiquidCrystal.h> // we need this library for the LCD commands
LiquidCrystal lcd(1, 0, 10, 5, 4, 3, 2);
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = { 9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = { 13, 12, 11}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
/* do tuk e za keypad*/
void setup()
{

  RTC.stop();
  RTC.set(DS1307_SEC,1);        //set the seconds
  RTC.set(DS1307_MIN,39);     //set the minutes
  RTC.set(DS1307_HR,15);       //set the hours
  RTC.set(DS1307_DOW,3);       //set the day of the week
  RTC.set(DS1307_DATE,25);       //set the date
  RTC.set(DS1307_MTH,1);        //set the month
  RTC.set(DS1307_YR,10);         //set the year
  RTC.start();
  
  lcd.begin(16, 2); // tells Arduino the LCD dimensions
  lcd.setCursor(0,0);
  lcd.print("   Miroslav's"); // print text and move cursor to start of next line
  lcd.setCursor(0,1);
  lcd.print("Diplomna Rabota");
  delay(2000);
  lcd.clear();
  
}

void loop()
{
  char key = keypad.getKey();
  
  if (key != NO_KEY){
    switch(key) {
      case '#':
    lcd.clear();
    lcd.print("Setting Mode");
    lcd.setCursor(0,1);
    lcd.print("   Hour:");
     delay(500);
     key = NO_KEY;
           int first_hour;  
           int second_hour;    
           unsigned long _start_time = millis();
           while(((key = keypad.getKey()) == NO_KEY) && ((millis()-_start_time) < 10000))
                     { // Do nothing 
                     }
             if (key != NO_KEY) {
                      key = keypad.getKey();
                 /*     switch (key){
                        
                      case '0':
                      first_hour = 0;
                      lcd.print (first_hour);
                      delay (300); 
                      break;
                      
                      case '1':
                      first_hour = 1;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '2':
                      first_hour = 2;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '3':
                      first_hour = 3;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '4':
                      first_hour = 4;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '5':
                      first_hour = 5;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '6':
                      first_hour = 6;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '7':
                      first_hour = 7;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '8':
                      first_hour = 8;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      
                      case '9':
                      first_hour = 9;
                      lcd.print (first_hour);
                      delay (300);
                      break;
                      } 
                      */
                      lcd.print (key);
                      delay (300);
             }
             while(((key = keypad.getKey()) == NO_KEY) && ((millis()-_start_time) < 10000))
                     { // Do nothing 
                     }
               if (key != NO_KEY) {
                      key = keypad.getKey();
                      second_hour = key;
                     
                      lcd.print (key);
                      delay (300);  
            //      int new_hour = (first_hour&*10) + second_hour;   
               }
    
    
    
    
    
   
     }
               }
  int sensorPin = 0;  
  int reading = analogRead(sensorPin);  

 // converting that reading to voltage, for 3.3v arduino use 3.3
 float voltage = reading * 5.0 / 1024; 
 
 // print out the voltage
 
 // now print out the temperature
   float temperatureC = (voltage - 0.5) * 100 ; 
  lcd.clear(); // clear LCD screen
  lcd.setCursor(0,0);
  lcd.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true
  lcd.print(":");
  lcd.print(RTC.get(DS1307_MIN,false));//read minutes without update (false)
  lcd.print(":");
  lcd.print(RTC.get(DS1307_SEC,false));//read seconds
  lcd.print("  ");
  lcd.print(temperatureC);
  lcd.print("C");
lcd.setCursor(0,1);
lcd.print(" ");
switch(DS1307_DOW){
case 1:
lcd.print("Sun");
break;
case 2:
lcd.print("Mon");
break;
case 3:
lcd.print("Tue");
break;
case 4:
lcd.print("Wed");
break;

case 5:
lcd.print("Thu");
break;
case 6:
lcd.print("Fri");
break;
case 7:
lcd.print("Sat");
break;
}    
  lcd.print("  ");// some space for a more happy life
  lcd.print(RTC.get(DS1307_DATE,false));//read date
  lcd.print("/");
  lcd.print(RTC.get(DS1307_MTH,false)); //read month
  lcd.print("/");
  lcd.print(RTC.get(DS1307_YR,false)); //read year 
  

  delay(1000);

}
           while(((key = keypad.getKey()) == NO_KEY) && ((millis()-_start_time) < 10000))
                     { // Do nothing
                     }
             if (key != NO_KEY) {
                      key = keypad.getKey();

This waits for a key to be pressed, or until the timer runs down. If a key was pressed, it’s value is stored in key. So, you test that a key was pressed, to distinguish from the timer expiring. If a key WAS pressed, you ignore that, and see is another key is being pressed.

I don’t think that’s what you want to do.

I don't want to ignore the PRESSED button but to store it and print it on the LCD.

If I remove the highlighted would I store the Pressed button - directly using the ‘key’ ?

while(((key = keypad.getKey()) == NO_KEY) && ((millis()-_start_time) < 10000))
                     { // Do nothing
                     }
             if (key != NO_KEY) {
                     [glow] key = keypad.getKey();[/glow]
                           lcd.print(key);

P.S. YES. this was the problem, now I think I’ll make what I want :slight_smile:

How can I make if the highlighted statement is true, to make the program return back to the if() before it ?

 if (key != NO_KEY) {
                     lcd.clear();
                     lcd.print("Minutes:");

                   switch (key){ 
                     
                     case '0':
                      first_minute = 0;
                      lcd.print (first_minute);
                      delay (300); 
                      break;
                      
                      case '1':
                      first_minute = 1;
                      lcd.print (first_minute);
                      delay (300);
                      break;
                      
                      case '2':
                      first_minute = 2;
                      lcd.print (first_minute);
                      delay (300);
                      break;
                      
                      case '3':
                      first_minute = 3;
                      lcd.print (first_minute);
                      delay (300);
                      break;
                      
                      case '4':
                      first_minute = 4;
                      lcd.print (first_minute);
                      delay (300);
                      break;
                      
                      case '5':
                      first_minute = 5;
                      lcd.print (first_minute);
                      delay (300);
                      break;
                      
                      case '6':
                      first_minute = 6;
                      lcd.print (first_minute);
                      delay (300);
                      break;
                      
                      case '7':
                      first_minute = 7;
                      lcd.print (first_minute);
                      delay (300);
                      break;
                      
                      case '8':
                      first_minute = 8;
                      lcd.print (first_minute);
                      delay (300);
                      break;
                      
                      case '9':
                      first_minute = 9;
                      lcd.print (first_minute);
                      delay (300);
                      break;
                      } 
               }
               _start_time = millis();
               while(((key = keypad.getKey()) == NO_KEY) && ((millis()-_start_time) < 10000))
                     { // Do nothing 
                     }
               if (key != NO_KEY) {
              
                   switch (key){ 
                     case '0':
                      second_minute = 0;
                      lcd.print (second_minute);
                      delay (300); 
                      break;
                      
                      case '1':
                      second_minute = 1;
                      lcd.print (second_minute);
                      delay (300);
                      break;
                      
                      case '2':
                      second_minute = 2;
                      lcd.print (second_minute);
                      delay (300);
                      break;
                      
                      case '3':
                      second_minute = 3;
                      lcd.print (second_minute);
                      delay (300);
                      break;
                      
                      case '4':
                      second_minute = 4;
                      lcd.print (second_minute);
                      delay (300);
                      break;
                      
                      case '5':
                      second_minute = 5;
                      lcd.print (second_minute);
                      delay (300);
                      break;
                      
                      case '6':
                      second_minute = 6;
                      lcd.print (second_minute);
                      delay (300);
                      break;
                      
                      case '7':
                      second_minute = 7;
                      lcd.print (second_minute);
                      delay (300);
                      break;
                      
                      case '8':
                      second_minute = 8;
                      lcd.print (second_minute);
                      delay (300);
                      break;
                      
                      case '9':
                      second_minute = 9;
                      lcd.print (second_minute);
                      delay (300);
                      break;
                      } 
                      int new_minute = (first_minute*10) + second_minute;  
                      [glow]if(new_minute>=60) [/glow]{
         [glow]  // In this part I want to return the program back to the first if()[/glow]
                  lcd.clear();
                 lcd.print("Wrong");
                 delay(2000);
                }