Подскажите как работает программа для кнопки
- Войдите на сайт для отправки комментариев
Я новичок.
Задача была такой, при нажатии на кнопку светодиод должен гореть 2с (но не важно как нажимали на кнопку, многократно, или долгим удержанием).
я нашел скетч про кнопку. Считаем его оригиналом.
void setup() { Serial.begin(9600); pinMode(3, INPUT_PULLUP); } bool flag = false; uint32_t btnTimer = 0; void loop() { // читаем инвертированное значение для удобства bool btnState = !digitalRead(3); if (btnState && !flag && millis() - btnTimer > 100) { flag = true; btnTimer = millis(); Serial.println("press"); } if (btnState && flag && millis() - btnTimer > 500) { btnTimer = millis(); Serial.println("press hold"); } if (!btnState && flag && millis() - btnTimer > 500) { flag = false; btnTimer = millis(); //Serial.println("release"); } }
Я его немного подогнал для своей задачи
int LED = 4; int BUT = 3; boolean flag = false; unsigned long btnTimer = 0; void setup() { Serial.begin(9600); pinMode(BUT, INPUT_PULLUP); pinMode(LED, OUTPUT); digitalWrite(LED, HIGH); } void loop() { // читаем инвертированное значение для удобства boolean btnState = !digitalRead(BUT); if (btnState && !flag && millis() - btnTimer > 200) { flag = true; digitalWrite(LED, LOW); btnTimer = millis(); Serial.println("press"); } if (btnState && flag && millis() - btnTimer >= 2000 && digitalRead(BUT) == LOW) { digitalWrite(LED, HIGH); Serial.println("press hold"); } if (!btnState && flag && millis() - btnTimer >= 2000) { flag = false; digitalWrite(LED, HIGH); Serial.println("release"); } }
Как работает условие на 20 строке в оригинальном скетче? Она подавливает дребезг контактов?
Если кнопка нажата и флаг не поднят и Timer>100 (где Timer=0 или это другое значение после нажатия кнопки и 100 миллисекунд).
И 29 строчка в измененном скетче. Кнопка нажата и флаг поднят и светодиод горит и прошло 2с, то светодиод гасим и переходим 36 строчке проверяем условие и опускаем флажок и еще раз гасим светодиод(условно)? Но если в 29 строке написать что будем гасить светодиод и опускать флажок, то светодиод будет гореть столько сколько будем держать кнопку +2с. Почему?
Помогите разобраться.
ой в 20 строке просто защита от дребезга
Для данной задачи защита от дребезга не нужна, поскольку светодиод должен гореть 2с и не важно как нажимали на кнопку, многократно, или долгим удержанием.
TC нужен программный одновибратор, значит надо обрабатывать не только нажатие кнопки но и отжатие и если есть отжатие и светодиод не горит взводить флаг готовности обрабатывания нажатия кнопки
Поставленная задача решается одной строчкой кода. Оператором if проверяем нажатие кнопки и если кнопка нажата, то включаем светодиод , ждем 2 секунды и выключаем. Не надо ничего больше. Гореть светодиод будет пока нажата кнопка, потому что цикл после окончания будет запускаться снова. Условия повторного нажатия на кнопку изначально не было.
RE должен гореть 2с (но не важно как нажимали на кнопку, многократно, или долгим удержанием)
Зажечь, делэй 2секунды, погасить. Будет гореть 2 секунды, что бы с кнопкой не делали.
секундомер нужен и тазик с водой - иначе можно пережечь :))))))))))))
секундомер нужен и тазик с водой - иначе можно пережечь :))))))))))))
Проблема в том вместо светодиода будет стоять реле с электрозамком. И если на него долго подовать питание он может сгореться, а зная своих детей которые будут нажимать его то лучше перестраховаться. По поводу delay я пробовал все отлично отрабатывает, но я хотел без него попробывать сделать.
Да если вы знаете как одной строчкой if написать код чтоб так работало то подскажите. Да еще в 29 строке ошибку нашел
Если только для управления замком, то и огород городить нечего. Одновибратор на двух транзисторах подойдёт, но раз очень хочется на Arduino то в качестве кнопки использовать Reset, тогда
И не обращать внимания что при включении будет срабатывать, можно назвать это контролем работы.
Можно без delay, на этой ардуине ещё будут другие задачи выполнять rfid висеть, ethernet и реле света. Ложное срабатывание недопустимо, т.к. надо выходить на улицу и открывать и закрывать калитку( после нажатия кнопки замок надо заново взвести (условно говоря)).
Но я спрашивал почему в условие строка 29
if (btnState && flag && millis() - btnTimer >= 2000 && digitalRead(LED) == LOW)
{
digitalWrite(LED, HIGH);
Serial.println("press hold");
flag = 0;
}
Кнопка при долгом удержании больше 2с светодиод не выкл
И постоянно hold печатает?
можно, вы умеете флагами пользоваться? Если да, то напишите программу счетчик от 0 до 10 на миллис с шагом 500 мсек. Потом к счетчику флаги прикрутить не сложно - это пока самый простой вариант для вас. Ну и шаг счетчика под задачу потом настроить.
UPD. byte count; // используйте эту переменную для счетчика.
а я же вам уже выше писал, надо отслеживать отжатие кнопки и пока она не отжата и повторно не нажата (после 2 секундной выдержки) флаг возможности повторного запуска одновибратора держать в OFF
как то так, в лоб, DetSimen при желании поправит на правильно и красиво:
Как вы планируете справится с RFID и Ethernet, если только с кнопкой проблем на целый день?
думает, ему на форумах все напишут... вот ua6em уже начал
с эзернетом думаю никак, тут некоторые (не буду пальцем показывать) 4-ре года на форуме и то не замахиваются )))
А защиту от дребезга контактов я не реализовал, это уже сам пусть попробует...
Rfid программу нашел более менее разобрался и с кнопкой тоже получилось все, только не совсем понимаю почему с флагом сразу не работает в 29 строке условие или совпадение условий происходит в 29 строке.
Ethernet только удаленное выкл вкл света и открытие калитки через приложение arducontroller тоже попробовал нашильде 5100 заработало, но w5500 пока не понятно.
Я не прошу за меня код писать, я прошу мойже код прокомментировать, с той целью чтоб убедиться, правильно ли я его понимаю.
и что не так в 29 строке?
Не треснет ничего?
Просто не пишите код, который потом не можете понять без посторонней помощи. Это сэкономит кучу времени всем.
мой код точно работает, иногда подглючивает из-за дребезга кноки
Гораздо проще Вам самим прокомментировать свой код.
А если комментарии не будут совпадать с кодом, Вам на это укажут.
и что не так в 29 строке?
Если условие выполняется стр 23
То выполняется флаг опускаем и светодиод гасим при удерживании кнопки в теории, на практике кнопку держим светодиод горит, как только отпускаем сведоид гасится в течении 2с
Как тогда учиться))) и разбираться
Гораздо проще Вам самим прокомментировать свой код.
А если комментарии не будут совпадать с кодом, Вам на это укажут.
Ок
Может так попробуйте
Спасибо всем за помощь