Помогите с удержанием кнопки в клоченном состоянии

Тема в разделе "Arduino & Shields", создана пользователем Desert-Eagle, 3 янв 2022.

  1. Desert-Eagle

    Desert-Eagle Нуб

    Нужно что бы при нажатии включался зеленый круг и горел до следующего нажатия ( выключался )
    Перепробовал кучу всего толку ноль, delay да задерживаю выключение (
    Спасибо за помощь :)

    Вот Код:
    Код (C++):
    #include <RGBmatrixPanel.h>

    #define CLK   8
    #define OE    9
    #define LAT   10
    #define A     A0
    #define B     A1
    #define C     A2
    //#define D     A3

    RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);
    boolean butt_flag = 0;
    boolean butt;
    boolean led_flag = 1;
    unsigned long last_press;
                 

    void setup() {
    pinMode(12, INPUT);

      matrix.begin();
      int width = matrix.width();
      int height = matrix.height();

      Serial.begin(9600);
    }

    void loop() {

      //matrix.begin();
      int width = matrix.width();
      int height = matrix.height();


      // выводим текст из буфера на матрицу

      butt = digitalRead (12);
    if (butt== 0 && butt_flag == 1&& millis()- last_press +1 )
    {
      butt_flag = 0;
      Serial.println ("butt_ON");
    led_flag = !led_flag;
    digitalWrite(12, led_flag);

    matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 7, 0));

    delay(5000);
    }

    if (butt== 1 && butt_flag == 0)
    {
    butt_flag = 1;
    Serial.println ("butt_Off");
    matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 0, 0));
    }
    }
     
    Последнее редактирование модератором: 4 янв 2022
  2. Рокки1945

    Рокки1945 Гуру

    с таким кодом - без дребезга - купил сенсорную кнопку - там тригированное состояние выхода - то что надо
     
  3. Airbus

    Airbus Радиохулиган Модератор

    Ааааа!!!!!
    [​IMG]
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Вот же она?
     
  5. User248

    User248 Гик

    Нужен триггер. Попробуйте так, со своими доработками:
    Код (C++):
    #include <RGBmatrixPanel.h>

    RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

    bool state = false, on = false;

    void setup()
    {
      pinMode(12, INPUT);
    }

    void loop()
    {
      bool butt = digitalRead (12);

      // trigger
      if (butt == 1 && !on) {
        state = !state;
        on = true;
      }
      if (butt == 0) on = false;

      // your code
      if (state)
      {
        matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 7, 0));
      }
      else
      {
        matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 0, 0));
      }
    }
     
    Последнее редактирование: 4 янв 2022
  6. parovoZZ

    parovoZZ Гуру

    а самому написать? Не, не вариант?
     
  7. Airbus

    Airbus Радиохулиган Модератор

    Не—а. Цэ же думать надо
     
  8. parovoZZ

    parovoZZ Гуру

    у меня в детстве была магнитола RIGA 110. В ней были кнопки с фиксацией. Нажал кнопку - радиво включилось. Ещё раз нажал - радиво выключилось.
    Если уж так хочется дурину, то можно примотать сбоку синей изолентой.
     
    Airbus нравится это.
  9. Airbus

    Airbus Радиохулиган Модератор

    Дык яж в 4 посте дал ссылку?
     
  10. fps

    fps Нерд

    Так работать не будет. У вас не обрабатывается дребезг контактов. Как минимум нужна пауза после "state =!state;"
    А с вашим кодом при нажатии кнопки лампочка очень быстро незаметно для глаза моргнет много раз, а после отпускания кнопки её состояние будет случайным.
     
    Andrey12 нравится это.
  11. User248

    User248 Гик

    Да, я думал про это. Тогда лучше добавить задержку после триггера, потому что при отпускании тоже может дребезжать.
    Код (C++):
      // trigger
      if (butt == 1 && !on) {
        state = !state;
        on = true;
      }
      if (butt == 0) on = false;
      delay(50);
     
  12. mifar

    mifar Нерд

    Не будет там никаких морганий и случайных состояний. Все там будет нормально. Разве что кнопка раздолбанная в хлам или трясущимися руками два провода замыкать. Всегда так делаю без всяких делеев, дебоунсов() и т.п. И даже на макетке при замыкании проводками все нормально переключается. Но я еще во второе условие тоже добавляю проверку флага
    Код (C++):
    if (butt == 1 && !on) {
        state = !state;
        on = true;
      }
      if (butt == 0&& on) on = false;
     
  13. parovoZZ

    parovoZZ Гуру

    кнопку достаточно опрашивать раз в 100 мс. За это время все дребезги гарантированно закончатся. Между опросами тупо спать.
     
  14. User248

    User248 Гик

    Desert-Eagle, кстати, не забудьте подключить ко входу с кнопкой внешний подтягивающий резистор 10кОм на землю. Иначе на входе будет скакать то ноль, то единица.
    Или подключайте внутренний резистор pinMode(12, INPUT_PULLUP). Но он подтягивает к плюсу. Придётся кнопку замыкать на землю и код поправить соответственно.
    Код (C++):

    #include <RGBmatrixPanel.h>

    RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

    bool state = false, on = false;

    void setup()
    {
      pinMode(12, INPUT_PULLUP);
    }

    void loop()
    {
      bool butt = digitalRead (12);

      // trigger
      if (butt == 0 && !on) {
        state = !state;
        on = true;
      }
      if (butt == 1 && on) on = false;
      delay(50);

      // your code
      if (state)
      {
        matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 7, 0));
      }
      else
      {
        matrix.fillCircle(width / 4, height / 2, 7, matrix.Color333(0, 0, 0));
      }
    }
     
     
    Последнее редактирование: 5 янв 2022
  15. b707

    b707 Гуру

    а почему "придется"? - звучит так, как будто замыкать на GND - это что-то неправильное? :)
    Вообще-то это как раз более правильно, в проф оборудовании кнопки замыкают именно на GND
     
  16. parovoZZ

    parovoZZ Гуру

    В проф оборудовании кнопки замыкают и на 24 в. Так что по-всякому.