Если в телефоне сложно - набирай не на телефоне, а например на телеграфе…
Надеюсь мысль понятна?
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 раз с момента запуска программы и сделает
И ВСЕ.
Вывод - антидребезга в этом коде нет вовсе
ах да, “вишенка на торте”
В этом коде нет чтения состояния кнопки вообще
Прости, невнимательно переносил из скетча - в строке 10:
(timrInterrupt_1, 500) нужно убрать _1,
А после строки 32 добавить:
if(( buttonState_0==HIGH)&&(buttonState_1==HIGH)) {
check=0;}
тут еще очень много надо “убрать и добавить”. По сути кода нет.
Если вы вытаскиваете код из большого проекта - сначала вытащите его, отладьте отдельным скетчем, чтоб компилировался и работал - а потом выложите еще раз.
Чотаржу.
да лан, после рассуждения о чистом Си ничего другого и не ожидал…
Не, слона так не продать. Даже слова «за», оказались «против». Ржунимагу!
А ещё вот это «добивает» - Я не знаю С++, но топлю за него! )))))))) Ой, капец!!!
Здравствуйте!
Вчера не смог вставить код - сегодня, спасибо, подсказали.
#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 теперь задекларированы, более по сути ничего не изменилось. Вернитесь назад и прочитайте мои замечания выше.
И как апофеоз - состояние кнопки вы так и не читаете, что делает обсуждение этого кода бессмысленным.
Не думаю, что вам стоит приходить в третий раз. То, как вы “исправили” это - показывает что вы абсолютно ничего не понимаете в коде. Я бы на вашем месте со стыда удалил бы аккаунт, перерегистрировался под новым, незапятнанным именем, и в дальнейшем вел себя тихо
Эт кто Вам сказал, что нету? Вас обманули
Смотрите сами, п. 5.13.2 на стр. 41 (страница по файлу, а не по надписи на ней)
А чё, разве нельзя написать наоборот? В Ардуино DDRD = B11111110;
а “в С++” определить функцию pinMode? А я и не знал, что нельзя
В строках №42-43 - читает, даже двух кнопок, но легче от это не становится
Азохенвей
это он добавил только что.
Кстати, у меня рядом с его сообщением показывается значочек редактирования, где видно что он правил свой пост дважды. Но при нажатии на эту иконку история правок не видна - это у всех так? Вообще этот значок не имеет смысла, если не видно, что именно автор поправил в посте
с кнопками на прерывании всё не так
Вы не на моём месте.
Да, бываю невнимательным. Считывание состояний расположено в прерываниях, потому и пропустил.
Серьёзный программист, если б заинтересовался, исправил бы это очень быстро. Вас же мой код интересовал только как повод подкинуть Г на вентилятор, по вашему же выражению.
Можете загрузить скетч и убедиться, что всё прекрасно работает.
В дальнейшем все сообщения не по существу обсуждаемой проблемы буду просто игнорить - они не стоят внимания.
скопирую, пока он опять не исправил
Это просто песня - первое чтение делается с первой кнопки, а следующее - со второй. Вот такой “антидребезг” :))))