1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Delay и millis

Модератор: Глоб.модераторы

Ответить

Автор темы
Nordis
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 22 июн 2024, 11:55
Имя: Андрей
Страна: Россия
город/регион: Когалым
Благодарил (а): 2 раза

Delay и millis

Сообщение Nordis »

Все доброго! Для работы мне необходимо устройство, специфического назначения, закупил все компоненты и вот сегодня пытаюсь создать прототип. До этого я програмировал только по Win. Некоторые понимания есть, но все же тяжело вот так сразу. Прошу помощи. Основное я уже сделал, мне нужно избавиться от delayев.
Почему вот такая конструкция работает?

Код: Выделить всё

  displayW.showNumberDecEx(displaytime, 0b11100000, true);
  delay(1000);
  displayW.showNumberDec(displaytime, true);
  delay(1000);
А вот такая нет?

Код: Выделить всё

 if (millis() - last_time >= 1000) {
       last_time = millis();
       displayW.showNumberDecEx(displaytime, 0b11100000, true);
  }

  if (millis() - last_time >= 1000) {
       last_time = millis();
        displayW.showNumberDec(displaytime, true);
  }
Отправлено спустя 53 минуты 42 секунды:
Все! Час сидел, разобрался сам. Вот такая конструкция работает как нужно.
if (millis() - last_time > 1000)
{
last_time=millis();
//Serial.println("Таймер 1 " + flag);
if (flag == true)
{
displayW.showNumberDecEx(displaytime, 0b11100000, true);
flag = false;
}
else {
displayW.showNumberDec(displaytime, true);
flag = true;
}

}

cond33
здесь недавно
здесь недавно
Сообщения: 19
Зарегистрирован: 25 мар 2022, 10:32
Имя: Жуков Данил
Страна: РФ
Поблагодарили: 12 раз

Re: Delay и millis

Сообщение cond33 »

У вас второе условие никогда не будет выполнено, т.к. переменная last_time будут переписана в первом условии + они будут выполняться одновременно, если исправить код.

Один из вариантов с несколькими состояниями (переключается каждую секунду):

Код: Выделить всё

if (n == 0) {
n += 1;
displayW.showNumberDecEx(displaytime, 0b11100000, true);
}

if (n == 2) {
n += 1;
displayW.showNumberDec(displaytime, true);
}

if (millis() - last_time >= 1000) {
n  += 1;
last_time = millis();
}
If (n>=4) {
n = 0;
}

Автор темы
Nordis
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 22 июн 2024, 11:55
Имя: Андрей
Страна: Россия
город/регион: Когалым
Благодарил (а): 2 раза

Delay и millis

Сообщение Nordis »

Не пойму, почему не работает?

Код: Выделить всё

 if (key == '#') {          // Нажата клавиша "#" - выполнение операции с введенными данными
         ProcessPmaxpad(inputValue);
         Serial.println(key); 
         startTime = millis();                                              
    } 
    while (key == '#') {
    if (millis() - startTime >= 1000) {
      // код для выполнения после удержания кнопки "#" в течение 1 секунды
      Serial.println("Button # held for 1 second");
      
      break; // выход из цикла
    }
В порт должно прийти сообщение через 1 секунду после того как нажата и удерживается кнопка #. Ничего не происходит. Мои знания на этом все...

cond33
здесь недавно
здесь недавно
Сообщения: 19
Зарегистрирован: 25 мар 2022, 10:32
Имя: Жуков Данил
Страна: РФ
Поблагодарили: 12 раз

Delay и millis

Сообщение cond33 »

Какую библиотеку используете для клавиатуры? Возможно она не поддерживает "длинные" нажатия.

Автор темы
Nordis
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 22 июн 2024, 11:55
Имя: Андрей
Страна: Россия
город/регион: Когалым
Благодарил (а): 2 раза

Delay и millis

Сообщение Nordis »

Точно. Возможно. Буду проверять.

Отправлено спустя 29 минут 33 секунды:
Нашел в библиотеке пример. Судя по коду все таки есть возможность отловить удержание кнопки. Но пока не пойму как...

Код: Выделить всё

void loop() {
    loopCount++;
    if ( (millis()-startTime)>5000 ) {
        //Serial.print("Average loops per second = ");
        //Serial.println(loopCount/5);
        startTime = millis();
        loopCount = 0;
    }

    // Fills kpd.key[ ] array with up-to 10 active keys.
    // Returns true if there are ANY active keys.
    if (kpd.getKeys())
    {
        for (int i=0; i<LIST_MAX; i++)   // Scan the whole key list.
        {
            if ( kpd.key[i].stateChanged )   // Only find keys that have changed state.
            {
                switch (kpd.key[i].kstate) {  // Report active key state : IDLE, PRESSED, HOLD, or RELEASED
                    case PRESSED:
                    msg = " PRESSED.";
                break;
                    case HOLD:
                    msg = " HOLD.";
                break;
                    case RELEASED:
                    msg = " RELEASED.";
                break;
                    case IDLE:
                    msg = " IDLE.";
                }
                Serial.print("Key ");
                Serial.print(kpd.key[i].kchar);
                Serial.println(msg);
            }
        }
    }
}  // End loop

Автор темы
Nordis
здесь недавно
здесь недавно
Сообщения: 4
Зарегистрирован: 22 июн 2024, 11:55
Имя: Андрей
Страна: Россия
город/регион: Когалым
Благодарил (а): 2 раза

Delay и millis

Сообщение Nordis »

Все! Разобрался. Все работает.

Код: Выделить всё

if (keypad.getState() == HOLD) {
      if ((millis() - t_hold) > 100 ) {
          switch (holdKey) {
              case '1':
                  digitalWrite(11, HIGH);
                  delay(200);
                  digitalWrite(11, LOW);
                  break;
              case '2':
                  digitalWrite(12, HIGH);
                  delay(200);
                  digitalWrite(12, LOW);
                  break;
              case '3':
                  digitalWrite(13, HIGH);
                  delay(200);
                  digitalWrite(13, LOW);
          }
          t_hold = millis();
      }
   }
}
Ответить

Вернуться в «Arduino»