Помогите с кнопкой, проект горит.
- Войдите на сайт для отправки комментариев
Всем привет. Имеется аналогавая кнопка (значение которой 173). задача На одну кнопку повесить две функции. А именно кратковременно нажали и на pin13 сработало реле и осталось в сработке. Второй раз нажали и реле выключилось. С этим вроде разобрался, получилось следующие
int analogPin = 0; int rknop; int ledPin = 13; boolean lastButton = LOW; boolean ledOn = false; void setup () { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { rknop=analogRead(A0); if(rknop <185 && rknop>165 && lastButton == LOW) { ledOn = !ledOn; lastButton = HIGH; } else { lastButton = (rknop <185 && rknop>165); } digitalWrite(ledPin, ledOn); delay(200); }
Вторая же функция:это нажали эту же кнопку и держим, скажем 5 сек и у нас на pin1 сработала оптопара; отпустили кнопку, а оптопара продолжает замыкать контакт. Нажали снова кнопку, подержали 5 сек и оптопара на pin1 отключилась. Одним словом тоже самое что и выже только сработка по удержанию тойже кнопки и управляющий pin другой.
Надеюсь смог объяснить что хочу сделать. не могу разобраться со второй функцией. Количество кнопок ограничено и поэтому не могу добавить ещё одну для упрощения задачи. Хочу планшет в машину ставить, всё разобрал, почти собрал, загвостка только в этом. Выручайте новичка братцы, уже не знаю где и копать
что значит аналоговая значение 173?
Как я понял подключаете кнопку последовательно с резистором одним концом к Ах, другим к +5.
Читаете на аналоговом порту значение 173 при нажатой кнопке.
у кнопки есть два события 1- нажали 2-отпустили.
создайте переменную и когда нажали (событие1 ) начинайте ее увеличивать. (можно таймер запускать)
когда отпустили останавливаем. читаем значение переменной или таймера, обнуляем, в зависимости от значения делаем что надо
Совершенно верно, кнопка через резистор одним концом подключена к А0, другим к +5В.
Про переменную я тоже думал, но никак не соображу как быть с таймером, как его запустить. Чтоб переменная увеличивалась на значение допустим раз в пол секунды
Используйте millis();
Суть такова. Объявляете переменную CurrentTime = millis();
В CurrentTime будет храниться текущее время в миллисекундах с момента старта микросхемы (подробнее в справочнике) Потом в каждом конце цикла опроса кнопки в другую переменную скажем lastTime записываете значение CurrentTime
lastTime = CurrentTime;
после в третью переменную вычисляем разницу между lastTime и CurrentTime а именно когда нажалась кнопка. Скорее нужно в lastTime записывать штамп времени в момент нажатия кнопки. Тогда будет считаться время ее нажатия. differentTime = lastTime - CurrentTime;
Это простая конструкция таймера без delay на основе millis. Подробный пример в примере IDE "blinkWithoutDelay"
Потом просто.
If (differentTime > 5000) бла бла бла;
Хотя стоит учесть что срабатывание функции записи штампа времени в переменную должно быть олнократным. Наверное я усложняю, что стоит добавить переменную - флаг для того чтобы в lastTime запись момента времени когда будет нажата кнопка была однократной. Иначе расстояние между lastTime и CurrentTime будет несколько миллисекунд. Так как при вашей if функции определения значения с пина кнопки будет срабатывать каждый цикл.