Задание такое,включить с 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); }
Первоначальный код был интереснее, то что сейчас вообще не компилируется. Если делать через цикл, то делайте до 8 включение, а потом отдельно два выключайте.
Вот так вот сделал Код (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){} }
второй цикл можно убрать и написать две строчки руками. Если нужно чтобы потухли одновременно, то delay не нужен. Если нет, то его можно использовать только 1 раз. Второй раз всё равно while(true) всё зациклит.
МНе надо объединить две программы кнопкой, как можно остановить вот программу выше без while(true),чтобы я мог кнопку нажать. ПОтому что с whille,пока не перезагрузишь,работать не будет
Не могу понять чем можно остановить горение светодиодов до нажатия кнопки,что бы замерло в том состоянии в котором есть Код (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); } } } }
Отдельная переменная отвечающая за пин текущего светодиода. Её увеличиваете и зажигаете соответствующий светодиод. И делать это не в цикле, а внутри метода loop
Не поняли скорее всего. Вот у меня зажглись 8 светодоидов,потом 2 потухли. И мне вот надо сохранить состояние это,когда горит 6 светодиодов. Кнопку нажал,пошло выполнение того,что идет после кнопки
чтобы делать однократное срабатывание чего-нибудь нужно завести переменную-флаг, которая будет меняться после выполнения нужного алгоритма, и потом по надобности сбрасываться обратно например кнопкой (чтобы запустить алгоритм снова). чтобы нормально прерывать процесс можно например вместо дилея использовать цикл с миллис, в котором постоянно следить за кнопкой но я таки тоже не понял что должно происходить - светодиоды просто должны однократно зажечься и погаснуть в нужном количестве, а потом по кнопке запуститься что-то другое? или однократный процесс зажигания диодов должен прерваться кнопкой? или он должен запуститься кнопкой? или и то и другое?
Нужно чтобы постепенно зажглись 8 светодиодов,потом 2 погасли,и 6 горели и замели в этом состоянии. Потом я нажал на кнопку(и выполняются зажигания светодиодов,но по другому алгоритму)
вот так например первый алгоритм запустится сам, затем после того как тыкнуть кнопку запустится второй. Код (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/программирование:конечный-автомат