Долгое нажатие кнопки (Не резистивные кнопки!)

Тема в разделе "Arduino & Shields", создана пользователем lipov-andrey, 25 авг 2016.

  1. lipov-andrey

    lipov-andrey Нуб

    Доброй ночи друзья и коллеги!

    Ситуация в следующем работаю с каном авто, все кнокпи работают по кану.

    Хочу подключить их чтобы управлять Ардуинкой в своих личных целях.

    Имеется UNO и Atmega 2450.

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

    то есть например нажимаю 1 раз кнопку звук + и приходит 2-3 одинаковых сигнала в кан пусть будет 12345.

    То есть если жму долго он так и будет кидать в лог:

    12345 12345 12345 12345 12345 12345

    Вот мне нужно при удерживании скажем более 8 секунд сделать чтобы он выполнял другое действие.

    Пробовал millis() ставить, но он к сожалению не обнуляется.

    Пока что работает только один мой вариант по количеству, то есть если пришло в лог более 8 одинаковых сигналов 12345 то выполнять долгое действие, но это не очень удобно, так как счетчик не обнуляется а постоянно по кругу идут.

    Или может подскажите как обнулять счетчик если допустим между действиями прошло более скажем 3 секунд.

    Заранее благодарен, Андрей.
     
  2. qwone

    qwone Гик

    Код (C++):
    const int buttonPin=2;// вывод кнопки 0 нажата 1 нет
    uint32_t last_millis; // переменные: последний  millis

    uint8_t botton(){
      if (digitalRead(buttonPin) == 1){ // кнопка не нажата    
         last_millis = millis();
         return 0;}
       delay(30);
       while (digitalRead(buttonPin) == 0);
       delay(30);
       if (last_millis+65 > millis()){ // ложное срабатывание
         last_millis = millis();
         return 0;}
       if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
          last_millis = millis();
         return 1;}
       last_millis = millis(); // длинное нажатие больше 0.30 сек
       return 2;
    };


    void setup()
    {
      pinMode(buttonPin, INPUT_PULLUP); // вывод на ввод с подтягивающим резистром
      last_millis = millis();
    }
    void loop()
    {
       switch (botton()) {
          case 1:  Serial.println("Short press");
             break;
         case 2:  Serial.println("Long press");
             break;
       }
    }
     
    lipov-andrey нравится это.
  3. lipov-andrey

    lipov-andrey Нуб

    Спасибо вам большое, но я с таким кодом мозг сломаю :D:D:D
    Попроще нечего нет?

    Вот пример моего кода, хочется что то маленькое и простое.
    Код (C++):

    if(rpId == 410) //Нажат  кнопка след. трек >>
      {
    irsend.sendNEC (0x11E937,32);
    Serial.println("Next track");
    }  
    Что то типа :
    Код (C++):

    if(rpId == 410) //Нажат  кнопка след. трек >>
      {
    NexTreck = NexTreck+ 1;
    if (NexTreck > 5)
    {
    irsend.sendNEC (0x11E937,32); //Нажат  кнопка след. трек долго
    Serial.println("Next Long track");
    }
    irsend.sendNEC (0x11E937,32);
    Serial.println("Next track");
    }  
     
  4. qwone

    qwone Гик

    А не получится . Ну нельзя запихать в маленькую туфельку большую лапу. То что легко для пользователя кнопку оказывается сложно для программиста. Компьютерная мышка тоже проста. А вот для ее поддерки нужена Винда.
     
  5. lipov-andrey

    lipov-andrey Нуб

    Подожди, но вот этот вариант же работает, просто тут срабатывание каждый 8ое нажатие, не важно долгое или одиночное.
    Как то можно выставить промежутки сброса, чтобы он высчитывал промежутки и сбрасывал их?
    Нажал кнопку один раз и отпустил, если задержка более скажем 0.1 счетчик сбрасывается, если задержки нет то после получения более 8 секунд выполняется лонг и опять сброс счетчика. Или что то в этом роде.

    Код (C++):
    if(rpId == 410) //Нажат кнопка след. трек >>
    {
    nextrack = nextrack++
    if (nextrack > 8)
    {
    irsend.sendNEC (0x15D937,32);
    Serial.println("Next LOND press track");
    }
    irsend.sendNEC (0x11E937,32);
    Serial.println("Next track");
    }
     
  6. qwone

    qwone Гик

    У вас ИК пульт. При нажатии на кнопку пульта приходят сигналы. И вы хотите , что бы при долгом нажатии, пришло 8 одинаковых сигналов, которые будут опознаваться как долгое нажатие?
     
  7. lipov-andrey

    lipov-andrey Нуб

    Ик выполняет действия после получения нужного сигнала, тут он вообще не причем.
    Допустим я нажимаю один раз на кнопку и сразу же отпускаю: приходит один сигнал 123213213
    Я нажимаю и удерживаю кнопку и приходит:
    123213213
    123213213
    123213213
    123213213
    123213213
    бесконечно пока я не отпущу кнопку.
    Вот мне необходимо чтобы при долгом нажатии скажем более 5 секунд выполнялось мое действие.
    То есть можно как бы по периоду времени или по количеству пришедших сигналов,
    Но главное что бы был сброс времени или количества.

    Например по времени: если я нажал и держал 4 секунды отпустил и потом через какое то время нажал еще 1 секунду подержал то долгое нажатие не срабатывает. Только когда выдержаны целые 5 секунд без промежутков.

    То же самое пример: Долгое нажатие срабатывает только после того как пришло 8 сигналов 123213213, но есть ли пришло 7, я отпустил кнопку, подождал период и нажал снова как бы дослал еще 1 сигнал то долгое нажатие не срабатывает. Только когда пришло 8 сигналов без промежутков. То есть в определенный период.