Бегущий огонек наоборот

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

  1. djololo

    djololo Нерд

    Задание такое,включить с 1 светодиода по 8( то есть,сначала 1,потом 1 и 2,потом 1,2 и 3 и т.д.),когда они зажгутся все,надо что бы с конца потухло 2 светодиода(10 и 9). И вот чтобы потухли два последних и потом чтобы все замерло. Что вставить в конце,чтобы вот прошли все команды,два потухли и все,дальше СТОП долджен быть
    Код (C++):

    #define FIRST_LED_PIN  3
    #define LAST_LED_PIN   10
    #define LED_PIN 9
    void setup()
    {
      for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
        pinMode(pin, OUTPUT);
       
    }

    void loop()
    {
      for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin){
      digitalWrite(pin, HIGH);
     delay(300);
        }
        for(int pin=LAST_LED_PIN; pin >=LED_PIN; --pin)
        {
          digitalWrite(pin,LOW);
          delay(300);
         
        }
     
     
    Последнее редактирование: 28 ноя 2017
  2. ORLENOK

    ORLENOK Гик

    Первоначальный код был интереснее, то что сейчас вообще не компилируется.
    Если делать через цикл, то делайте до 8 включение, а потом отдельно два выключайте.
     
  3. djololo

    djololo Нерд

    Вот так вот сделал
    Код (C++):
    #define FIRST_LED_PIN  3
    #define LAST_LED_PIN   10
    #define LED_PIN 9
    void setup()
    {
      for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
        pinMode(pin, OUTPUT);
       
    }
    void loop()
    {
      for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin){
      digitalWrite(pin, HIGH);
    delay(300);
        }
        for(int pin=LAST_LED_PIN; pin >=LED_PIN; --pin)
        {
          digitalWrite(pin,LOW);
          delay(300);
       
        }
        while(true){}
    }
     
  4. ORLENOK

    ORLENOK Гик

    второй цикл можно убрать и написать две строчки руками. Если нужно чтобы потухли одновременно, то delay не нужен. Если нет, то его можно использовать только 1 раз. Второй раз всё равно while(true) всё зациклит.
     
    djololo нравится это.
  5. djololo

    djololo Нерд

    МНе надо объединить две программы кнопкой, как можно остановить вот программу выше без while(true),чтобы я мог кнопку нажать. ПОтому что с whille,пока не перезагрузишь,работать не будет
     
  6. djololo

    djololo Нерд

    Не могу понять чем можно остановить горение светодиодов до нажатия кнопки,что бы замерло в том состоянии в котором есть
    Код (C++):
    #define BUTTON_PIN  11
    #define FIRST_LED_PIN  3
    #define TWO_LED_PIN 4
    #define LAST_LED_PIN   10
    #define LED_PIN 9
    boolean buttonWasUp = true;
    void setup()
    {
       pinMode(BUTTON_PIN, INPUT_PULLUP);
      for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
        pinMode(pin, OUTPUT);
       
    }
    void loop()
    {
        for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin){
      digitalWrite(pin, HIGH);
    delay(300);
        }
        for(
          int pin=LAST_LED_PIN; pin >=LED_PIN; --pin)
        {
          digitalWrite(pin,LOW);
          delay(300);
        }
       boolean buttonIsUp = digitalRead(BUTTON_PIN);
        if (buttonWasUp && !buttonIsUp) {
     
        delay(10);
         buttonIsUp = digitalRead(BUTTON_PIN);
          if (!buttonIsUp) {
               for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin){
      digitalWrite(pin, LOW);
    }
           
      for (int pin = LAST_LED_PIN; pin >= TWO_LED_PIN; --pin){
      digitalWrite(pin, HIGH);
    delay(300);

    }
    for (int pin=TWO_LED_PIN; pin <=LAST_LED_PIN; ++pin){
      digitalWrite(pin,LOW);
      delay(300);
    }
    for (int pin=LAST_LED_PIN; pin >=LED_PIN;--pin){
      digitalWrite(pin,HIGH);
      delay(300);
    }
          }
        }
    }
     
  7. ORLENOK

    ORLENOK Гик

    Отдельная переменная отвечающая за пин текущего светодиода. Её увеличиваете и зажигаете соответствующий светодиод. И делать это не в цикле, а внутри метода loop
     
    djololo нравится это.
  8. djololo

    djololo Нерд

    Не поняли скорее всего. Вот у меня зажглись 8 светодоидов,потом 2 потухли. И мне вот надо сохранить состояние это,когда горит 6 светодиодов. Кнопку нажал,пошло выполнение того,что идет после кнопки
     
  9. akl

    akl Гуру

    чтобы делать однократное срабатывание чего-нибудь нужно завести переменную-флаг, которая будет меняться после выполнения нужного алгоритма, и потом по надобности сбрасываться обратно например кнопкой (чтобы запустить алгоритм снова).

    чтобы нормально прерывать процесс можно например вместо дилея использовать цикл с миллис, в котором постоянно следить за кнопкой

    но я таки тоже не понял что должно происходить - светодиоды просто должны однократно зажечься и погаснуть в нужном количестве, а потом по кнопке запуститься что-то другое? или однократный процесс зажигания диодов должен прерваться кнопкой? или он должен запуститься кнопкой? или и то и другое?
     
  10. djololo

    djololo Нерд

    Нужно чтобы постепенно зажглись 8 светодиодов,потом 2 погасли,и 6 горели и замели в этом состоянии. Потом я нажал на кнопку(и выполняются зажигания светодиодов,но по другому алгоритму)
     
  11. akl

    akl Гуру

    вот так например первый алгоритм запустится сам, затем после того как тыкнуть кнопку запустится второй.

    Код (C++):
    #define FIRST_LED_PIN  3
    #define LAST_LED_PIN   10
    #define LED_PIN 9
    #define BUTTON_PIN 11
    int flag;   //флаг
    unsigned long timer;//время для задержки
    boolean button;
    void setup()
    {
        for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin){
            pinMode(pin, OUTPUT);
        }
        flag = 1; //флаг=1 чтобы первый алгоритм стартанул сам
     
    }
    void loop(){
        button = digitalRead(BUTTON_PIN); //проверяем кнопку
        if(button && flag==0){ //если флаг сброшен и кнопку нажали
            flag=2; // ставим флаг на запуск второго алгоритма
        }

        if(flag==1){ //если флаг 1 - запускаются циклы
             for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin){
                  digitalWrite(pin, HIGH);
                timer = millis(); //засекаем время для начала задержки
                 while(millis() - timer < 300){ // еще цикл вместо дилея, внутри можно проверять кнопку
                }  // например чтобы по кнопке прервать цикл
            }
            for(int pin=LAST_LED_PIN; pin >=LED_PIN; --pin){
                 digitalWrite(pin,LOW);
                timer = millis();
                 while(millis() - timer < 300){
                }

            }
            flag=0; //оба цикла прошли - ставим флаг в ноль чтобы не запустилось ничего
        }
     
        if(flag==2){ //если флаг 2
            //...срабатывает второй алгоритм
            flag=0; // флаг в 0 чтобы второй алгоритм тоже не зациклился
        }
    }
    по идее это конечный автомат и не более того http://wiki.amperka.ru/программирование:конечный-автомат
     
    djololo нравится это.
  12. djololo

    djololo Нерд

    СПасибо. Понял ваш донос. Сегодня попробую