Программный антидребезг

Как вставить программый код

Если в телефоне сложно - набирай не на телефоне, а например на телеграфе…
Надеюсь мысль понятна?


int check; //ожидание окончани€ дребезга контактов
bool Trg = LOW; // дребезг контактов окончен
bool buttonState_0; //состо€ние кнопки 0
bool buttonState_1; //состо€ние кнопки 1

void setup() {
pinMode (button_0, INPUT_PULLUP);
pinMode (button_1, INPUT_PULLUP);
Timer1.initialize(500);  // инициализаци€ таймера 1, период 500 мкс
Timer1.attachInterrupt(timerInterrupt_1, 500);
}

void loop() {
if ((Trg == HIGH)&&(buttonState_0 == LOW)&&
(buttonState_1 == HIGH)) {
//код, исполн€емый при нажатии кн0
Trg = LOW;
}
else if ((Trg == HIGH)&&(buttonState_0 == HIGH)&&
(buttonState_1 == LOW)) {
//код, исполн€емый при нажатии кн1
Trg = LOW;}
else if ((Trg == HIGH)&&(buttonState_0 == LOW)&&
(buttonState_1 == LOW)) {
//код, исполн€емый при одновременном нажатии 2-х кнопок
Trg = LOW;  
}
}

void timerInterrupt() {
check ++;
if (check == 150) {
Trg = HIGH;    
} 
}

и как, работает?
У меня даже не компилируется

Ошибки

  • переменные button_0 button_1 не декларированы
  • переменные в прерывании не обьявлены волатильными

Логика
прерывание таймера вообще никак не привязано с нажатию кнопки - оно тупо отсчитает 150 раз с момента запуска программы и сделает

И ВСЕ.

Вывод - антидребезга в этом коде нет вовсе

ах да, “вишенка на торте” :slight_smile:
В этом коде нет чтения состояния кнопки вообще :slight_smile:

Прости, невнимательно переносил из скетча - в строке 10:
(timrInterrupt_1, 500) нужно убрать _1,
А после строки 32 добавить:
if(( buttonState_0==HIGH)&&(buttonState_1==HIGH)) {
check=0;}

тут еще очень много надо “убрать и добавить”. По сути кода нет.
Если вы вытаскиваете код из большого проекта - сначала вытащите его, отладьте отдельным скетчем, чтоб компилировался и работал - а потом выложите еще раз.

Чотаржу.

5 лайков

да лан, после рассуждения о чистом Си ничего другого и не ожидал…

Не, слона так не продать. Даже слова «за», оказались «против». Ржунимагу!
А ещё вот это «добивает» - Я не знаю С++, но топлю за него! )))))))) Ой, капец!!!

Здравствуйте!
Вчера не смог вставить код - сегодня, спасибо, подсказали.

#include <TimerOne.h>

int check; //ожидание окончания дребезга контактов
bool Trg = LOW; // дребезг контактов окончен
bool buttonState_0; //состояние кнопки 0
bool buttonState_1; //состояние кнопки 1

int A=5; //отображает переключение, до первого
//нажатия равно 5

#define button_0 12 // кнопка переключения режимов
#define button_1 11 // кнопка переключения режимов

void setup() {
pinMode (button_0, INPUT_PULLUP);
pinMode (button_1, INPUT_PULLUP);
Timer1.initialize(500);  // инициализация таймера 1, период 500 мкс
Timer1.attachInterrupt(timerInterrupt, 500);
Serial.begin(9600);
}

void loop() {
if ((Trg == HIGH)&&(buttonState_0 == LOW)&&
(buttonState_1 == HIGH)) {
A=0; // отображает переключение кнопкой 0
Trg = LOW;
}
if ((Trg == HIGH)&&(buttonState_0 == HIGH)&&
(buttonState_1 == LOW)) {
A=1; // отображает переключение кнопкой 1
Trg = LOW;}
if ((Trg == HIGH)&&(buttonState_0 == LOW)&&
(buttonState_1 == LOW)) {
A=2; // отображает переключение двумя кнопками
Trg = LOW;  
}
Serial.println(A);
}

void timerInterrupt() {
check ++;
buttonState_0=digitalRead(button_0);
buttonState_1=digitalRead(button_1);
if ((buttonState_0 == HIGH)&&(buttonState_1 == HIGH)) {
check = 0;
}
if (check == 150) {
Trg = HIGH;    
} 
}

Вместо А= подставляется нужная функция.
Если не нужно срабатывания на нажатие 2 кнопок, то в строке 44 check можно приравнять к 10 (5мс).

“и второй раз закинул он невод…”

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

И как апофеоз - состояние кнопки вы так и не читаете, что делает обсуждение этого кода бессмысленным.

Не думаю, что вам стоит приходить в третий раз. То, как вы “исправили” это - показывает что вы абсолютно ничего не понимаете в коде. Я бы на вашем месте со стыда удалил бы аккаунт, перерегистрировался под новым, незапятнанным именем, и в дальнейшем вел себя тихо

Эт кто Вам сказал, что нету? Вас обманули :frowning:

Смотрите сами, п. 5.13.2 на стр. 41 (страница по файлу, а не по надписи на ней)

А чё, разве нельзя написать наоборот? В Ардуино DDRD = B11111110; а “в С++” определить функцию pinMode? А я и не знал, что нельзя :frowning:

В строках №42-43 - читает, даже двух кнопок, но легче от это не становится :frowning:

Азохенвей :frowning:

это он добавил только что.

Кстати, у меня рядом с его сообщением показывается значочек редактирования, где видно что он правил свой пост дважды. Но при нажатии на эту иконку история правок не видна - это у всех так? Вообще этот значок не имеет смысла, если не видно, что именно автор поправил в посте

с кнопками на прерывании всё не так

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

скопирую, пока он опять не исправил :slight_smile:
Это просто песня - первое чтение делается с первой кнопки, а следующее - со второй. Вот такой “антидребезг” :))))