помогите со скетчем или направте

Тема в разделе "Arduino & Shields", создана пользователем Lagvin, 12 июл 2018.

  1. Lagvin

    Lagvin Нерд

    доброго времени. 3-й день ломаю голову и не могу написать скетч правильно.
    Имеется одна кнопка и три светодиода на разных пинах.
    Алгоритм: если нажал один раз 1-й светодиод
    двойное нажатие 2-й светодиод
    тройное нажатие 3-й светодиод
    Между нажатиями определил 200 миллисекунд ( как в мышке от компьютера)
    то есть за 600 миллисекунд нужно определить сколько было нажатий, я так понимаю.
    Использую millis, но ничего не получается, может можно где-то подсмотреть или наработка есть, помогите пожалуйста.
     
  2. Mitrandir

    Mitrandir Гуру

    Код (C++):
    #include <Bounce2.h>
    #define BUTTON_PIN 2
    #define TWO_CLK 200
    #define THREE_CLK 600
    // Создаем экземпляр объекта Bounce:
    Bounce debouncer = Bounce();

    long start = 0;
    long nclk = 0;

    void setup() {
      // Задаем кнопку со встроенным подтягивающим резистором:
      pinMode(BUTTON_PIN,INPUT_PULLUP);
      // Настроив кнопку, настраиваем экземпляр Bounce:
      debouncer.attach(BUTTON_PIN);
      debouncer.interval(5); // интервал в миллисекундах
    }

    void loop()
    {
      if( start >0 && ( (millis() - start)>THREE_CLK))
      {
          switch(nclk) {
               case 1:  Serial.println("1"); break;
               case 2: Serial.println("2");break;
               case 3: Serial.println("3");break;
               default: Serial.println("АЛАРМ! АЛАРМ! ВОЛК УНЕС ЗАЙЧАТ!!!"); break;
          }
          nclk = 0;
          start = 0;
      }

      debouncer.update();
      int value = debouncer.read();
      if(value && nclk <3){
           nclk++;
          start = millis();
       }
    }
     
  3. Lagvin

    Lagvin Нерд

    Спасибо огроооменное, вся ночь впереди, буду пробовать.
     
  4. Lagvin

    Lagvin Нерд

    Я извиняюсь, но либо я что-то неправильно делаю или код нерабочий, и на меге и уно пробовал - ничего.
     
  5. Mitrandir

    Mitrandir Гуру

    Совсем-совсем ничего?
    может где ошибся нет кнопки чтобы проверить
     
  6. Mitrandir

    Mitrandir Гуру

    Могу предположить, что я накосячил со чтением состояния кнопки...
     
  7. Mitrandir

    Mitrandir Гуру

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

    Mitrandir Гуру

    Код (C++):
    #include <Bounce2.h>
    #define BUTTON_PIN 2
    #define TWO_CLK 200
    #define THREE_CLK 600
    // Создаем экземпляр объекта Bounce:
    Bounce debouncer = Bounce();

    long start = 0; // время первого нажатия
    long nclk = 0;  //количество нажатий

    void setup() {
      // Задаем кнопку со встроенным подтягивающим резистором:
      pinMode(BUTTON_PIN,INPUT_PULLUP);
      // Настроив кнопку, настраиваем экземпляр Bounce:
      debouncer.attach(BUTTON_PIN);
      debouncer.interval(5); // интервал в миллисекундах
    }

    void loop()
    {
       //если было первое нажатие, и сейчас время позже чем интервал трех нажатий
      if( start >0 && ( (millis() - start)>THREE_CLK))
      {
         //делаем действо в зависимости от количества нажатий
          switch(nclk) {
               case 1:  Serial.println("1"); break;
               case 2: Serial.println("2");break;
               case 3: Serial.println("3");break;
               default: Serial.println("АЛАРМ! АЛАРМ! ВОЛК УНЕС ЗАЙЧАТ!!!"); break;
          }
          nclk = 0; //сбрасываем количество нажатий и время начала регистрации нажатий
          start = 0;
      }

      debouncer.update();
      int value = debouncer.read();// считали состояние кнопки с фильтрацией дребезга
     
      // кнопку придавили к земле(нажали) и количество нажатий меньше 3
      if(value==0 && nclk <3){
           nclk++; // увеличиваем количество нажатий
         if (start == 0) // если еще не установили время первого нажатия то установим
          {
             start = millis();
          }
       }
    }