подавление дребезга без делай и милис

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Irinka пишет:

 я программно проверяю на дребезг через 50-100 мкс

if (digitalRead(buttonPin)){
  delay(100);
  if (digitalRead(buttonPin)){
  нажата 
  }
}

это не микро, а миллисекунды. 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

DetSimen пишет:

Irinka пишет:

 я программно проверяю на дребезг через 50-100 мкс

if (digitalRead(buttonPin)){
  delay(100);
  if (digitalRead(buttonPin)){
  нажата 
  }
}

это не микро, а миллисекунды. 

да-да, спасибо.

nik182
Offline
Зарегистрирован: 04.05.2015

В #50 сообщении диод нужен для быстрой перезарядки конденсатора при отпускании кнопки. Вообще микросхема для микроконтроллера ненужна. Она выполняет роль триггера, а большинство цифровых входов имеют встроенный. R2 защищает кнопку от нагара контактов. Я б поставил 100 Ом и не ставил диод - он почти не влияет на работу схемы.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

DetSimen пишет:

это не микро, а миллисекунды. 

Срочно зовите старого дядьку онкЕля !  Он ее в свою книгу мести запишет :)

Green
Offline
Зарегистрирован: 01.10.2015

Зовите крутых). https://www.youtube.com/watch?v=zNCrBJZPIm4

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

brokly пишет:

DetSimen пишет:

это не микро, а миллисекунды. 

Срочно зовите старого дядьку онкЕля !  Он ее в свою книгу мести запишет :)

 

https://www.youtube.com/watch?v=I5mNfhsimfA

Со 2 минуты  58 секунды)))

Dr_grizzly
Dr_grizzly аватар
Offline
Зарегистрирован: 07.12.2015

Всем привет )) Искал решения дребезга кнопки, наткнулся на эту тему ))

Хочу показать мой код решения. Громоздкий вроде код, но мне кажется довольно рабочий

if ((digitalRead(Dt7Pin) == HIGH) && (stD7==false) && (readD7==true)) {
  stD7=true; // включили счетчик
  timestartD7=millis(); //  запоминаем когда было первое нажатие
}

if (stD7==true) {
  if (digitalRead(Dt7Pin)==HIGH) { // пока есть сигнал от кнопки 
   timestopD7=millis(); // записываем текущее значение таймера    
  }else {
    D7_ON=false;
    stD7=false; // отключаем счетчик
    timestopD7=millis();
    timestartD7=millis();
  }  
}

if ((stD7==true) && (timestopD7-timestartD7>=timeD7_on)) {
  D7_ON=true;// полезное действие.
  stD7=false;
  readD7=false;
  timestopD7=millis();
  timestartD7=millis();  
}

if (D7_ON) 
{
........ // что-то делаем когда нажали кнопку
}

readD7 - это флаг, который поднимаем в процессе для разрешения чтения данных с датчика/кнопки

Doooh
Offline
Зарегистрирован: 10.08.2017

Не смущает название темы? :)

mrtester
Offline
Зарегистрирован: 26.02.2015
#define buttonPin  2     // номер входа, подключенный к кнопке
#define ledPin  13      // номер выхода светодиода
// переменные
boolean buttonState = 0; // переменная для хранения состояния кнопки
byte bState=0;  // переменная для хранения дребезга
void setup() {
  // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin, OUTPUT);      
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT); 
  digitalWrite(buttonPin, HIGH); 
  //Serial.begin(9600);  
}
void loop(){
  // считываем значения с входа кнопки
  if (digitalRead(buttonPin) == LOW) {
    bState++;
    if (bState==3) buttonState = HIGH; 
  }
  else {
    buttonState = LOW;
    bState = 0;  
  }        
  digitalWrite(ledPin, buttonState);  
  //Serial.print("States ");
  //Serial.println(buttonState);
}

 

mrtester
Offline
Зарегистрирован: 26.02.2015
#define buttonPin  2     // номер входа, подключенный к кнопке
#define ledPin  13      // номер выхода светодиода
// переменные
boolean buttonState = 0;         // переменная для хранения состояния кнопки
byte bState = 0;  // переменная для хранения дребезга
boolean flagState = 0;
void setup() {
  // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin, OUTPUT);      
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT); 
  digitalWrite(buttonPin, HIGH); 
  //Serial.begin(9600);  
}
void loop(){
  // считываем значения с входа кнопки
  if (digitalRead(buttonPin) == LOW) {
    bState++;
    if (bState==3 && flagState==0) {
      buttonState =! buttonState; 
      flagState = 1;
    }
  }
  else {
    bState = 0; 
    flagState = 0; 
  }        
  digitalWrite(ledPin, buttonState);  
  //Serial.print("States ");
  //Serial.println(buttonState);
}

 

Morroc
Offline
Зарегистрирован: 24.10.2016

С этого и начали. Вы не знаете сколько в обще случае loop() выполняется, поэтому решение в одном случае может работать нормально, а в другом нет. В чем смысл игнорировать millis и писать такое для меня загадка ) как впрочем и подключение целых микросхем с обвязкой ради подавления дребезга (не, ну если в космос запускать или кнопки в агрессивной среде - хз).

mrtester
Offline
Зарегистрирован: 26.02.2015

 Вы не знаете сколько в обще случае loop() выполняется не имеет значения

#define buttonPin  2   // номер входа, подключенный к кнопке
#define ledPin  13   // номер выхода светодиода
// переменные
boolean buttonState = 0;  // переменная для хранения состояния кнопки
byte bState = 0;  // переменная для хранения дребезга

void setup() {
  // инициализируем пин, подключенный к светодиоду, как выход
  pinMode(ledPin, OUTPUT);      
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT); 
  digitalWrite(buttonPin, HIGH);  
}
void loop(){
  // считываем значения с входа кнопки
  if (digitalRead(buttonPin) == LOW) {
    if (bState==0) { buttonState =! buttonState; } // действие buttonState=0;
    bState = 1;
  }
  else {
    if (bState!=0) bState++; 
    if (bState==4) { bState=0; } // действие buttonState-1;
  }        
  digitalWrite(ledPin, buttonState);  
}

 

Green
Offline
Зарегистрирован: 01.10.2015

Привязываться к времени выполнения loop вообще то дурной тон. Программа должна быть универсальной. Сегодня она на 16 мгц, а завтра на 256 гкц-ах и чё? Имею одно ус-во с лупом в 1 сек, но и с 1 мкс она тоже будет работать.

b707
Offline
Зарегистрирован: 26.05.2017

mrtester пишет:

не имеет значения


ээээээ да вы, оказывается, сами не понимаете, как этот код работает? А мы-то с вами как со взрослым...
Длительность оборота луп имеет значение в этом коде - именно она и определяет время " дребезга" в этом алгоритме. Если вы этого не видите, то дальше с вами и говорить не о чем.

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

Irinka пишет:

https://www.youtube.com/watch?v=I5mNfhsimfA

Со 2 минуты  58 секунды)))

стало интересно, как будет наказывать, как петух в курятнике?

Green
Offline
Зарегистрирован: 01.10.2015

Знакомый рассказывал случай на экскурсии, как бы не в Сухумском обезьяньем питомнике, что ли. В общем, они на лестнице, а внизу обезьяны. И вот девки говорят, смотри, смотри... А внизу такая картина: одна обезьяна чешет другую, самца. А взади третья, кидает камешки в него. Ну тот не поймёт откуда, почему, оглядывается... Когда эта взяла камешек побольше и видать очень больно попала в обезьяна. Тот увидел, понял кто это, погнался, догнал, поставил в соответствующую позу и долбит... Девки сразу переключились на другую тему.)

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

Кстати о дребезге, смотрим тут, кнопку держим до погасания светодиода...
далее снимаем маркировку со строки 2 и повторяем...
эмулятор показывает минимальное время задержки на дребезг 3 миллисекунды
...удивительное рядом но оно запрещено...

https://wokwi.com/projects/331442316603556435

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

ua6em пишет:

Кстати о дребезге, смотрим тут, кнопку держим до погасания светодиода...
далее снимаем маркировку со строки 2 и повторяем...
эмулятор показывает минимальное время задержки на дребезг 3 миллисекунды
...удивительное рядом но оно запрещено...

https://wokwi.com/projects/331442316603556435

Как выясняется, по умолчанию, в Wokwi есть имитация дребезга. 

Цитата:
When you press physical pushbutton, the circuit opens and closes tens or hundreds of times. This phenomenon is called Bouncing. This happens because of the mechanical nature of pushbuttons: when the metal contacts come together, there's a brief period when the contact isn't perfect, which causes a series of rapid open/close transitions.

Wokwi simulates button bouncing by default. You can disable bouncing simulation by setting the "bounce" attr to "0"
 

Поэтому и срабатывает второй раз на отпускании. 

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

в реальной кнопке время дребезга поболее будет, пробегали тут осциллограммы когда-то