Непонятки с Serial.println

arz_serg
Offline
Зарегистрирован: 05.04.2019

Доброго времени суток, друзья!

Будьте так любезны, поясните следующее явление:

Имеем простенький скетч:

#define BTN 2
#define LED 3
#define SS_PIN 10

byte count = 0;     // Счетчик нажатий кнопки
byte last_BTN = 0;     // Последнее положение кнопки
byte curr_BTN = 0;     // Текущее положение кнопки


void setup() {

  pinMode(BTN,INPUT_PULLUP);
  pinMode(LED,OUTPUT);

  Serial.begin(9600);

}

void loop() {
  
  curr_BTN = !digitalRead(BTN);     // Считываем положение кнопки: 0 - не нажата, 1 - нажата
  
  if (curr_BTN > last_BTN) {    // Если кнопка нажата
    digitalWrite(LED,HIGH);    // Включаем светодиод
    count++;    // Прибавляем одно нажатие
    last_BTN = 1;    // Устанавливаем положение кнопки в "НАЖАТО"    
  }

  if (curr_BTN < last_BTN) {    // Если кнопка отжата
    digitalWrite(LED,LOW);     // Выключаем светодиод
    last_BTN = 0;    // Устанавливаем положение кнопки в "НЕ НАЖАТО"     
  }

  Serial.println(count);     // Выводим кол-во нажатий
   
}

В таком виде всё работает прекрасно, нажатия считаются правильно, но напрягал непрерывный вывод в serial. Поэтому я взял и строчку Serial.println(count); засунул в первый if, сразу после строчки count++. И тут всё стало работать неправильно.

Если в первом случае 10 нажатий давало в мониторе 10, то после переноса вывода 10 нажатий кнопки стали выводить в итоге в монитор 15-16. Причем кол-во нажатий может прибавиться при отпускании кнопки или дать сразу +3 за одно нажатие

Так вот, вопрос: как это связано с положением строки Serial.println()? Почему если она вне условия if, то всё работает правильно, а под if-ом появляются ложные срабатывания нажатий? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Гуглите по словам "дребезг кнопки". Проблема именно в этом. Когда println так, как сейчас, он вызывает задержку, а засунув туда - Вы её убираете. С дребезгом нужно бороться, разумеется не с помощью println, а другими средствами.

kostyamat
Offline
Зарегистрирован: 16.11.2017

добавить паралельно кнопке конденсатор на 220нФ. вставить delay(50); Думаю, проблемы уйдут.

arz_serg
Offline
Зарегистрирован: 05.04.2019

ЕвгенийП пишет:

Гуглите по словам "дребезг кнопки". Проблема именно в этом. Когда println так, как сейчас, он вызывает задержку, а засунув туда - Вы её убираете. С дребезгом нужно бороться, разумеется не с помощью println, а другими средствами.

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

VladimirTsibrov
Offline
Зарегистрирован: 05.03.2019

arz_serg пишет:

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

Почему? Как вы это сами для себя представляете?

arz_serg
Offline
Зарегистрирован: 05.04.2019

VladimirTsibrov пишет:

Почему? Как вы это сами для себя представляете?

честно говоря, я без понятия, просто вот ему поверил на слово:

https://youtu.be/3UwgMAdV4xQ?t=357

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ой, зря вы это написали :) 

запомните, к автору видео тут крайне негативное отношение.

и это, верить никому нельзя... мне можно :)

arz_serg
Offline
Зарегистрирован: 05.04.2019

xDriver пишет:

ой, зря вы это написали :) 

запомните, к автору видео тут крайне негативное отношение.

и это, верить никому нельзя... мне можно :)

ну я тут новенький, поэтому про внутренние терки не вкурсе )

т.е. нет там никакого "встроенного резистора"?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

резистор есть, но проблему он не решает.

sadman41
Offline
Зарегистрирован: 19.10.2016

Резистор не дает входу "болтаться" в воздухе когда контакт разомкнут, ловя случайные помехи, но законному механическому замыканию-размыканию (что и образуется при дребезге контактов) он не препятствует.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

arz_serg пишет:

ЕвгенийП пишет:

Гуглите по словам "дребезг кнопки". Проблема именно в этом. Когда println так, как сейчас, он вызывает задержку, а засунув туда - Вы её убираете. С дребезгом нужно бороться, разумеется не с помощью println, а другими средствами.

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

тут даже осциллограммы кто-то выгладывал, по дребезгу при таком потключении

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

arz_serg пишет:

VladimirTsibrov пишет:

Почему? Как вы это сами для себя представляете?

честно говоря, я без понятия, просто вот ему поверил на слово:

https://youtu.be/3UwgMAdV4xQ?t=357

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

По дребезгу кнопок у него в последующих уроках кстати...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arz_serg пишет:

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

Судя по этой фразе - нет, Вы не в курсе про дребезг. гуглите, как я Вам сказал. Например, https://drive.google.com/open?id=0B9r7cRXQ4DU4TVJzQVhOMmtCc00

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arz_serg пишет:

честно говоря, я без понятия, просто вот ему поверил на слово:

Верить можно только в Бога. Всё остальное нужно понимать. Это видео записано безграмотным человеком.

arz_serg пишет:

т.е. нет там никакого "встроенного резистора"?

Почему, есть. Но этот резистор совсем про другое. Он не позволяет пину ловить помехи. К дребезгу он не имеет никакого отношения.

bwn
Offline
Зарегистрирован: 25.08.2014

arz_serg пишет:

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

Это в "Песочницу" и Деду, в коллекцию.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:
всё скидываемся ему на магарыч

Му уже скинулись. Вон сколько ляпов в его говнокоде нашли

Ворота пишет:
 #3#26#29#31#52#67

и совершенно бесплатно!

Ещё бы исправлял.