Цикл for

satway
Offline
Зарегистрирован: 06.12.2014

Всем привет. Подскажите, пожалуйста, почему при единичном нажатии на кнопку проходит полный цикл последовательного зажигания светодиодов с последующим последовательным выключением. Как сделать, что бы зажигались/гасли по одному при каждом нажатии?

#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
#define LED6 7
#define LED7 8
#define LED8 9
#define LED9 10
#define LED10 11
#define BUTTON1 A0

boolean buttonState1 = LOW;
unsigned long last_pressed = 0;


void setup()
{
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (LED5, OUTPUT);
  pinMode (LED6, OUTPUT);
  pinMode (LED7, OUTPUT);
  pinMode (LED8, OUTPUT);
  pinMode (LED9, OUTPUT);
  pinMode (LED10, OUTPUT);
  pinMode (BUTTON1, INPUT);
}

void loop()
{
  buttonState1 = digitalRead (BUTTON1);

  if (buttonState1 == HIGH && millis() - last_pressed > 200)
  {
    for ( int i = 2; i < 12  ; i++)
    {
      digitalWrite (i, HIGH);
      delay (200);
    }

    for (int i = 12; i > 1; i--)
    {
      digitalWrite (i, LOW);
      delay(200);
    }
    last_pressed = millis();
  }

}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015
#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
#define LED6 7
#define LED7 8
#define LED8 9
#define LED9 10
#define LED10 11
#define BUTTON1 A0

boolean buttonState1 = LOW;
unsigned long last_pressed = 0;

int numberLED = 2;

void setup()
{
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (LED5, OUTPUT);
  pinMode (LED6, OUTPUT);
  pinMode (LED7, OUTPUT);
  pinMode (LED8, OUTPUT);
  pinMode (LED9, OUTPUT);
  pinMode (LED10, OUTPUT);
  pinMode (BUTTON1, INPUT);
}

void loop()
{
  buttonState1 = digitalRead (BUTTON1);

  if (buttonState1 == HIGH && millis() - last_pressed > 200)
  {
   numberLED++; if (numberLED>11) numberLED=2;
   digitalWrite (numberLED, HIGH);
      delay(200);
   digitalWrite (numberLED, LOW);
      delay(200);
    
    last_pressed = millis();
  }

}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

или так, не очень понятно, что вам надо

#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
#define LED6 7
#define LED7 8
#define LED8 9
#define LED9 10
#define LED10 11
#define BUTTON1 A0

boolean buttonState1 = LOW;
unsigned long last_pressed = 0;


void setup()
{
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (LED5, OUTPUT);
  pinMode (LED6, OUTPUT);
  pinMode (LED7, OUTPUT);
  pinMode (LED8, OUTPUT);
  pinMode (LED9, OUTPUT);
  pinMode (LED10, OUTPUT);
  pinMode (BUTTON1, INPUT);
}

void loop()
{
  buttonState1 = digitalRead (BUTTON1);

  if (buttonState1 == HIGH && millis() - last_pressed > 200)
  {
    for ( int i = 2; i < 12  ; i++)
    {
      digitalWrite (i, HIGH);
      delay (200);
      digitalWrite (i, LOW);
      delay(200);
    }

   
    last_pressed = millis();
  }

}

 

satway
Offline
Зарегистрирован: 06.12.2014

я думал, в моем примере видно, что  я хочу- при каждом нажатии кнопки загорается диод (предыдущий не гаснет), когда включены все - при следующих нажатиях на кнопку они поочередно выключаются. В принципе. в моем скетче это работает, только почему-то при единичном нажатии сначала все поочередно загораются, а потом поочередно выключаются. А мне нужно, что бы каждое отдельное нажатие выполняло одну операцию в итерации: нажал кнопку - включил диод, нажал еще раз - следующий включий (предыдущий не гаснет). Включил все - последующие нажатия выключают всю цепочку. 

satway
Offline
Зарегистрирован: 06.12.2014

просто у меня работает так, вроде бы кнопка нажата постоянно. 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

если условие в строке 36 совпадет, то цикл for выполнит все , пока его условие не совпадет и прервать не возможно, делайте в цикле loop

satway
Offline
Зарегистрирован: 06.12.2014

именно, но когда кнопка отпущена, почему условие выполняется?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну начинал бы я так ;)

/**/
unsigned long mill; // переменная под millis()
//--------------------------------
// класс линейка светодиодов
class Cl_Leds {};
//--------------------------------
// класс кнопка
class Cl_Btn {};
//---Компоновка-----------------------------
Cl_Leds Leds;
Cl_Btn  Btn;
//---main-----------------------------
void setup() {
}

void loop() {
  mill = millis();
}
/*Скетч использует 482 байт (1%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 13 байт (0%) динамической памяти, оставляя 2035 байт для локальных переменных. Максимум: 2048 байт.
*/

Потом добавил это

/**/
unsigned long mill; // переменная под millis()
typedef void (*pDo)() ;// тип -функция обработчик
//--------------------------------
// класс линейка светодиодов
class Cl_Leds {
  protected:
  public:
    /*конструктор*/
    Cl_Leds() {}
    /*инициализация-вставить в setup()*/
    void init() {

    }
};
//------Cl_Btn----------------------
// класс кнопка
class Cl_Btn {
  protected:
    const byte pin;
    pDo Do;//обработчик
    bool bounce = 0;
    bool btn = 1, oldBtn;
    unsigned long past;
  public:
    /*конструктор*/
    Cl_Btn(byte pin_, pDo Do_): pin(pin_), Do(Do_) {}
    /*инициализация-вставить в setup()*/
    void init() {
      pinMode(pin, INPUT_PULLUP);
    }
    /*работа-вставить в loop()*/
    void run() {
      bool newBtn = digitalRead(pin);
      if (!bounce && newBtn != btn) {
        bounce = 1;
        past = mill;
      }
      if (bounce && mill - past >= 10) {
        bounce = 0 ;
        oldBtn = btn;
        btn = newBtn;
        if (!btn && oldBtn) Do();
      }
    }
};
//---Компоновка-----------------------------
Cl_Leds Leds;
void DoBtn1() {

}
Cl_Btn Btn1(/*пин*/A0,/*обработчик*/DoBtn1);
//---main-----------------------------
void setup() {
  Leds.init();
  Btn1.init();
}

void loop() {
  mill = millis();
  Btn1.run();
}
/*Скетч использует 1012 байт (3%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 23 байт (1%) динамической памяти, оставляя 2025 байт для локальных переменных. Максимум: 2048 байт.
*/

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

satway пишет:
почему при единичном нажатии на кнопку проходит полный цикл последовательного зажигания светодиодов с последующим последовательным выключением.

Потому, что так написано в программе

satway пишет:
Как сделать, что бы зажигались/гасли по одному при каждом нажатии?

Написать в программе, чтобы они зажигались/гасли по одному при каждом нажатии.

Программа, как я понимаю, цельнотянутая? И понимаешь ты что в ней написано, примерно какесли бы она была написана на языке древник инков?

 

satway
Offline
Зарегистрирован: 06.12.2014

Ворота пишет:

Программа, как я понимаю, цельнотянутая? И понимаешь ты что в ней написано, примерно какесли бы она была написана на языке древник инков?

Лол:)) что там тянуть. Зачем писать, если не имеешь предложений. Нашел решение и без твоего тупорылого комментария. Добавил 2 кнопку и сделал через if. Учись, а то так и будешь в комментах гадить.

#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
#define LED6 7
#define LED7 8
#define LED8 9
#define LED9 10
#define LED10 11
#define BUTTON1 A0
#define BUTTON2 A1

boolean buttonState1 = LOW;
boolean buttonState2 = LOW;
boolean ledState = LOW;
unsigned long last_pressed = 0;
byte ledCounter = 2;


void setup()
{
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (LED5, OUTPUT);
  pinMode (LED6, OUTPUT);
  pinMode (LED7, OUTPUT);
  pinMode (LED8, OUTPUT);
  pinMode (LED9, OUTPUT);
  pinMode (LED10, OUTPUT);
  pinMode (BUTTON1, INPUT);
  pinMode (BUTTON2, INPUT);
}

void loop()
{
  buttonState1 = digitalRead (BUTTON1);
  buttonState2 = digitalRead (BUTTON2);

  if (buttonState1 == HIGH && ledState == 0 && millis() - last_pressed > 200)
  {
    ledState = 1;
    digitalWrite (ledCounter, ledState);
    ledCounter++;
    last_pressed = millis();
  }

  if ((buttonState1 == LOW || buttonState2 == LOW) && ledState == 1)
  {
    ledState = 0 ;
  }


  if (buttonState2 == HIGH && ledState == 0 && millis() - last_pressed > 200)
  {
    ledState = 0;
    digitalWrite (ledCounter, ledState);
    ledCounter--;
    last_pressed = millis();
  }

}

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
unsigned long mill; // переменная под millis()
typedef void (*pDo)() ;// тип -функция обработчик
//--------------------------------
// класс линейка светодиодов
class Cl_Leds {
  protected:
    byte pin1, pin2, pin3, pin4, pin5,
         pin6, pin7, pin8, pin9, pin10;
    byte state; //0 выкл/ 1 вкл / 2 мигать
    /*установить в состояние*/
    void stand(byte state_) {
      if (state_ > 20)state = 0;
      else state = state_;
      switch (state) {
        case 0: // выкл все
          digitalWrite(pin1, LOW);
          digitalWrite(pin2, LOW);
          digitalWrite(pin3, LOW);
          digitalWrite(pin4, LOW);
          digitalWrite(pin5, LOW);
          digitalWrite(pin6, LOW);
          digitalWrite(pin7, LOW);
          digitalWrite(pin8, LOW);
          digitalWrite(pin9, LOW);
          digitalWrite(pin10, LOW);
          break;
        case 1:
          digitalWrite(pin1, HIGH);
          break;
        case 2:
          digitalWrite(pin2, HIGH);
          break;
        case 3:
          digitalWrite(pin3, HIGH);
          break;
        case 4:
          digitalWrite(pin4, HIGH);
          break;
        case 5:
          digitalWrite(pin5, HIGH);
          break;
        case 6:
          digitalWrite(pin6, HIGH);
          break;
        case 7:
          digitalWrite(pin7, HIGH);
          break;
        case 8:
          digitalWrite(pin8, HIGH);
          break;
        case 9:
          digitalWrite(pin9, HIGH);
          break;
        case 10:
          digitalWrite(pin10, HIGH);
          break;
        case 11:
          digitalWrite(pin1, LOW);
          break;
        case 12:
          digitalWrite(pin2, LOW);
          break;
        case 13:
          digitalWrite(pin3, LOW);
          break;
        case 14:
          digitalWrite(pin4, LOW);
          break;
        case 15:
          digitalWrite(pin5, LOW);
          break;
        case 16:
          digitalWrite(pin6, LOW);
          break;
        case 17:
          digitalWrite(pin7, LOW);
          break;
        case 18:
          digitalWrite(pin8, LOW);
          break;
        case 19:
          digitalWrite(pin9, LOW);
          break;
        case 20:
          digitalWrite(pin10, LOW);
          break;
      }
    }
  public:
    /*конструктор*/
    Cl_Leds(byte p1, byte p2, byte p3, byte p4, byte p5,
            byte p6, byte p7, byte p8, byte p9, byte p10)
      : pin1(p1), pin2(p2), pin3(p3), pin4(p4), pin5(p5),
        pin6(p6), pin7(p7), pin8(p8), pin9(p9), pin10(p10) {}
    /*инициализация-вставить в setup()*/
    void init() {
      pinMode (pin1, OUTPUT);
      pinMode (pin2, OUTPUT);
      pinMode (pin3, OUTPUT);
      pinMode (pin4, OUTPUT);
      pinMode (pin5, OUTPUT);
      pinMode (pin6, OUTPUT);
      pinMode (pin7, OUTPUT);
      pinMode (pin8, OUTPUT);
      pinMode (pin9, OUTPUT);
      pinMode (pin10, OUTPUT);
      stand(0);
    }
    /*перейти на след состояние*/
    void tick() {
      stand(state + 1);
    }
};
//------Cl_Btn----------------------
// класс кнопка
class Cl_Btn {
  protected:
    const byte pin;
    pDo Do;//обработчик
    bool bounce = 0;
    bool btn = 1, oldBtn;
    unsigned long past;
  public:
    /*конструктор*/
    Cl_Btn(byte pin_, pDo Do_): pin(pin_), Do(Do_) {}
    /*инициализация-вставить в setup()*/
    void init() {
      pinMode(pin, INPUT_PULLUP);
    }
    /*работа-вставить в loop()*/
    void run() {
      bool newBtn = digitalRead(pin);
      if (!bounce && newBtn != btn) {
        bounce = 1;
        past = mill;
      }
      if (bounce && mill - past >= 10) {
        bounce = 0 ;
        oldBtn = btn;
        btn = newBtn;
        if (!btn && oldBtn) Do();
      }
    }
};
//---Компоновка-----------------------------
Cl_Leds Leds(
  /*пин 1*/2,/*пин 2*/3,/*пин 3*/4,/*пин 4*/5,/*пин 5*/6,
  /*пин 6*/7,/*пин 7*/8,/*пин 8*/9,/*пин 9*/10,/*пин 10*/11
);
void DoBtn1() {
  Leds.tick() ;
}
Cl_Btn Btn1(/*пин*/A0,/*обработчик*/DoBtn1);
//---main-----------------------------
void setup() {
  Leds.init();
  Btn1.init();
}

void loop() {
  mill = millis();
  Btn1.run();
}
/*Скетч использует 1628 байт (5%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 34 байт (1%) динамической памяти, оставляя 2014 байт для локальных переменных. Максимум: 2048 байт.
*/

 

satway
Offline
Зарегистрирован: 06.12.2014

вау, громоздко, но работает. спасибо.

MaksVV
Offline
Зарегистрирован: 06.08.2015
#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
#define LED6 7
#define LED7 8
#define LED8 9
#define LED9 10
#define LED10 11
#define BUTTON1 A0

boolean buttonState1 = LOW;
unsigned long last_pressed = 0;

int numberLED = 2;
bool on = true;

void setup()
{
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (LED5, OUTPUT);
  pinMode (LED6, OUTPUT);
  pinMode (LED7, OUTPUT);
  pinMode (LED8, OUTPUT);
  pinMode (LED9, OUTPUT);
  pinMode (LED10, OUTPUT);
  pinMode (BUTTON1, INPUT);
}

void loop()
{
  buttonState1 = digitalRead (BUTTON1);

  if (buttonState1 == HIGH && millis() - last_pressed > 200)
  {
   
   if (on) {
    digitalWrite (numberLED, HIGH);
    numberLED++; if (numberLED==12) on=false;
    delay(200);}
   else {
   numberLED--; if (numberLED==2) on=true;
   digitalWrite (numberLED, LOW);
   delay(200);
   }
   
    
    last_pressed = millis();
  }

}