Меняется значение переменной в millis

Всем привет! Подскажите, пожалуйста, код написан для счёта количества нажатий на кнопку, и когда Serial.println(k) помещаю в условие if (millis()-… , в порт печатаются какие-то непонятные значения.

А когда Serial.println(k) просто в цикле loop, то всё прекрасно работает.

Никак не могу понять с чем это связано??? Кто разбирается прошу помочь…

int e = 0;
bool f = 0;
int flag1 = 0;
int flag2 = 1;
int k = 0;
unsigned long lpk;

void setup() {
  Serial.begin(9600); 
  pinMode(6, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}

void loop() {
  if (!digitalRead(6)) {
    digitalWrite(13, HIGH);
    flag1 = 1;
  } else {
    flag2 = 1;
  }

  if (flag1 + flag2 == 2) {
    e++;
    k = (int)(e / 2);
    flag1 = 0;
    flag2 = 0;
  }



  if (millis() - lpk >= 1000) {
    lpk = millis();
    Serial.println(k);
  }
}```

этот код даже не скомпилируется, строка 22

и что не так в этом коде?
Считать количество нажатий должен, только может двоить-троить от дребезга кнопки

Не понятно почему в порт выводит странные значения k. И это происходит именно тогда, когда Serial.println(k) находится в условии if (millis() - lpk >= 1000) {…

покажите, что там в порт выводится


два раза нажал на кнопку


А если вытащить Serial.println(k) из if, то всё верно выводит

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

Клики считаются по факту, а вывод k делается только раз в секунду. Сколько раз за секунду нажал, столько и получил. Плюс дребезг контактов

Но ведь значение переменной k не зависит от того, как часто я вызываю Serial.print(k)

Если вы “вытаскиваете” Serial.println из условия, то он выполняется каждый проход loop, заполняет полностью буфер отправки и фактически начинает дополнительно работать как задержка в 3 мс (примерно). И эта задержка устраняет дребезг контактов (в вашем случае).

1 лайк

А если взять какую-то вообще простую программку, в которой нет кнопки, то в этом случае тоже что-то непонятное происходит, если Serial.println в if (millis…). А если вытаскиваем то все норм.


не, программирование не твоё, ты не понимаешь элементарных вещей

unsigned long k;

1 лайк

Выше комментарий не дает задуматься, что дело может быть не в дребезге кнопки?

Всё понятное происходит, за секунду k много набирает, больше чем может вместить тип переменной. Суньте k++ внутрь иф и будет хорошо.
Тяжелее всего понимать элементарные вещи - они настолько элементарны, что совершенно непонятны :slight_smile:

Перестаньте употреблять слова “верно”, “неверно”. Они ничего не проясняют, а только запутывают ситуацию.
Программа работает в точности так, как ее написал программист (и, возможно, не так, как он хотел ее написать).
Используйте “я ожидаю увидеть” и “а вместо этого получается”. Тем более, что никто не знает ни первого (чго именно Вы ожидаете от программы), ни второго (что программа Вам выдает).

Зависит. Не может не зависеть.

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

1 лайк