Аналоговая кнопка

Тема в разделе "Arduino & Shields", создана пользователем arduin, 22 мар 2017.

  1. arduin

    arduin Нерд

    Добрый день

    В цикле Loop крутится счетчик. Есть Аналоговая кнопка, при нажатии она отдает цифру 2
    const byte UP=2;
    когда она не нажата то отдает значение >= 900

    Как сделать, чтобы при первом нажатии была цифра 1
    При втором нажатии цифра 2,
    при этом если нажать и держать кнопку, цифра не менялась, до следующего нажатия.





    Код (C++):
     
     
    void counter_menu(int  counts)
     {
       button_key  = getKey();
       if(button_key==2)
       
       {
           if(lines ==5) { lines=1;}
           lines++;    
           delay(500);  
       }

     }

      }
     
  2. ostrov

    ostrov Гуру

    Аналоговая кнопка это как? Считывается АЦП что ли?

    А вообще такие задачи решаются триггером - некоей переменной которая сначала равна например 0, после первого считывания приравнивается к 1, исходя из ее состояния и делаются выводы какое действие предпринять. А для того чтобы не менялась при удержании вычислять сам факт нажатия, то есть переход от значения 900 к 2. При этом хорошо бы проверку состояния делать с определенным периодом, например 50 мс.
     
    arduin нравится это.
  3. arduin

    arduin Нерд


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

    Вот пример

    Код (C++):


     
    byte getKey()
    {
        int val_analog = 0;
        byte button_key = 0;
        val_analog = analogRead(keypadPin);

     
     
        if ( val_analog <= 30)  {  button_key = SELECT; }                  
        else if ( (val_analog >= 35)  &&  (val_analog <=60)    )   {  button_key = DOWN;}
        else if ( (val_analog >= 100) &&  (val_analog <= 150 ) )   {  button_key = UP;}
        else if ( (val_analog >= 200) &&  (val_analog <= 280)  )   { button_key = RIGHT;}
        else if ( (val_analog >= 580) &&  (val_analog <650)  )   { button_key = LEFT;}
        else if  (val_analog  >= 900)                         { button_key=NONE;}    //   По умолчанию если не нажали ни одной кнопки
        return button_key;
    }
     

    данные из условий передаются через функцию button_key = getKey();
    в виде цифр, которые имеют константы.
    Код (C++):
    // Global Variables
    const byte NONE_MENU= 0;  // не нажата ни одна кнопка выводим морду

    const byte LEFT=1;
    const byte RIGHT= 2;
    const byte UP=3;
    const byte DOWN=4;
    const byte SELECT=5;
     

    У нас имеется нажатая кнопка если значение не 0.
    Если выводится 0 кнопка не нажата.


    Вот теперь как то необходимо сделать функцию
    которая при нажатии кнопки 2 будет делать +1
    а при нажатии кнопки 4 будет делать минус-1.


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


    Код (C++):



    void counter_menu(int  counts){
     
         button_key  = getKey();
       if(button_key==2){
         if(lines ==5) { lines=0;}
          lines++;
          delay(300);  
           }



      if(button_key==4){            
      if(lines == 0) { lines=1;}
      lines--;  
     delay(300);  
       tft.setTextColor(RED);  tft.print(lines);
      }
     
  4. ostrov

    ostrov Гуру

    Кольцевой буфер глубиной 2 вполне достаточен для отслеживания факта нажатия кнопки.

    Да, и delay в функциях нежелателен, особенно такой длинный.

    В начало функции вставить проверку на интервал, если не пора - выходим, если пора читаем кнопку и сравниваем с тем что было в прошлый раз, если было 0 а стало 2 - вот оно нажатие! Далее согласно флажка, если 02 уже было, то игнор, если не было то реакция плюс вкл флажок.
     
    arduin нравится это.
  5. arduin

    arduin Нерд

    Спасибо буду пробовать реализовать.


    А не подскажете визуальную программу типа Proteus 8 Professional только чтоб без платы тестировать можно было, но при этом визуально управляемую.

    Видел FLprog но так и не понял есть ли смысл ее ставить.
     
  6. ostrov

    ostrov Гуру

    Симуляторами не пользуюсь, не доверяю я им. Особенно пиратским.
     
  7. Tim308

    Tim308 Нерд

    https://circuits.io
     
  8. arduin

    arduin Нерд

    Я нашел Virtual Breadboard но она платная зараза, хотя очень удобна
     
  9. arduin

    arduin Нерд

    Извините а что такое Кольцевой буфер глубиной 2
     
  10. Tim308

    Tim308 Нерд

    @arduin Это бесплатный сервис
     
  11. ostrov

    ostrov Гуру

    Две переменные в которые сквозным образом пропихиваются данные. Как в очереди. Например из 1 во 2, а в 1 извне. Получается такая цепочка: новые и предыдущие, которая постоянно обновляется. Условие для срабатывания должно быть в данном случае: старое 900, новое 2.
     
    arduin нравится это.