Не загорается светодиод

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

  1. MNXALbI4

    MNXALbI4 Нуб

    Написал такую программку
    Код (Text):

    void setup() {
      int gre = 13;
      int yel = 11;
      int whi = 9;
      int red = 7;
      int bla = 5;
      int whi1 = 2;
      int gre1 = 4;
      int yel1 = 6;
      int red1 = 8;
      pinMode (gre, OUTPUT); pinMode (yel, OUTPUT); pinMode (whi, OUTPUT); pinMode (red, OUTPUT); pinMode (bla, OUTPUT); pinMode (gre1, OUTPUT); pinMode (yel1, OUTPUT); pinMode (whi1, OUTPUT); pinMode (red1, OUTPUT);
    Serial.begin (9600);
    }

    void loop() {
      int gre = 13;
      int yel = 11;
      int whi = 9;
      int red = 7;
      int bla = 5;
      int a, b = 0; //min, hour
      int whi1 = 2;
      int gre1 = 4;
      int yel1 = 6;
      int wait = 25;
      int red1 = 8;
    start:
      a = a + 1;
      if (a == 1)
      {
        Serial.println ("check1");
        digitalWrite (gre, HIGH);
        Serial.println ("check2");
        goto start;
         
      }
      else if (a == 2)
      {
        delay (1000);
        digitalWrite (yel, HIGH);
        goto start;
      } else if (a == 3)
      {
        delay (1000);
        digitalWrite (whi, HIGH);
        goto start;
      } else if (a == 4)
      {
        delay (1000);
        digitalWrite (red, HIGH);
        goto start;
      } else if (a == 5)
      {
        Serial.println (a);
        Serial.println (b);
        a=0;
        b = b + 1;
        delay (1000);
        digitalWrite (bla, HIGH);
      }
      delay (2000);
      pinMode (bla, LOW);
      delay(wait);
      pinMode (red, LOW);
      delay(wait);
      pinMode (whi, LOW);
      delay(wait);
      pinMode (yel, LOW);
      delay(wait);
      pinMode (gre, LOW);
       
      if (b == 1)
      {
       
        digitalWrite (yel1, HIGH);
        goto start;
      } else if (b == 2)
      {
       
        digitalWrite (gre1, HIGH);
        goto start;
      } else if (b == 3)
      {
       
        digitalWrite (whi1, HIGH);
        goto start;
      }
    }

     
    [​IMG]
    По идее должен последовательно загораться дальний ряд светодиодов, те гаснут, загорается один из трех, опять загораются те пять и опять загорается еще один из трех. НО первый раз с дальним рядом все ок, но когда загорается один из трех, те пять не начинают гореть снова, хотя переменная b, отвечающая за ближних увеличивается и a, когда доходит до 5 обнуляется и начинает заново. Даже в мониторе порта check 1 и 2 пишутся несколько раз, то есть по идее строка digitalWrite (gre, HIGH); должна работать несколько раз, но срабатывает всего один. Что не так?
     
  2. Mitrandir

    Mitrandir Гуру

    Логично когда а становится 5, оно сбрасывается на 0 и все начинается сначала.
     
  3. Mitrandir

    Mitrandir Гуру

    Избавьтесь от goto. Это зло...
     
  4. Mitrandir

    Mitrandir Гуру

    Вот это:
    Вынести в глобальную область.

    Снести все goto
     
  5. MNXALbI4

    MNXALbI4 Нуб

    ну вроде мне это и надо. Разве когда a становится 5, она становится 0 и мои if перестают работать?
    как?) Без goto не работает совсем:(
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    Нарисуйте логику включения/выключения на бумажке (не программный код!).
     
  7. b707

    b707 Гуру

    у вас в коде выключения диодов
    Код (C++):
    pinMode (bla, LOW);
      delay(wait);
      pinMode (red, LOW);
      delay(wait);
      pinMode (whi, LOW);
      delay(wait);
      pinMode (yel, LOW);
      delay(wait);
      pinMode (gre, LOW);
    используется. видимо по ошибке - функция pinMode, которая совсем не для этого :)
    Дальше, наверно, сами догадаетесь...
     
    Mitrandir и MNXALbI4 нравится это.
  8. Airbus

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

    Давайте разбираться.Что в Вашем случае делает goto?
     
  9. MNXALbI4

    MNXALbI4 Нуб

    ну да, конечно)
     
  10. MNXALbI4

    MNXALbI4 Нуб

    По задумке оно должно выкидывать из цикла if else, но без него не работает
     
  11. Airbus

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

    Э...там не надо специальных выходов оно и так будет крутиться в loop.Период "прокрутки" можно задать delay в конце loop.Если это надо.
     
  12. Mitrandir

    Mitrandir Гуру

    Переменные у него внутри лупа. Будут сбрасывать я. Надо их или статиками или глобальным сделать.
     
  13. fogary

    fogary Гик

    MNXALbI4
    Попробуй так:
    Код (C++):
    int leds_line1[5] = {13, 11, 9, 7, 5};
    int leds_line2[3] = {6, 4, 2};

    void setup() {
      Serial.begin (9600);

      for (int a = 0, a < 5, a++) {
        pinMode (leds_line1[a], OUTPUT);
        digitalWrite(leds_line1[a], LOW);
      }
      for (int b = 0, b < 3, b++) {
        pinMode (leds_line2[b], OUTPUT);
        digitalWrite(leds_line2[b], LOW);
      }
    }

    void loop() {
      for (int b = 0, b < 3, b++) {
        for (int a = 0, a < 5, a++) {
          digitalWrite(leds_line1[a], HIGH);
          if (a == 0) {
            Serial.println("check1");
            Serial.println("check2");
          }
          delay(1000);
        }

        Serial.println(a);
        Serial.println(b);
        delay(2000);

        while (a >= 0) {
          digitalWrite(leds_line1[a], LOW);
          delay(25);
          a--;
        }

        digitalWrite(leds_line2[b], HIGH);
      }

      delay(2000);

      while (b >= 0) {
        digitalWrite(leds_line2[b], LOW);
        delay(wait_off);
        b--;
      }
    }
    В конце добавил гашение 3-х светодиодов.
     
  14. b707

    b707 Гуру

    на самом деле пока можно оставить и goto. Автор приложил кучу усилий. чтобы нейтрализовать свои же собственные ошибки, вызванные незнаеим области видимости и принципов работы loop(). Если поправить описку с pinMode - думаю, что код заработает так, как хотел автор.
     
    MNXALbI4 и Mitrandir нравится это.