Помогите с кнопкой, проект горит.

Morfey86rus
Offline
Зарегистрирован: 20.12.2015

Всем привет. Имеется аналогавая кнопка (значение которой 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 другой.

Надеюсь смог объяснить что хочу сделать. не могу разобраться со второй функцией. Количество кнопок ограничено и поэтому не могу добавить ещё одну для упрощения задачи. Хочу планшет в машину ставить, всё разобрал, почти собрал, загвостка только в этом. Выручайте новичка братцы, уже не знаю где и копать

MacSim
Offline
Зарегистрирован: 28.11.2012

что значит аналоговая значение 173?

Как я понял подключаете кнопку последовательно с резистором одним концом к Ах, другим к +5.

Читаете на аналоговом порту значение 173 при нажатой кнопке.

у кнопки есть два события 1- нажали 2-отпустили.

создайте переменную и когда нажали (событие1 ) начинайте ее увеличивать. (можно таймер запускать)

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

 

Morfey86rus
Offline
Зарегистрирован: 20.12.2015

Совершенно верно, кнопка через резистор одним концом подключена к А0, другим к +5В.

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

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Используйте 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 функции определения значения с пина кнопки будет срабатывать каждый цикл.