Помехи на тактовой кнопке

Тема в разделе "Arduino & Shields", создана пользователем leo141198, 28 дек 2012.

  1. leo141198

    leo141198 Нерд

    Как исправить этот код, чтобы Arduino не реагировал на помехи?
    Код (Text):
    int val = 0;
    int led1 = 10;
    int led2 = 9;
    int led3 = 8;
     
    void setup()
    {
      pinMode(led1, OUTPUT);
      pinMode(led2, OUTPUT);
      pinMode(led3, OUTPUT);
    }
     
    void loop()
    {
      if (val == 0 && digitalRead(5) == HIGH)
        {
          val += 1;
          digitalWrite(led1, HIGH);
        }
      if (val == 1 && digitalRead(5) == HIGH)
        {
          val += 1;
          digitalWrite(led2, HIGH);
        }
      if (val == 2 && digitalRead(5) == HIGH)
        {
          val += 1;
          digitalWrite(led3, HIGH);
        }
      if (val == 3 && digitalRead(5) == HIGH)
        {
          val += 1;
          digitalWrite(led3, HIGH);
        }
      if (val == 4 && digitalRead(5) == HIGH)
        {
          val -= 4;
          digitalWrite(led3, LOW);
          digitalWrite(led1, HIGH);
          delay(1000);
          digitalWrite(led1, LOW);
          digitalWrite(led2, HIGH);  
          delay(1000);
          digitalWrite(led2, LOW);
          digitalWrite(led3, HIGH);  
          delay(1000);
        }
    }  
     
  2. leo141198

    leo141198 Нерд

    Оказалось, что код сам по себе не правильный. Подскажите, как исправить?
     
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    1. Прочитайте значение кнопки в переменную, не надо каждый раз ее опрашивать. Например, так:
    Код (Text):
    boolean buttonPressed = digitalRead(5) == HIGH;
    if(buttonPressed)
    {
      // реагируем
    }
    2. Воспользуйтесь библиотекой Bounce для подавления дребезга, там есть отличный пример.

    3. Вместо кучи условий используйте switch:
    Код (Text):
    switch(val)
    {
      case 0:
        break;
      case 1:
        break;
      ...
      default: // для всех остальных случаев
        break;
    }
     
    nailxx нравится это.