Цикл for
- Войдите на сайт для отправки комментариев
Пнд, 08/01/2018 - 14:41
Всем привет. Подскажите, пожалуйста, почему при единичном нажатии на кнопку проходит полный цикл последовательного зажигания светодиодов с последующим последовательным выключением. Как сделать, что бы зажигались/гасли по одному при каждом нажатии?
#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();
}
}
#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(); } }или так, не очень понятно, что вам надо
#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(); } }я думал, в моем примере видно, что я хочу- при каждом нажатии кнопки загорается диод (предыдущий не гаснет), когда включены все - при следующих нажатиях на кнопку они поочередно выключаются. В принципе. в моем скетче это работает, только почему-то при единичном нажатии сначала все поочередно загораются, а потом поочередно выключаются. А мне нужно, что бы каждое отдельное нажатие выполняло одну операцию в итерации: нажал кнопку - включил диод, нажал еще раз - следующий включий (предыдущий не гаснет). Включил все - последующие нажатия выключают всю цепочку.
просто у меня работает так, вроде бы кнопка нажата постоянно.
если условие в строке 36 совпадет, то цикл for выполнит все , пока его условие не совпадет и прервать не возможно, делайте в цикле loop
именно, но когда кнопка отпущена, почему условие выполняется?
Ну начинал бы я так ;)
/**/ 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 байт. */Потому, что так написано в программе
Написать в программе, чтобы они зажигались/гасли по одному при каждом нажатии.
Программа, как я понимаю, цельнотянутая? И понимаешь ты что в ней написано, примерно какесли бы она была написана на языке древник инков?
Программа, как я понимаю, цельнотянутая? И понимаешь ты что в ней написано, примерно какесли бы она была написана на языке древник инков?
Лол:)) что там тянуть. Зачем писать, если не имеешь предложений. Нашел решение и без твоего тупорылого комментария. Добавил 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(); } }/**/ 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 байт. */вау, громоздко, но работает. спасибо.
#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(); } }