Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
1

Дребезг кнопки

30.04.2017, 19:40. Показов 1670. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Начал писать скетч для автоматизации запуска некоторого электрооборудования (это пока что только набросок) и на раннем этапе обнаружил, что не работает кнопка запуска! Если запускать без учёта дребезга контактов, то всё работает. Пробовал учитывать дребезг без боунса, реализовывал класс для этих целей и вообще много чего пробовал, но результат один: кнопка не работает! Помогите разобраться в чём проблема.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <Bounce2.h>
 
#define rel_1 13 
#define rel_2 12 
#define rel_3 11 
#define rel_4 10 
#define rel_5 9
#define rel_6 8  
#define sound 7  
#define red_button 6 
#define pipi 5 
 
Bounce bouncer = Bounce(red_button,5); 
boolean state = LOW;
 
void setup() {
  // put your setup code here, to run once:
    pinMode(rel_1, OUTPUT);
    pinMode(rel_2, OUTPUT);    
    pinMode(rel_3, OUTPUT);    
    pinMode(rel_4, OUTPUT);   
    pinMode(rel_5, OUTPUT);    
    pinMode(rel_6, OUTPUT);    
    pinMode(sound, OUTPUT);    
    pinMode(red_button, INPUT_PULLUP);
    pinMode(pipi, OUTPUT);
    Serial.begin(16200);
    bouncer.attach(2); // устанавливаем кнопку
    bouncer.interval(5); // устанавливаем параметр stable interval = 5 мс
}
 
void loop() {
     if ( bouncer.update() ) {
    //если считано значение 1
    if ( bouncer.read() == HIGH) {
     //если свет был выключен, будем его включать
     if ( state == LOW ) {
       state = HIGH;
     //если свет был включен, будем выключать
     } else {
       state = LOW;
     }
    
    }
  }
    if(state==HIGH){// включение
      tone(pipi, 300);// частота пищалки и указание на её порт
      delay(200);// задержка
      noTone(pipi);//отключени писка
      delay(200);
      tone(pipi, 300);
      delay(200);
      noTone(pipi);
      digitalWrite(sound, HIGH);//включение диктофона
      digitalWrite(sound, LOW);// сброс диктофона
      digitalWrite(rel_1, LOW); //включение релле 1
      delay(200);
      digitalWrite(rel_2, LOW); 
      delay(200);
      digitalWrite(rel_3, LOW); 
      delay(200);
      digitalWrite(rel_4, LOW); 
      delay(200);
      digitalWrite(rel_5, LOW); 
      delay(200);
      digitalWrite(rel_6, LOW);
      }
   if (state==LOW){// выключение
      tone(pipi, 300);// всё тоже самое но наоборот
      delay(200);
      noTone(pipi);
      delay(200);
      tone(pipi, 300);
      delay(200);
      noTone(pipi);
      delay(200);
      tone(pipi, 300);
      delay(200);
      noTone(pipi);
      digitalWrite(rel_1, HIGH);
      digitalWrite(rel_2, HIGH);
      digitalWrite(rel_3, HIGH);
      digitalWrite(rel_4, HIGH);
      digitalWrite(rel_5, HIGH);
      digitalWrite(rel_6, HIGH);
    }
  }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2017, 19:40
Ответы с готовыми решениями:

Дребезг, прерывание
Немного не селен в прерываниях. подскажите как установить таймер для проверки нажатия кнопки и...

Дребезг кнопки
Добрый день, использую чип EPM3032ALC44, пишу на Verilog. Сильно не пинайте это мой третий проект...

дребезг кнопки
как сделать в протеусе дребезг кнопки?

Предполагаемый дребезг кнопки, pic12f1501
RA0-вход RA2-выход Обработка срабатывания при нажатии в функции interrupt isr. Проблема в...

Дребезг кнопки (а может и нет) ATmega8a
Хоть плачь, не могу понять, то ли в программе неправильно что-то делаю, то ли дребезг виноват,...

17
363 / 346 / 74
Регистрация: 18.03.2015
Сообщений: 1,292
30.04.2017, 19:48 2
Попробуйте после строки 38
C++
1
state = HIGH;
написать
C++
1
delay(200);
0
Почетный модератор
Эксперт по компьютерным сетямЭксперт Windows
28045 / 15778 / 982
Регистрация: 15.09.2009
Сообщений: 67,752
Записей в блоге: 78
30.04.2017, 19:52 3
То есть создать задержку?
0
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
30.04.2017, 20:05  [ТС] 4
Цитата Сообщение от magirus Посмотреть сообщение
То есть создать задержку?
да, создать небольшую задержку при нажатии на кнопку

Добавлено через 7 минут
Цитата Сообщение от Сергей 190 Посмотреть сообщение
Попробуйте после строки 38
C++
1
state = HIGH;
написать
C++
1
delay(200);
Не выходит, и я не понимаю смысла этого действия
0
363 / 346 / 74
Регистрация: 18.03.2015
Сообщений: 1,292
30.04.2017, 20:23 5
Да ... похоже здесь это лишнее.
Интервал пытались увеличить?
0
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
30.04.2017, 20:24  [ТС] 6
Цитата Сообщение от Сергей 190 Посмотреть сообщение
Да ... похоже здесь это лишнее.
Интервал пытались увеличить?
пытался....
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
30.04.2017, 20:33 7
Цитата Сообщение от Alex Csharp Посмотреть сообщение
if ( bouncer.read() == HIGH)
вот здесь нужна задержка
решение в лоб
C++
1
2
3
4
5
6
7
8
9
10
11
12
int oldButton= bouncer.read();// считываем состояние кнопки
delay(200); //ждем
if(oldButton== bouncer.read())// если состояние не изменилось значит нет дребезга
 {
   if (oldButton == HIGH) { // нажата?
      //если свет был выключен, будем его включать
      if ( state == LOW ) {
      state = HIGH;
      //если свет был включен, будем выключать
      } else {
    state = LOW;
 }
дальше не смотрел
как реализована зашита от долгого нажатия кнопки?
0
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
30.04.2017, 20:46  [ТС] 8
ValeryS, безрезультатно. Защиты нет, да там она и не нужна.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
30.04.2017, 20:50 9
Цитата Сообщение от Alex Csharp Посмотреть сообщение
Защиты нет, да там она и не нужна.
ну а если нажал кнопку и уснул свет моргать будет?
Цитата Сообщение от Alex Csharp Посмотреть сообщение
ValeryS, безрезультатно.
что именно? не работает? работает но не так? а как?
0
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
30.04.2017, 20:55  [ТС] 10
Цитата Сообщение от ValeryS Посмотреть сообщение
что именно? не работает? работает но не так? а как?
НИ КАК не работает. Т.е кнопку нажимаешь и должны включаться релле. и ещё кое что, н ничего не происходит, совсем. если не учитывать дребезг, то всё работает.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
ну а если нажал кнопку и уснул свет моргать будет?
Нуу, такого не случится, кнопка не стене у двери.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
30.04.2017, 21:01 11
Цитата Сообщение от Alex Csharp Посмотреть сообщение
если не учитывать дребезг, то всё работает.
я правильно понял что этот вариант в стартовом посте?
0
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
30.04.2017, 21:06  [ТС] 12
Стартовый пост как раз не работает. Для учёта дребезга я тут использую библиотеку боунс.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
30.04.2017, 21:14 13
Цитата Сообщение от Alex Csharp Посмотреть сообщение
Стартовый пост как раз не работает.
приведи рабочий код
покумекаем
0
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
30.04.2017, 21:24  [ТС] 14
Это рабочий код, но он не учитывает дребезг. Пока я тестирую на макетной плате все норм, а вот на реальной кнопке будет дребезг, причём достаточно большой.(Просто такая кнопка. Большая и красная)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 
#define rel_1 13 
#define rel_2 12 
#define rel_3 11 
#define rel_4 10 
#define rel_5 9
#define rel_6 8  
#define sound 7  
#define red_button 6 
#define pipi 5 
 
boolean buttonState;      // состояние кнопки 
boolean buttonPrevState;  // предыдущее состояние кнопки 
boolean State;         // состояние светодиода, релле и всего остального
 
void setup() {
  // put your setup code here, to run once:
    pinMode(rel_1, OUTPUT);
    pinMode(rel_2, OUTPUT);    
    pinMode(rel_3, OUTPUT);    
    pinMode(rel_4, OUTPUT);   
    pinMode(rel_5, OUTPUT);    
    pinMode(rel_6, OUTPUT);    
    pinMode(sound, OUTPUT);    
    pinMode(red_button, INPUT_PULLUP);
    pinMode(pipi, OUTPUT);
    Serial.begin(16200);
 
}
 
void loop() {
   buttonState= digitalRead(red_button);    
  if ( (buttonPrevState == HIGH) && (buttonState == LOW) ) {
    
    // предыдущее состояние кнопки - отжата, а текущее - нажата
    State= !State;            
  }
  
  buttonPrevState= buttonState;  
    if(State==true){// включение
      tone(pipi, 300);// частота пищалки и указание на её порт
      delay(200);// задержка
      noTone(pipi);//отключени писка
      delay(200);
      tone(pipi, 300);
      delay(200);
      noTone(pipi);
      digitalWrite(sound, HIGH);//включение диктофона
      digitalWrite(sound, LOW);// сброс диктофона
      digitalWrite(rel_1, LOW); //включение релле 1
      delay(200);
      digitalWrite(rel_2, LOW); 
      delay(200);
      digitalWrite(rel_3, LOW); 
      delay(200);
      digitalWrite(rel_4, LOW); 
      delay(200);
      digitalWrite(rel_5, LOW); 
      delay(200);
      digitalWrite(rel_6, LOW);
      }
   if (State==false){// выключение
      tone(pipi, 300);// всё тоже самое но наоборот
      delay(200);
      noTone(pipi);
      delay(200);
      tone(pipi, 300);
      delay(200);
      noTone(pipi);
      delay(200);
      tone(pipi, 300);
      delay(200);
      noTone(pipi);
      digitalWrite(rel_1, HIGH);
      digitalWrite(rel_2, HIGH);
      digitalWrite(rel_3, HIGH);
      digitalWrite(rel_4, HIGH);
      digitalWrite(rel_5, HIGH);
      digitalWrite(rel_6, HIGH);
    }
  }
0
363 / 346 / 74
Регистрация: 18.03.2015
Сообщений: 1,292
30.04.2017, 21:26 15
Может и ошибаюсь, но строка 13
C++
1
Bounce bouncer = Bounce(red_button,5);
правильно ли написана и как она согласуется со строкой 10
C++
1
#define red_button 6
На каком пине кнопка, на 5 или 6?
0
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
30.04.2017, 21:34  [ТС] 16
Цитата Сообщение от Сергей 190 Посмотреть сообщение
правильно ли написана и как она согласуется со строкой 10
это задержка, а не номер пина. адрес пина указывается переменной red_button. кнопка на 6 пине. 5 - это задержка в 5 мс.
0
363 / 346 / 74
Регистрация: 18.03.2015
Сообщений: 1,292
30.04.2017, 22:09 17
В Вашем рабочем коде столько задержек, что любой дребезг подавят. Если мало, поставьте еще один delay() в
C++
1
 if ( (buttonPrevState == HIGH) && (buttonState == LOW) ) { ... }
1
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
30.04.2017, 22:20  [ТС] 18
Цитата Сообщение от Сергей 190 Посмотреть сообщение
В Вашем рабочем коде столько задержек, что любой дребезг подавят. Если мало, поставьте еще один delay() в
C++
1
 if ( (buttonPrevState == HIGH) && (buttonState == LOW) ) { ... }
Ну те задержки не имеют к дребезгу не имеют никакого отношения. Если бы не было переменной "посредника", тога да, можно было бы забыть об этой проблеме. И спасибо за ваш последний совет, как я сам до такой простоты не додумался.
Не совсем элегантно, но работает
0
30.04.2017, 22:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2017, 22:20
Помогаю со студенческими работами здесь

Дребезг контактов
Приветствую всех! Есть вопрос на stm32l152 сделал моргалки по кнопке, работает, но присутствует...

Дребезг контактов
Доброго времени суток всем! Подскажите пожалуйста, какие есть возможные аналоговые варианты...

Дребезг аналогового компаратора!
Привет всем! Как, собственно, подавить? Ничего толкового придумать не могу, может кто подскажет...

Дребезг контактов и оптопара
Имеется обычный контактный датчик,через резистор напряжение с него(когда замкнут) подается на...

Энкодер через прерывания / зараза дребезг
Всем привет! Делаю обработчик сигнала с инкрементального двухфазного энкодера . Алгоритм...

Отключение/включение PCINT (решено. Дребезг мешал)
Экспериментирую с прерываниями с помощью кнопок на 328p PINB. Кнопки подключены к земле, на порту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru