Таймер Arduino с кнопкой увеличения времени

У меня есть проект Arduino, для которого требуется таймер обратного отсчета (который я уже сделал). Я подключил кнопку, и когда я нажимаю эту кнопку, мне нужно увеличить таймер обратного отсчета на +10 секунд.

Кто-нибудь может помочь мне добавить код для этой кнопки?

Вот код на данный момент (я объявил кнопку, но не знаю, годится ли она):

#include <LiquidCrystal.h>

int buttonPin = 7;
int buttonState = 0;
int seconds = 30; // считать секунды
int minutes = 0; // считать минуты
int hours = 0; // считать часы
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
//инициализируем библиотеку номерами выводов интерфейса
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // контакты, подключенные к ЖК-дисплею

void setup()
{
  lcd.begin(16, 2); //задаем количество столбцов и строк ЖК-дисплея
  pinMode(buttonPin, INPUT);
}
void loop()
{
  buttonState = digitalRead(buttonPin);
  lcd.setCursor(1, 0);
  lcd.print ("Sosire in:");
  lcd.setCursor(6, 1);
  lcd.print(":");
  lcd.setCursor(9, 1);
  lcd.print(":");

  seconds--;
  delay(1000);

 if (seconds < 0)
  {
    minutes--;
    seconds = 59;
  }
 if (minutes < 0)
  {
    hours--;
    minutes = 59;
  }
 if (hours < 0)
  {
    hours = 0;
    minutes = 0;
    seconds = 30;
  }
 if (minutes > 9)
  {
    lcd.setCursor(7, 1);
    lcd.print(minutes);
  }
 else
  {
    lcd.setCursor(7, 1);
    lcd.print("0");
    lcd.setCursor(8, 1);
    lcd.print(minutes);
    lcd.setCursor(9, 1);
    lcd.print(":");
  }

 if (seconds > 9)
  {
    lcd.setCursor(10, 1);
    lcd.print(seconds);
  }
 else
  {
    lcd.setCursor(10, 1);
    lcd.print("0");
    lcd.setCursor(11, 1);
    lcd.print(seconds);
    lcd.setCursor(12, 1);
    lcd.print(" ");
  }

 if (hours > 9)
  {
    lcd.setCursor(4, 1);
    lcd.print(hours);
  }
 else
  {
    lcd.setCursor(4, 1);
    lcd.print("0");
    lcd.setCursor(5, 1);
    lcd.print(hours);
    lcd.setCursor(6, 1);
    lcd.print(":");
  }
 if (seconds == 0)
  {
    lcd.clear();
    lcd.print("Este in statie");
    delay(5000);
    lcd.clear();
  }

}

, 👍2

Обсуждение

Ваш код очень трудно читать, пожалуйста, выровняйте его (круглые скобки друг под другом и код внутри с правильным отступом)., @Michel Keijzers

Вы всегда должны называть свои переменные для удобства чтения. Вместо «H», «M» и «S» используйте английские названия, такие как «часы», «минуты» и «секунды». Это значительно облегчит другим людям помощь вам, а также поможет вам читать собственный код!, @HavocRC

Моя программа работает правильно, но я не знаю, как сделать, чтобы при нажатии кнопки время увеличивалось на 10+ секунд., @Radu Lucian

Увеличивать какое время? Вам нужно будет быть более конкретным, у вас есть 3 разные переменные «время»: часы, минуты и секунды., @HavocRC

Секунды, увеличивайте S на 10 секунд, когда я нажимаю кнопку., @Radu Lucian

ваш код излишне сложен .... ЖК-дисплей отслеживает следующую позицию печати .... например, код секунд дисплея может быть сокращен до этих четырех строк .... lcd.setCursor(10, 1); если (секунды < 10) lcd.print("0"); lcd.print(секунды); ЖК-принт(" ");, @jsotola

Итак, посмотрите на пример кнопки и пример изменения состояния, которые поставляются с IDE. первый объясняет, как использовать оператор if, чтобы сделать что-то при нажатии кнопки, а второй объясняет, как сделать так, чтобы это происходило только один раз при каждом нажатии кнопки., @Delta_G


1 ответ


4

Я не совсем понимаю вашу программу, но надеюсь дать некоторые рекомендации/советы:

  • Вместо того, чтобы использовать всевозможные переменные с часами, минутами и секундами, используя только одну переменную, которая хранит время. Например, длинное целое значение, которое содержит 24 * 60 * часов + 60 * минут + секунд как одно значение. Например, 12:34:56 будет 24 * 60 * 12 + 60 * 34 + 56 = 19 376.
  • Вычесть одну или 10 секунд так же просто, как вычесть значение 1 или 10.
  • Для обратного расчета в секундах, минутах и часах используйте 3 формулы (при условии, что время является значением времени):
int hours   = (int) time / 60 / 24;
int minutes = (int) (time - hours * 60 * 24) / 60;
int seconds = time % 60;
  • Держите код для отображения на ЖК-дисплее отдельно, возможно, будет проще обновлять каждую цифру каждую секунду. Вероятно, вы меняете его каждую секунду или при нажатии кнопки, что очень медленно для MCU.
  • При использовании кнопки (вы уже поместили ее в переменную) просто удалите 10 секунд и обновите время.
  • Тем не менее, проверьте также пример Blink Without Delay на веб-сайте Arduino, так как при нажатии кнопки высока вероятность того, что кнопка отскочит, и одно нажатие может привести к тому, что несколько раз будет вычтено 10 секунд.
  • И, как было сказано выше, используйте правильные английские имена переменных и английские комментарии (кроме отображаемого текста графического интерфейса... O zi buna).
,