Как сбросить/завершить ввод данных с помощью клавиатуры? Arduino Uno кормушка для домашних животных

Сейчас я создаю автоматическую кормушку для домашних животных с помощью Arduino Uno.

Что я хотел сделать, так это после того, как я ввел необходимые данные (дни, часы и минуты), я хочу остановить цикл дней, пока он не закончится, или «сбросить» входные данные, нажав «D». Я не хочу сбрасывать все Arduino, так как это повлияет на сервопривод и будет вращаться на 360°.

Единственное решение, которое у меня есть сейчас, это иметь кнопку, напрямую подключенную к контакту сброса Arduino, однако это повлияет на мой сервопривод; это то, чего я избегаю


         if (keypressed == 'B' && stop == true)
         {

                      if (keypressed == 'D') {
                        stop = false;
                        exit();
                      }



          
          lcd.clear();
          lcd.print("  Days setup  ");
          delay(1000);
          lcd.clear();


          lcd.print("Set no. of Day"); //B_days
          char   keypressed18 = myKeypad.waitForKey();
                if (keypressed18 != NO_KEY && keypressed18 !='*' && keypressed18 !='#' && keypressed18 !='A' && keypressed18 !='B' && keypressed18 !='C' && keypressed18 !='D' )
                  {
                    c1 = keypressed18;
                   lcd.setCursor(0, 1);
                   lcd.print(c1);
                   }
                 i1=48-c1;
                 B_days=abs(i1);
                 Serial.print(B_days);
                 delay(500);
                 lcd.clear();



                 lcd.print("  MEAL 1  "); 
                 delay(1000);
                 lcd.clear();                     
                 lcd.print("Set FEED hour");
           
                char keypressed19 = myKeypad.waitForKey();  // здесь все программы останавливаются до тех пор, пока вы не введете четыре цифры, после чего сравнивается с кодом выше
                if (keypressed19 != NO_KEY && keypressed19 !='*' && keypressed19 !='#' && keypressed19 !='A' && keypressed19 !='B' && keypressed19 !='C' && keypressed19 !='D' )
                  {
                   c2 = keypressed19;
                   lcd.setCursor(0, 1);
                   lcd.print(c2);
                   }
                char   keypressed20 = myKeypad.waitForKey();
                if (keypressed20 != NO_KEY && keypressed20 !='*' && keypressed20 !='#' && keypressed20 !='A' && keypressed20 !='B' && keypressed20 !='C' && keypressed20 !='D' )
                  {
                    c3 = keypressed20;
                   lcd.setCursor(1, 1);
                   lcd.print(c3);
                   }


                 i1=(c2-48)*10;
                 i2=c3-48;
                 B_hour1=i1+i2;
                delay(500);
                lcd.clear();
                
                
                lcd.print("Set FEED minutes");
                  char keypressed21 = myKeypad.waitForKey();  // здесь все программы останавливаются до тех пор, пока вы не введете четыре цифры, после чего сравнивается с кодом выше
                if (keypressed21 != NO_KEY && keypressed21 !='*' && keypressed21 !='#' && keypressed21 !='A' && keypressed21 !='B' && keypressed21 !='C' && keypressed21 !='D' )
                  {
                   c1 = keypressed21;
                   lcd.setCursor(0, 1);
                   lcd.print(c1);
                   }
                char   keypressed22 = myKeypad.waitForKey();
                if (keypressed22 != NO_KEY && keypressed22 !='*' && keypressed22 !='#' && keypressed22 !='A' && keypressed22 !='B' && keypressed22 !='C' && keypressed22 !='D' )
                  {
                    c2 = keypressed22;
                   lcd.setCursor(1, 1);
                   lcd.print(c2);
                   }


                 i1=(c1-48)*10;
                 i2=c2-48;
                 B_minute1=i1+i2;
                 Serial.print(B_minute1);
                 delay(500);
                 lcd.clear();
                 

                 lcd.print("  MEAL 2  ");
                 delay(1000);
                 lcd.clear(); 
                 lcd.print("Set FEED hour");
           
                char keypressed23 = myKeypad.waitForKey();  // здесь все программы останавливаются до тех пор, пока вы не введете четыре цифры, после чего сравнивается с кодом выше
                if (keypressed23 != NO_KEY && keypressed23 !='*' && keypressed23 !='#' && keypressed23 !='A' && keypressed23 !='B' && keypressed23 !='C' && keypressed23 !='D' )
                  {
                   c2 = keypressed23;
                   lcd.setCursor(0, 1);
                   lcd.print(c2);
                   }
                char   keypressed24 = myKeypad.waitForKey();
                if (keypressed24 != NO_KEY && keypressed24 !='*' && keypressed24 !='#' && keypressed24 !='A' && keypressed24 !='B' && keypressed24 !='C' && keypressed24 !='D' )
                  {
                    c3 = keypressed24;
                   lcd.setCursor(1, 1);
                   lcd.print(c3);
                   }


                 i1=(c2-48)*10;
                 i2=c3-48;
                 B_hour2=i1+i2;
                delay(500);
                lcd.clear();
                

                lcd.print("Set FEED minutes");
                  char keypressed25 = myKeypad.waitForKey();  // здесь все программы останавливаются до тех пор, пока вы не введете четыре цифры, после чего сравнивается с кодом выше
                if (keypressed25 != NO_KEY && keypressed25 !='*' && keypressed25 !='#' && keypressed25 !='A' && keypressed25 !='B' && keypressed25 !='C' && keypressed25 !='D' )
                  {
                   c1 = keypressed25;
                   lcd.setCursor(0, 1);
                   lcd.print(c1);
                   }
                char   keypressed26 = myKeypad.waitForKey();
                if (keypressed26 != NO_KEY && keypressed26 !='*' && keypressed26 !='#' && keypressed26 !='A' && keypressed26 !='B' && keypressed26 !='C' && keypressed26 !='D' )
                  {
                    c2 = keypressed26;
                   lcd.setCursor(1, 1);
                   lcd.print(c2);
                   }


                 i1=(c1-48)*10;
                 i2=c2-48;
                 B_minute2=i1+i2;
                 Serial.print(B_minute2);
                 delay(500);
                 lcd.clear();


                 
                 AlarmIsActive=2;
                 keypressed=NO_KEY;
      
         }

, 👍-1

Обсуждение

Пожалуйста, предоставьте минимальный воспроизводимый пример, который компилируется, когда мы копируем и пробуем его, а не просто отрывок с множеством других вещей. -- Что мешает обнаружить кнопку и выйти из цикла входа?, @the busybee

Пожалуйста, очистите комментарии в вашем коде... они не имеют смысла, потому что они не описывают функционирование кода, @jsotola


1 ответ


1

Это не прямой ответ.

Ваш код излишне повторяющийся и сложный.

Используйте функцию для выполнения повторяющегося кода.

Вот пример того, как вы могли бы сделать числовой ввод в функцию.

Код не тестировался.


int getNumber(String msg) {

   int data = 0;
   bool numNotPressed = true;             // флаговая переменная

   lcd.clear();                     
   lcd.print(msg);

   lcd.setCursor(0, 1);                   // устанавливаем курсор на первую позицию во второй строке

   while true {

      char key = myKeypad.waitForKey();

      if (  key != NO_KEY
         && key != '*'
         && key != '#'
         && key != 'A'
         && key != 'B'
         && key != 'C'
         && key != 'D'
      ) {                                 // была нажата цифровая клавиша
         lcd.print(key);                  // курсор автоматически перемещается
         d10 = data * 10;
         data = d10 + (key - 48);         // собрать многозначный ввод
         numNotPressed = false;           // была нажата цифровая клавиша
      }
      
      else {
         if (numNotPressed) data = -1;    // -1 означает, что цифровая клавиша не была нажата
         return data;                     // возвращаем значение вызывающему коду
      }
   }
}

// Применение

    lcd.clear();
    lcd.print("  MEAL 2  ");
    delay(1000);

    num = getNumber("Set FEED hour");
    if (num > -1) {
       B_hour = num;                       // обновить B_hour, если было введено числовое значение
    }
,